文章来源:http://blog.easyjf.com/html/blog/20061026/6271653-20952551.htm
Tags: junitjunit
2007-2-12 15:17:48 | 编辑
10分钟入门Junit 4.X
这篇文章算是一个翻译了。分成两部分,集合了两篇JUnit.org上的推荐文章,这里是原文的地址:
http://www.instrumentalservices.com/index.php?option=com_content&task=view&id=45&Itemid=52
http://www.devx.com/Java/Article/31983
JUnit我就不多做介绍了,Kent Beck 和Erich Gamma的作品。这里主要讲一下在JUnit 4.0 和4.1版本中的一些改进和新的用法。
要很好的使用JUnit 4.x,必须要Java SE 5.0 ,因为这个版本最大的变化就是加入了大量的Annotation的使用。
来通过一个例子看下,首先是一个老版本的测试案例:

有几点需要关注:
1—— 一个测试案例必须要继承自TestCase;
2—— JUnit是通过反射机制来执行每一个test方法,它通过匹配方法名testXXX来确定一个方法为需要执行的测试Case。
3—— 使用一个或几个assertXXX方法来验证我们的情况。
好,现在使用JUnit 4.x来实现相同的测试,从中,我们就能看到一些新的东西:

首先关注以下几点:
1——我们的测试类并没有extends TestCase类了,
2——我们的测试方法并没有以test开头,而是使用了@Test标签来标记该方法是一个需要测试的方法。
下面的图标示了用JUnit 4.x我们需要做的事情:

1——我们需要引进org.junit.Test标签,还有很多标签都在org.junit.*包里面。
2——引进static assertEquals静态方法,引入静态方法也是Java 5的一个新的特性,避免了使用过长的应用方法名。
3——引进JUnit4TestAdapter,这是一个和老版本JUnit工具合用的适配器。
4——使用@Test标签来申明一个方法需要测试。
5——直接使用需要的assert方法
6——使用一个main方法来用JUnit4TestAdapter在老的Junit runner上运行新的测试。
总结一下:
l 使用一个普通的类,而不必继承自Junit.framework.TestCase。
l 使用@Test标签来标记一个方法是一个测试方法。
l 使用一个assert方法。在新版本的Junit中,assert方法和老方法没有什么区别。并且使用静态方法引入,(static import)特性来简化方法的使用。
l 使用JUnit4TestAdapter来运行测试。
Set up 和tear down
新版本的JUnit提供了两个新的标签来使用set up和tear down:
@Before:使用了该标记的方法在每个测试方法执行之前都要执行一次。
@After:使用了该标记的方法在每个测试方法执行之后要执行一次。
这里有个测试的例子:

如果我们在所有的方法中都添加一个System.out.println()方法,执行的结果会像这样:
runOnceBeforeAllTests() 被调用;
bookNotAvailableInLibrary() 被调用;
bookAvailableInCentralLibrary()被调用;
runAfterAllTests()被调用,
而如果我们还有一个@Before beforeTest()方法和一个@After afterTest()方法,那么执行的结果会是这样:
runOnceBeforeAllTests() 被调用;
beforeTest() 被调用;
bookNotAvailableInLibrary() 被调用;
afterTest()被调用;
beforeTest() 被调用;
bookAvailableInCentralLibrary()被调用;
afterTest()被调用;
runAfterAllTests()被调用,
从这里我们就可以看出两者的区别了。
另外一点,@Before和@After标示的方法只能各有一个。
错误处理:
在JUnit4.0之前,对错误的测试,我们只能通过fail来产生一个错误,并在try块里面assertTrue(true)来测试。现在,通过@Test标签中的expected属性,就可以更优雅的测试错误了:

在这段代码中,我们为@Test标签添加了expected属性,并提供了一个BookNotAvailableException,那么在这段测试中,如果代码没有抛出这个类型的错误,测试就失败了,如果正确抛出该类型错误,测试通过。
其他的标签:
@ignore标签:
该标签标记的测试方法在测试中会被忽略。当测试的方法还没有实现,或者测试的方法已经过时,或者在某种条件下才能测试该方法(比如需要一个数据库联接,而在本地测试的时候,数据库并没有连接),那么使用该标签来标示这个方法。同时,你可以为该标签传递一个String的参数,来表明为什么会忽略这个测试方法。比如:@lgnore(“该方法还没有实现”),在执行的时候,仅会报告该方法没有实现,而不会运行测试方法。
@Test(timeout=xxx):
该标签传入了一个时间(毫秒)给测试方法,
如果测试方法在制定的时间之内没有运行完,则测试也失败。
这篇文章就到这里,其实JUnit4.x里面还有很多标签的用法,将在明天的blog中继续。