JUnit 4 的一些新功能

发表于:2008-06-24来源:作者:点击数: 标签:junitJunitJUnit功能
包结构的变化 在 junit 4中开始使用这样的包结构:org.junit.* ,而不再像以前使用这样的包结构:junit.framework.*,但是为了向后兼容,在Junit4中将会让这两种包结构并存 继承上的变化 你的测试类再也不需要extends这个类junit.framework. TestCase 了,而

包结构的变化

         在junit4中开始使用这样的包结构:org.junit.* ,而不再像以前使用这样的包结构:junit.framework.*,但是为了向后兼容,在Junit4中将会让这两种包结构并存

继承上的变化

        你的测试类再也不需要extends这个类junit.framework.TestCase了,而且不用显示的继承任何一个类,Junit通过采用JDK 5.0的annotations特性来完成了这种转变。如果想要执行一个test case,只需要在你的测试类中至少包含一个这样的annotation就可以了@Test。
        打个比方,如果你写了这样的一个类,里面只包含了@Before 和 @After这样的annotation,却没有包含任何的@Test,那么在你开始运行这个测试类的时候,你会碰到一个java的异常:java.lang.Exception: No runnable methods.

断言方法的变化

         因为在Junit 4中,测试类不再继承TestCase(在这个类里JUnit 3.8版本中定义了assertEquals()等方法),所以你需要使用一个前缀的语法就像这样:Assert.assertEquals(),或者用JDK 5.0中的静态导入,来导入Assert,之后,你就可以像之前那样使用assertEquals等等这些方法了

        另外,在Junit 4中增加了两个新的断言方法,他们用来比较两个对象数组,如果两个数组中的每个元素都是equal的,那么就认为这两个数组是equal的:
    public static void assertEquals(String message, Object[] expecteds, Object[] actuals);
    public static void assertEquals(Object[] expecteds, Object[] actuals);

         还有12个assertEquals 方法已经因为JDK 5.0中的autoboxing功能而彻底消失了。像这样assertEquals(long, long) 之前在JUnit 3.8中使用的方法,现在已经都统一改用assertEquals(Object, Object)方法。

Fixture

        Fixtures是在测试期间用来初始化(initialize)和释放(release)对象的一些方法,在 In JUnit 3.8中,需要用setUp() 方法在运行测试方法之前进行一些初始化的工作,然后在测试完成之后用tearDown() 方法来进行善后工作。这两个方法都是从父类TestCase 中override过来的,因此他们的方法声明及方法名称是固定的。在JUnit 4中我们只要使用这两个annotation:@Before 和 @After 就可以达到同样的目的了,而且我们不用再强制的让方法必须叫这两个名字了。^_^

测试方法上的变化

          在JUnit 3.8中,用来标识一个测试方法是通过它的方法签名来实现的,即方法必须以一个"test"的前缀来命名,且必须为void,而且必须没有任何参数(比如:public void testDivide()),那些不遵循这种命名规则的方法将会被简单的忽略掉,而且不会抛出任何异常来表面已经发生了错误。

        在JUnit 4中就没有命名上的限制了,只需要在测试方法的签名加上一个这样的annotation就可以了:@Test,像之前的限制:方法必须为void,而且必须没有任何参数,这些还是一样需要,只是限制改为,如果没有遵守这些限制,则会在运行的时候抛出下面的异常:
     java.lang.Exception: Method xxx should have no parameters
     java.lang.Exception: Method xxx should be void
另外,@Test支持可选的expected参数,用来声明这个测试方法可以抛出一个异常,如果在测试时没有抛出异常,或者抛出了一个其他的异常,都会认为测试是失败的。比如可以这样来声明@Test(expected = ArithmeticException.class)。

忽略一个测试方法

         如果你在测试之前知道某个方法测试一定会失败,但是,你又不想让测试失败,那么你怎么临时的让这个测试方法被忽略掉呢?在JUnit 3.8中要么将这个方法注释掉,要么就需要改变方法名称,即不使用test前缀开头来命名方法,问题是当测试的方法很多时,你可能不记得你重命名过的这个方法了。而在JUnit 4中可以通过去掉方法前面的@Test annotation来达到目的,但是上面的问题依然存在,一个终极解决方案是:在需要测试的方法前/后即@Test的前面或者后面加上@Ignore 就可以了,最后在测试报告中将会显示出有多少方法被忽略掉了,同时会显示多少方法运行成功,以及多少方法运行失败。Note:@Ignore 有一个可选的参数,可以用它来简单的记录为什么这个方法被忽略掉了。

运行测试

         在JUnit 3.8中你可以有多种运行方式:text, AWT或者Swing,但是在JUnit 4中仅使用text方式。

原文转自:http://www.ltesting.net