当你执行后会发现只有Alpha.a()和Beta.a()执行到,Alpha.b()被@ExcludeCategory掉了。
MaxCore: 失败优先
当需要反复测试大量testcase的时候,你往往比较关注那些前一次失败的case。这个时候你可以利用MaxCore特性在每次执行testcase的时候优先执行那些上次失败的case。
例如:
/**
* @author 卢声远<michaellufhl@yahoo.com.cn>
*/
public class MaxCoreTest {
private MaxCore fMax;
@Before
public void createMax() {
File fMaxFile= new File("MaxCore.ser");
fMax= MaxCore.storedLocally(fMaxFile);
}
@Test
public void test(){
Request request= Request.aClass(Delta.class);
fMax.run(request);
fMax.run(request);//b->c->a
}
public static class Delta{
@Test public void a(){}
@Test public void b(){
Assert.fail();
}
@Test public void c(){}
}
}
可以观察到第2次执行的时候Delta.b()由于第1次的失败而提前到了先执行。
DataPoint: 参数数据
当需要测试不同输入参数的时候是不是要写一大堆testcase?不需要,因为JUnit4提供了参数化测试数据的特性。例如你想要测试2个整型数据作为输入参数的时候:
/**
* @author 卢声远<michaellufhl@yahoo.com.cn>
*/
@RunWith(Theories.class)
public class DataPointTest {
@DataPoint
public static int ONE= 1;
@DataPoint
public static int TWO= 2;
/* You could also use @DataPoints instead of @DataPoint
@DataPoints
public static int[] points= { 1, 2 };*/
@Theory
public void test(int first, int second) {
}
}
通过观察test()被执行了4次,每次不同的组合作为参数输入。而且如果参数数目过多,你可以通过@DataPoints一下子把参数都设进去。用过@RunWith(Parameterized.class)的朋友可以和DataPoint做一下比较。
TestedOn
这个功能也是参数化数据,只不过它是直接在参数上配置。例如:
@Theory
public void test2(@TestedOn(ints={1,2})int first) {
System.out.println(first);
}
结果打印出来"1,2"。
PrintableResult: 打印结果
这个我认为倒是一个小功能,它只是把测试失败的结果以比较美观的格式打出来。例如:
Result result = JUnitCore.runClasses(SomeTest.class);
System.out.println(new PrintableResult(result.getFailures()));