如果你的 JUnit 仍未入门,可以查阅 https://my.oschina.net/tridays/blog/815586 来学习。
assertThat
JUnit 4.4 起引入了匹配库 Hamcrest (org.hamcrest:hamcrest-core
) 的 Matcher 来进行逻辑判断,并能够输出更友好的提示。
import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.*;
// 判断字符串s是否包含"a"或包含"b"
// assertTrue(s.indexOf("a") > -1 || s.indexOf("b") > -1);
assertThat(s, anyOf(containsString("a"), containsString("b")));
最直观的变化是,以前的“谓、宾、主”写法,现在可以是“主、谓、宾”。
以前如果需要错误提示,需要人工提供:
assertTrue("Expected a substring 'a' or 'b'.",
s.indexOf("a") > -1 || s.indexOf("b") > -1);
使用 assertThat 后,输出类似于:
java.lang.AssertionError:
Expected: (a string containing "a" or a string containing "b")
got: "zzz"
注意,JUnit 依赖的 org.hamcrest:hamcrest-core
并不是 Hamcrest 的全部,你可以下载其他库,注意不要引入冲突。
可以通过实现 Matcher 接口,定制自己的匹配符,在这之前不妨先浏览一下 Hamcrest 提供了哪些,避免重复造轮子。
参数化测试
针对需要对多组数据重复逻辑进行测试的情况,JUnit 提供了 Parameterized
Runner。
import java.util.Arrays;
import java.util.Collection;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
@RunWith(Parameterized.class)
public class MyTestCase {
private int result;
private int param1;
private int param2;
/**
* 存放需要进行测试的数据集合
*/
@Parameters
@SuppressWarnings("rawtypes")
public static Collection prepareData() {
Object[][] data = {{5, 1, 4}, {-3, 1, -4}, {-5, -1, -4}};
return Arrays.asList(data);
}
/**
* 对变量进行初始化
*/
public MyTestCase(int result, int param1, int param2) {
this.result = result;
this.param1 = param1;
this.param2 = param2;
}
/**
* 这里的 Caculator 是被测试类
*/
@Test
public void testAdd() {
Calculator calc = new Calculator();
calc.add(param1, param2);
Assert.assertEquals(result, calc.getResult());
}
}
理论测试
JUnit 也提供了 Theories
Runner 以应对更复杂的情况。
import org.junit.experimental.theories.DataPoint;
import org.junit.experimental.theories.Theories;
import org.junit.experimental.theories.Theory;
import org.junit.runner.RunWith;
import org.junit.Test;
@RunWith(Theories.class)
public class MyTestCase {
// 使用 @DataPoint 指定测试数据集
@DataPoint
public static String A = "a";
@DataPoint
public static String B = "b";
@DataPoint
public static String C = "c";
// 使用 @Theory 指定被测函数
@Theory
public void testNames1(String a, String b) {
System.out.print(a + ":" + b);
}
}
以上测试样例输出:
a:a a:b a:c b:a b:b b:c c:a c:b c:c
被测函数将把数据集的全排列的每一组值做一次测试。