我的知识库

知识等于力量

« IBM 内的 SOA 应用,第 2 部分: SOA 案例研究电子政务中基于角色的交叉集散授权策略 »

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 uptear 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块里面assertTruetrue)来测试。现在,通过@Test标签中的expected属性,就可以更优雅的测试错误了:

在这段代码中,我们为@Test标签添加了expected属性,并提供了一个BookNotAvailableException,那么在这段测试中,如果代码没有抛出这个类型的错误,测试就失败了,如果正确抛出该类型错误,测试通过。

 

其他的标签:

@ignore标签:

该标签标记的测试方法在测试中会被忽略。当测试的方法还没有实现,或者测试的方法已经过时,或者在某种条件下才能测试该方法(比如需要一个数据库联接,而在本地测试的时候,数据库并没有连接),那么使用该标签来标示这个方法。同时,你可以为该标签传递一个String的参数,来表明为什么会忽略这个测试方法。比如:@lgnore(“该方法还没有实现”),在执行的时候,仅会报告该方法没有实现,而不会运行测试方法。

 

@Test(timeout=xxx):

该标签传入了一个时间(毫秒)给测试方法,

如果测试方法在制定的时间之内没有运行完,则测试也失败。

 

这篇文章就到这里,其实JUnit4.x里面还有很多标签的用法,将在明天的blog中继续。

Search

导航

热门文章

最新文章

Powered By duduwolf's wiki 1.0

Copyright 1999-2007 duduwolf.com Some Rights Reserved.