Junit4更新的版本很多,现在已经更新到4.7了。发生的变化也相当的明显,为了更好的使用测试,有必要去学习一下其新的功能。
总的来说,其变化还是比较多的,下面列举一些改变之处:
1. 测试由原来的命名模式改变注解,即testXXX变为@Test。其中@Test还提供了额外的属性。如expected,表示期望抛出的异常,用法如下:
由于上面得到期望抛出的异常,所以测试通过。
2. 数组比较改用Assert.assertArrayEquals
3. 套件测试也用注解替换,如下如示:
4. 通过@Ignore,可以忽略某个方法或整个类的测试
5. 增加了新特性-理论机制(Theory),这个特性听起来很迷惑人,作用是使得开发人员从开始的定义测试用例的阶段就可以通过参数集(理论上是无限个参数)对代码行为进行概括性的总结.开发人员都知道他们代码所想要实现的概括性的总的目的,理论使得他们只需要在一个地方就可以快速的指定这些目的,而不要将这些目的翻译成大量的独立的测试用例。用法如下所示:
输出为:
[quote]
name=theories password=theories
name=theories password=2009
name=2009 password=theories
name=2009 password=2009
[/quote]
也就是说,方法的参数与定义的字段会把所有的组合情况全部考虑进去,虽然用到此特性的地方不多,但有时的确很有用。这样也不用逐个写断言语句,把测试数据集中在一个地方,方便管理。
6. 提供了新的特性-假设机制(Assumption).此特性使用了Hamcrest库的类.本来Hamcrest是一个单独的测试组件,Junit也集成了一部分,但是并没有完全包含。建议使用junit独立的JAR文件,再单独引入hamcrest包。
其实hamcrest的功能相当的强大,理解起来也非常的容易,是一个很不错的组件。不过好像并没发现其参考文档。它提供assertThat,assumeThat,assumeNotNull等假设语句,也提供is,not,both..and,either..or等用法,非常的灵活。如:
其中assumeXXX的目的为,假设此条件成立,才执行后面的语句,否则跳出些测试方法,继续执行其它的测试。如:
7. @Before,@After,@BeforeClass,@AfterClass.这几个注解一看便知大概,@Before表示每个测试方法执行前执行一次,而@BeforeClass表示整个类测试前执行一次。不过需要注意的是,@BeforeClass,@AtferClass注解的方法必须是静态的。
8. Junit提供了新的核心运行类MaxCore,相对于以前的JunitCore运行机制,这个类有一系列的优点,如从未测试过的方法优先测试,剩下的测试中,以前测试失败的方法优先测试,再其次,运行快的优先于运行慢的方法。用法如官方例子如示:
当然这个替代也是相对的,有时候还是可以继续用JUnitCore,MaxCore只是在JUnitCore基础上增加优先测试之类的规则,但是有些功能还是需要用JUnitCore。比如说,如果想在eclipse中不通过junit插件来运行单元测试,就需要JUnitCore:
当然这种方式针对的是类,不能限制到方法上,如果有多个类,只需要用空格把类隔开即可。
上面基本包含了Junit4.6之前的新特性,至于以后的新特性,会花专门的篇幅来讲解。
总的来说,其变化还是比较多的,下面列举一些改变之处:
1. 测试由原来的命名模式改变注解,即testXXX变为@Test。其中@Test还提供了额外的属性。如expected,表示期望抛出的异常,用法如下:
@Test(expected = NullPointerException.class)
public void unsupportedDBCheck() {
throw new NullPointerException();
}
由于上面得到期望抛出的异常,所以测试通过。
2. 数组比较改用Assert.assertArrayEquals
3. 套件测试也用注解替换,如下如示:
@RunWith(Suite.class)
@SuiteClasses({
Hello.class,
TheoryTest.class
})
public class SuiteClassesTest {
}
4. 通过@Ignore,可以忽略某个方法或整个类的测试
5. 增加了新特性-理论机制(Theory),这个特性听起来很迷惑人,作用是使得开发人员从开始的定义测试用例的阶段就可以通过参数集(理论上是无限个参数)对代码行为进行概括性的总结.开发人员都知道他们代码所想要实现的概括性的总的目的,理论使得他们只需要在一个地方就可以快速的指定这些目的,而不要将这些目的翻译成大量的独立的测试用例。用法如下所示:
@RunWith(Theories.class)
public class TheoryTest {
@DataPoint public static String name ="theories";
@DataPoint public static String password = "2009";
@Theory
public void outNameAndPassword(String name,String password){
System.out.println("name="+name+" password="+password);
}
}
输出为:
[quote]
name=theories password=theories
name=theories password=2009
name=2009 password=theories
name=2009 password=2009
[/quote]
也就是说,方法的参数与定义的字段会把所有的组合情况全部考虑进去,虽然用到此特性的地方不多,但有时的确很有用。这样也不用逐个写断言语句,把测试数据集中在一个地方,方便管理。
6. 提供了新的特性-假设机制(Assumption).此特性使用了Hamcrest库的类.本来Hamcrest是一个单独的测试组件,Junit也集成了一部分,但是并没有完全包含。建议使用junit独立的JAR文件,再单独引入hamcrest包。
其实hamcrest的功能相当的强大,理解起来也非常的容易,是一个很不错的组件。不过好像并没发现其参考文档。它提供assertThat,assumeThat,assumeNotNull等假设语句,也提供is,not,both..and,either..or等用法,非常的灵活。如:
//断言"yy"不等于"xx"
assertThat("yy", is(not("xx")));
//abcdefg包含adcd或fsd
assertThat("abcdefg",anyOf(containsString("abcd"),containsString("fsd")));
其中assumeXXX的目的为,假设此条件成立,才执行后面的语句,否则跳出些测试方法,继续执行其它的测试。如:
//如果此假设语句不成立,则不会打印出this is assume
Assume.assumeThat(4,both(lessThanOrEqualTo(6)).and(greaterThan(3)));
System.out.println("this is assume");
7. @Before,@After,@BeforeClass,@AfterClass.这几个注解一看便知大概,@Before表示每个测试方法执行前执行一次,而@BeforeClass表示整个类测试前执行一次。不过需要注意的是,@BeforeClass,@AtferClass注解的方法必须是静态的。
8. Junit提供了新的核心运行类MaxCore,相对于以前的JunitCore运行机制,这个类有一系列的优点,如从未测试过的方法优先测试,剩下的测试中,以前测试失败的方法优先测试,再其次,运行快的优先于运行慢的方法。用法如官方例子如示:
public static class TwoUnEqualTests {
@Test
public void slow() throws InterruptedException {
Thread.sleep(100);
fail();
}
@Test
public void fast() {
fail();
}
}
@Test
public void rememberOldRuns() {
File maxFile = new File("history.max");
MaxCore firstMax = MaxCore.storedLocally(maxFile);
firstMax.run(TwoUnEqualTests.class);
MaxCore useHistory= MaxCore.storedLocally(maxFile);
List<Failure> failures= useHistory.run(TwoUnEqualTests.class)
.getFailures();
assertEquals("fast", failures.get(0).getDescription().getMethodName());
assertEquals("slow", failures.get(1).getDescription().getMethodName());
}
当然这个替代也是相对的,有时候还是可以继续用JUnitCore,MaxCore只是在JUnitCore基础上增加优先测试之类的规则,但是有些功能还是需要用JUnitCore。比如说,如果想在eclipse中不通过junit插件来运行单元测试,就需要JUnitCore:
public class ObjectToClassTest {
@Test
public void ObjectTest(){
int[] a={1,2};
int[] b={1,2};
Assert.assertArrayEquals(a,b);
}
public static void main(String[] args){
JUnitCore.main("com.junit.ObjectToClassTest");
}
}
当然这种方式针对的是类,不能限制到方法上,如果有多个类,只需要用空格把类隔开即可。
上面基本包含了Junit4.6之前的新特性,至于以后的新特性,会花专门的篇幅来讲解。