目录
3.2@Before,@BeforeClass,@After,@AfterClass
3.4异常测试(@Test(expected=*.class))
3.6测试套件(@RunWith,@SuitClasses)
3.7参数化测试(@RunWith(Parameterized.claa),@Parameters)
1.软件及环境
软件:IDEA
环境:JDK1.8,Junit 4.13
2.环境配置
这里我们采用IDEA编辑器,利用Maven对项目进行构建,如下:
然后项目构建完之后,首先第一步是进入pom文件,添加Junit4.13依赖,然后第二步是在test->java路径下创建测试类(在这里我创的是MyTest)
pom.xml文件添加依赖:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
</dependencies>
3.常用注解
JUnit4常用注解有:
注解 | 描述 |
@Test | 标注于方法之上,表示该方法是一个测试方法 |
@Test(timeout=xxx) | 约束测试方法运行的最长时间,超时则测试失败 |
@Test(expected=*.class) | 用于对方法内部抛出的异常进行验证 |
@Before | 在每个测试用例之前执行某些语句,例如,初始化数据等 |
@After | 在每个测试用例之后执行某些语句,例如,重置变量、删除临时文件、变量等 |
@BeforeClass | 在当前测试类的所有测试用例之前执行某些语句,例如,建立连接 |
@AfterClass | 在当前测试类的所有测试用例之后执行某些语句,例如,执行所有测试用例后释放资源 |
@Ignore | 执行时忽略(跳过)测试方法 |
@Runwith | 放在测试类名之前,用来确定该类的运行方式,也可以不标注,如不标注则会使用默认运行器 |
@SuiteClasses | 用于在套件测试中标识运行的测试类 |
@Parameters | 用于参数化测试 |
3.1@Test
@Test 注解用于将一个普通的方法修饰成一个测试方法,每个被 @Test 注解标记的 public void 方法都会被 JUnit 框架当作测试方法来执行。
3.2@Before,@BeforeClass,@After,@AfterClass
@ Before 注解表示该方法必须在类中的每个测试方法之前执行,一般用于初始化数据。如果要在每个测试用例之前执行一些语句,可以使用此注解。
使用 @After 注解修饰的方法会在执行每个测试方法后执行,一般用于在每个测试方法后重置某些变量、删除临时变量等。
@BeforeClass 注解修饰的方法会在类的所有测试方法执行之前执行一次。一般可用于初始化一些共享的配置方法(例如,连接到数据库)。
当需要在执行完类的所有测试方法之后执行某些操作(例如,断开数据库连接),可使用 @AfterClass 注解来修饰。
3.3超时测试(@Test(timeout=xxx))
这里我们设置1秒,代码里进行线程等待1.5s,可以看到会出现报错信息
3.4异常测试(@Test(expected=*.class))
这边我们对除法进行测试,我们都知道除数不能为0。
可以看到出现异常:ArithmeticException,因此我们在测试中对该异常进行测试:
3.5忽略测试(@Ignore)
在单元测试过程中有时候会出现需要临时跳过部分测试类或测试方法的情况,比如,部分测试类或测试方法还未编写完成。JUnit 4 中提供的 @Ignore 注解可以帮助我们在执行单元测试时忽略不需要执行的测试类或方法,当需要暂时不执行特定的测试类或测试方法时可以使用 @Ignore 注解。
3.6测试套件(@RunWith,@SuitClasses)
一次都只执行一个测试类,但在实际的单元测试项目中测试类往往非常多,一个一个地执行显然不太现实。JUnit 提供的测试套件 ( Test Suite ) 可以将多个测试类组织在一起,批量运行多个测试类。
ClassAtest类
import org.junit.Test;
public class ClassATest {
@Test
public void testA_1() {
System.out.println("这是测试类 ClassATest中的测试方法testA_1");
}
@Test
public void testA_2() {
System.out.println("这是测试类 ClassATest中的测试方法testA_2");
}
}
ClassBtest类
import org.junit.Test;
public class ClassBTest {
@Test
public void testB_1() {
System.out.println("这是测试类 ClassBTest中的测试方法testB_1");
}
@Test
public void testB_2() {
System.out.println("这是测试类 ClassBTest中的测试方法testB_2");
}
@Test
public void testB_3() {
System.out.println("这是测试类 ClassBTest中的测试方法testB_3");
}
}
这里我们利用一个类,同时对ClassATest和ClassBTest里面的测试方法进行测试,如:我们这里利用AllTests类
AllTests类
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
@RunWith(Suite.class)
@Suite.SuiteClasses({ ClassATest.class, ClassBTest.class })
public class AllTests {
}
结果显示
3.7参数化测试(@RunWith(Parameterized.claa),@Parameters)
使用 Junit 执行单元测试用例时经常会遇到操作步骤相同、输入数据不同的一组测试用例,遇到这种情况,我们可以使用一个 Junit 测试方法执行一个测试用例的方式来执行。但是,使用这种方式需要耗费更多的时间编写测试代码,且测试代码冗余严重,比较难维护,如果一个操作步骤改变,会需要修改很多代码。JUnit 4 中新引入的参数化方法可以对操作步骤相同的测试用例集进行参数化,从而大大提高编写测试用例的效率,提高用例的可维护性。
将以计算 10 以内整数阶乘的类 Factorial 为例介绍 JUnit 4.10 中参数化的具体方法,待测试代码如下:
public class Factorial {
public int getFactorial(Integer num) {
int result = 0;
if ( num >= 1 && num <= 10 ){
result = 1;
int i = 1;
while ( i <= num ){
result = result * i;
i++;
}
}
return result;
}
}
测试类代码如下:
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import java.util.Arrays;
import java.util.Collection;
//指定使用参数化运行器来运行
@RunWith(Parameterized.class)
public class FactorialTest {
private int expected; //测试用例的预期结果
private int inputData; //测试用例的输入数据
private Factorial factorial = null;
//在该测试类的每一个测试方法执行前实例化被测试类
@Before
public void setUp() {
factorial = new Factorial();
}
//测试用例数据集
@Parameterized.Parameters
public static Collection<Object[]> testData() {
Object[][] obj = {{0, 0},
{1, 1},
{2, 2},
{120, 5},
{362880, 9},
{3628800, 10},
{0, 11}};
return Arrays.asList(obj);
}
//构造方法
public FactorialTest(int expected, int inputData) {
this.expected = expected;
this.inputData = inputData;
}
//测试方法
@Test
public void testGetFactorial() {
System.out.println("expceted = " + this.expected);
System.out.println("getData = " + factorial.getFactorial(this.inputData));
}
}
结果可以看到,期望值与实际值是相同的,且进行批量测试。
4.常用断言
断言 | 描述 |
assertEquals | 断言两个值是否相等 |
assertTrue | 断言一个条件是否为真 |
assertFalse | 断言一个条件是否为假 |
assertNull | 断言一个对象是否为 null |
assertNotNull | 断言一个对象是否不为 null |
assertSame | 断言两个对象是否引用了相同的对象 |
assertNotSame | 断言两个对象是否未引用同一个对象 |
assertArrayEquals | 断言预期数组和结果数组是否相等 |