JUnit 4学习笔记(下)
JUnit 4 参数化测试
Junit 4 参数化测试 允许通过变化范围的参数值来测试方法。参数擦测试可以通过以下简单的步骤实现:
- 对测试类添加注解
@RunWith(Parameterized.class)
。 - 将需要使用变化范围参数值测试的参数定义为私有变量。
- 使用上一步骤声明的私有变量作为入参,创建构造函数。
- 创建一个使用
@Parameters
注解的公共静态方法,它将需要测试的各种变量值通过集合的形式返回。 - 使用定义的私有变量定义测试方法。
EvenNumberCheckerTest
类 对 EvenNumberChecker
类进行参数化测试:
import static org.junit.Assert.*;
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;
// Step 1 对测试类添加注解 @RunWith(Parameterized.class)
@RunWith(Parameterized.class)
public class EvenNumberCheckerTest {
// Step 2: 将需要使用变化范围参数值测试的参数定义为私有变量
private int inputNumber;
private boolean isEven;
// Step 3: 使用上一步骤声明的私有变量作为入参,创建构造函数
public EvenNumberCheckerTest(int inputNumber, boolean isEven) {
super();
this.inputNumber = inputNumber;
this.isEven = isEven;
}
// Step 4: 创建一个使用@Parameters注解的公共静态方法,它将需要测试的各种变量值通过集合的形式返回。
@Parameters
public static Collection<Object[]> data() {
Object[][] data = new Object[][]{
{2, true},
{5, false},
{10, true}
};
return Arrays.asList(data);
}
@Test
public void test() {
System.out.println("inputNumber: " + inputNumber + "; isEven: " + isEven);
EvenNumberChecker evenNumberChecker = new EvenNumberChecker();
// Step 5: 使用定义的私有变量定义测试方法
boolean actualResult = evenNumberChecker.isEven(inputNumber);
assertEquals(isEven, actualResult);
}
}
class EvenNumberChecker {
/**
* 校验输入的数字是否为偶数
*/
public boolean isEven(int i) {
if (i % 2 == 0) {
return true;
} else {
return false;
}
}
}
测试套件
JUnit 4 允许通过使用测试套件类批量运行测试类,为一套测试类创建一个测试套件,要为测试类添加注解:@RunWith(Suite.class)
,@SuiteClasses(TestClass1.class, TestClass2.class)
。
当运行时,所有包含在 @SuiteClasses
注解内的所有测试类都会被执行。
测试类1
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class GeometryTest {
@Test
public void testSquareArea() {
Geometry geometry = new Geometry();
int actualResult = geometry.squareArea(2);
int expectedResult = 4;
assertEquals(expectedResult, actualResult);
}
}
class Geometry {
public int squareArea(int length) {
return length * length;
}
}
测试类2
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class ArithmeticTest {
@Test
public void testAdd() {
Arithmetic arithmetic = new Arithmetic();
int actualResult = arithmetic.add(1, 2);
int expectedResult = 3;
assertEquals(expectedResult, actualResult);
}
}
class Arithmetic {
public int add(int i, int j) {
return i + j;
}
}
测试套件类
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
@RunWith(Suite.class)
@Suite.SuiteClasses({ArithmeticTest.class, GeometryTest.class})
public class AllTests {
}
超时测试
使用 @Timeout 注解
public class TimeoutTest {
// 测试结果会是失败
@Test(timeout = 200) // 毫秒
public void testTimeout() {
while (true);
}
}
测试类的所有方法应用 Timeout 规则
Timeout Rule 中设置的超时时间应用于整个测试过程,包括任何的 @Before
与 @After
方法。
public class TimeoutRuleTest {
/**
* Rule 应用该类所有方法
*/
@Rule
public Timeout timeout = new Timeout(1000); // 毫秒
/*
@Rule
public final TestRule globalTimeout = Timeout.millis(20); // 毫秒
@Rule
public final TestRule globalTimeout = Timeout.seconds(2); // 秒
*/
@Test
public void testTimeout1() {
while (true) ;
}
@Test
public void testTimeout2() {
while (true) ;
}
}
测试执行顺序
从4.1.1版本开始,JUnit 默认使用一种确定的、非不可预测的顺序来调用测试方法(MethodSorters.DEFAULT
)。如果想改变它,可以在测试类上加上 @FixMethodOrder
注解,并指定一种可用的 MethodSorters
。
有下面几种:
@FixMethodOrder(MethodSorters.JVM)
:使用Java虚拟机返回的顺序。可能导致每次执行的顺序不同。@FixMethodOrder(MethodSorters.NAME_ASCENDING)
:使用测试方法名的字典序。
参考
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 bin07280@qq.com
文章标题:JUnit 4学习笔记(下)
文章字数:876
本文作者:Bin
发布时间:2018-03-31, 21:41:33
最后更新:2019-08-06, 00:53:17
原始链接:http://coolview.github.io/2018/03/31/Java/JUnit%204%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%EF%BC%88%E4%B8%8B%EF%BC%89/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。