说明
jUnit是java常用的一个测试框架,用好了可以很好地提高工作效率,规范工作流程。
本篇基于慕课网上一个jUnit免费在线教程总结一下自己的学习心得,整理了一下知识点。本篇主要介绍AssertEqual (断言判断)、jUnit 常用注解、jUnit套件(批量执行测试用例)、jUnit 参数化设置(多组数据同时测试).
参考资料:
jUnit官网: http://junit.org/junit4/
慕课网资源: http://www.imooc.com/video/6842
jUnit环境
- JDK 环境
- jUnit jar包 (eclipse 里自带有,可以直接在项目 Properties -> Java Build Path -> Libraries -> Add Library -> [ jUnit ] 来添加; 也可自己下载jar包导入)
jUnit HelloWorld
1. 创建基础类
新建一个 Calculate.java
类,里面建立两个方法,一个加法,一个除法。
package com.daniel.util;
public class Calculate {
public int add(int a,int b) {
return a+b;
}
public int divide(int a,int b) {
return a/b;
}
}
2. 创建junit test case 类
在Calculate.java
上右键,New 一个 junit test case :
首先会让你选择创建的方法块,这里可以暂时先不管,后面讲解。直接Next:
这里可以选择需要创建测试的方法,而不用再自己手敲测试方法的声明:
3. 编写测试方法
下面的代码分别使用 2和3 测试加法结果是否 等于5 、使用 6 和 3 测试除法结果是否为 2;
package com.daniel.util;
import static org.junit.Assert.*;
import org.junit.Test;
public class CalculateTest {
@Test
public void testAdd() {
assertEquals(5, new Calculate().add(2, 3));
}
@Test
public void testDivide() {
assertEquals(2, new Calculate().divide(6, 3));
}
}
4. 执行测试用例
直接将 CalculateTest.java
run as junit Test即可,会显示执行结果与执行时间。
解释一下上面的测试用例中各部分的含义:
Runs : 2/2
共有2个测试方法,执行了2个;
Errors: 0
没有代码异常错误;
Failures:0
没有测试失败的,即计算结果均与预期一致;
绿色长条: 表示所有测试都通过了。(如果失败会是红色);
最下面是都执行了哪些测试类和方法,都用时多久。(由于我们的测试用例只是简单的算术运算,时间小于1ms,所以只看到0)
5. Failures 与 Errors 的区别
上一节中的测试结果中,Failures 与 Errors是不同的两部分:
Failures:测试失败,即程序计算结果与预期结果不符,Assert失败,比如 2+3 预期值 填为 6。
Errors:测试错误,一般是代码错误导致,与Assert无关,比如除法运算计算 6/0 则属于 Error ,因为会抛出 算术异常。
6. 备注
创建测试用例注意事项:
- 测试方法必须用
@Test
进行修饰; - 测试方法必须使用 public void 修饰,不能带任何参数;
- 每个测试方法必须可以独立运行,各个测试方法之间不能有依赖;
为了规范代码,建议做到以下几点:
- 为测试代码建立独立的源代码包,且命名与被测试类的包命名保持一致(如 src/A/B 与 test/A/B);
- 测试用例的类名以
XXXTest.java
命令,测试类中的方法以testXXX()
命名。
测试用例注解
@BeforeClass 与 @AfterClass
@BeforeClass : 使用 @BeforeClass
修饰的方法,会在测试用例加载前执行且只执行一次 ,一般用于加载配置文件、建立数据库连接等只需要执行一次的初始化设置。
@AfterClass : 使用 @AfterClass
修饰的方法,会在测试用例完成后执行且只执行一次 ,一般用于释放资源、销毁临时对象等只需要执行一次的初始化设置。
@Before 与 @After
@Before : 使用 @Before
修饰的方法,会在测试用例中的每个测试方法执行前执行一次 。
@After : 使用 @After
修饰的方法,会在测试用例中的每个测试方法执行后执行一次 。
@Ignore
@Ignore : 使用 @Ignore
修饰的方法,会被编译器忽略,该测试方法内的内容不会被执行 。
测试用例注解范例
通过执行下述代码的测试用例来感受一下上述几个注解:
package com.daniel.util;
import static org.junit.Assert.*;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
public class CalculateTest {
@BeforeClass
public static void setUpBeforeClass() throws Exception {
System.out.println(" @BeforeClass");
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
System.out.println("@AfterClass ");
}
@Before
public void setUp() throws Exception {
System.out.println("@Before ");
}
@After
public void tearDown() throws Exception {
System.out.println("@After ");
}
@Ignore(" test the ignore 。。。")
public void testIgnore(){
System.out.println("testIgnore");
}
@Test
public void testAdd() {
System.out.println("testAdd");
assertEquals(5, new Calculate().add(2, 3));
}
@Test
public void testDivide() {
System.out.println("testDivide");
assertEquals(2, new Calculate().divide(6, 3));
}
}
执行结果如下:
jUnit Suite套件(批量执行测试用例)
Suite实例
当我们有多个待测试类的时候,并且希望一起执行的时候,就要用到Suite了。为了方便演示,我们定义三个测试类 Task1Test,Task2Test,Task3Test
,里面都编写一个输出起类名的测试方法。
- 基础测试类 (Task2Test,Task3Test 类似)
package com.daniel.util;
import org.junit.Test;
public class Task1Test {
@Test
public void test() {
System.out.println(this.getClass().getName());
}
}
- Suite类
package com.daniel.util;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
/* 更改默认的测试运行器为 Suite*/
@RunWith(Suite.class)
/* 使用 Suite 执行 Task1Test.class,Task2Test.class,Task3Test.class*/
@Suite.SuiteClasses({Task1Test.class,Task2Test.class,Task3Test.class})
/* 类里面保留为空 */
public class SuiteTest {
}
执行结果
jUnit 参数化设置Parameterized(多组数据同时测试)
Parameterized 实例
有些情况可能一组数据并不能达到我们的测试目的,例如我们需要进行多组数据同事测试,更常见是边界值测试,如果我们希望不同组数据执行相同的测试方法,则可考虑参数化设置。
下面演示一下对 几组数据执行加法的测试。
package com.daniel.util;
import static org.junit.Assert.assertEquals;
import java.util.Arrays;
import java.util.Collection;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
// 1.更改默认的测试运行器为RunWith(Parameterized.class)
@RunWith(Parameterized.class)
public class ParameterTest {
// 2.声明变量来存放预期值 和 输入值
int expected =0;
int input1 = 0;
int input2 = 0;
// 3.声明一个返回值 为Collection的公共静态方法,并使用@Parameters进行修饰
@Parameters
public static Collection<Object[]> t() {
return Arrays.asList(new Object[][]{
{5,2,3},
{1,-1,2},
{0,0,0}
}) ;
}
// 4.为测试类声明一个带有参数的公共构造函数,并在其中为之声明变量赋值
public ParameterTest(int expected,int input1,int input2) {
this.expected = expected;
this.input1 = input1;
this.input2 = input2;
}
@Test
public void testAdd() {
assertEquals(expected, new Calculate().add(input1, input2));
}
}