“JUnit4.0 in 10 minutes” learning minutes

来源:百度文库 编辑:神马文学网 时间:2024/07/08 21:46:03
“JUnit4.0 in 10 minutes” learning minutes
TestNG与JUnit的嘴仗似乎告一段落了,Gunjan Doshi今天发布了一个"JUnit 4.0 in 10 Minutes: A Quick Reference Guide",学习笔记如下。
注:所有代码和插图都来自于原文。
首先来看看JUnit4.0以前,我们怎样编写测试用例:

测试用例必须继承自"junit.framework.TestCase"; 测试用例函数必须以"test"开头; 用assert的系列函数来验证结果。
如果用JUnit4.0重写,将是这个样子:

不用再继承自"junit.framework.TestCase",TestNG批评JUnit的一个方面就是在JUnit中,每一个测试用例都会实例化一份TestCase,带来效率的降低。JUnit4.0确实修改了这样的设计。 测试函数名称不用再以"test"开头,而用Annotation"@Test"来修饰; assert系列函数没有大的改变; 如果希望用老的JUnit Runner来运行JUnit4.0的测试用例,需要用Junit4TestAdapter来Adapt一下。 或者可以用新的JUnit4的Runner来运行。
java org.junit.runner.JUnitCore LibraryTest
 
其中,用"@Test" Annotation来修饰测试用例是JUnit4.0的一个大Feature,这也正是这种Metadata应该发挥作用的地方。
"@Test"有两个非常有用的参数:
1) 预期会抛出的异常检测
"@Test"的"expected"参数用来说明希望抛出的异常,如果运行时没有抛出这个异常,测试用例就被标识为失败。
2) 预期运行时间
"@Test"有一个timeout的参数用来说明这个测试用例运行的时间最长应该为多少,如果时间超出,则标识为失败。
@Test (timeout=10)
TestNG批评JUnit的另一个方面是所有的测试用例函数都会在测试执行前执行setUp,在测试后执行tearDown,不仅效率很低,也会带来很多问题(比如一次性的数据库链接等等)。
JUnit4.0这样解决这个问题:
引入Annotation"Before", "After", "BeforeClass", "AfterClass"。
"Before"修饰的函数将会在每个测试运行前运行,"After"修饰的函数将在每个测试用例运行后运行。JUnit4.0支持任意数量的"Before"和"After" Annotation,并且支持继承。"Before"修饰函数的执行顺序为父类的在前,继承类在后,"After"则相反,继承类在前,父类在后。

"BeforeClass"修饰的函数将会在所有的测试用例运行前运行一次(只运行一次), "AfterClass"则会在所有的测试用例运行后运行一次(只运行一次)。

JUnit4.0还有一个有用的Annotation "@Ignore",它用来修饰将被忽略的函数,用"@Ignore"修饰的测试用例函数将不会执行。这个Annotation支持一个字符串参数,用来说明忽略的原因,比如:
@Ignore(“Database is down”)
 
TestNG则采用配置文件的办法解决这个问题,两种方法各有利弊。
Reference:
JUnit 4.0 in 10 Minutes: A Quick Reference Guide [PDF] - Gunjan Doshi
注:所有代码和插图都来自于原文。
Popularity: 24%
Related entries:
TDD, JUnit, TestNGTag your Java source code with Tiger‘s annotationGet the Stack trace information in Java SE 5.0 各种编程语言的对比CPPUnit Lite
Posted in \" href="http://www.mengyan.org/blog/archives/category/%e6%8a%80%e6%9c%af/" rel="category tag">技术 at July 28th, 2005 |1 Comment »
TDD, JUnit, TestNG
July 9, 2005
前两天注意到TheServerSide上一个挺老的新闻,TestNG阵营认为JUnit在最新的4.0版本中“抄袭”了他们的Idea,TestNG的Co-Founder分别在自己的Blog上发言来证明(Cedric Beust:JUnit 4 overview,Alexandru Popescu:JUnit 4.0),Erich Gamma则留言反击,听起来满有意思,于是我也顺便研究了一下TestNG。
"…I’m not quite sure what is the driving vision behind JUnit 4 (besides TestNG)".
I’m glad that there is TestNG, but there are also other interesting testing framework efforts. In particular there is NUnit.NUnit has introduced using annotations in testing frameworks a while ago. Most of the requests for annotation based tests came from the dual NUnit/JUnit users. So we are listening to the community.
Posted by: Erich Gamma at June 11, 2005 09:02 AM
先来说说TDD(Test Driven Development)- 测试驱动开发,想了解TDD,最好看看Kent Back的《测试驱动开发》,里面详细的讲述了TDD的原理、实践。不过,我觉得,只有你真正的去用了,才能体会到测试驱动开发给你带来的好处。
我觉得,TDD给我们带来的好处有很多:
1)从功能需求入手,设计对象,在写TestCase的时候其实就是对象设计的时候,这样,TestCase写好写全了,对象也就设计好了;
2)可以在开发阶段找到很多Bug(尤其是很多边缘测试的情况),减少后期Debug的时间;
3)减少由于重构或者Fix其它Bug的时候带来的Regression。
全部测试通过,开发也就结束了,真的很有帮助。
举个例子,比如Xerdoc DSearch中JPEG Parser Plugin的开发。首先从功能需求的角度出发,这个Parser要负责解析出JPEG文件的EXIF头信息,那么ok,我就设计一个ExifInfo的解析Parser类。然后开始写TestCase。
public void testParseExifInfor() {         String filePath = "P8040002.JPG";         File picFile = new File(filePath);         ExifInfor exif = new ExifInfor(filePath);                 assertTrue(exif != null);         assertEquals(600, exif.getWidth());         assertEquals(true, exif.isColor());                     ... ... }
在进行测试用例(TestCase)设计的时候,我们就可以设计出ExifInfor类的基本接口,剩余的工作可以留到重构(Refactoring:是XP Programming中另一个非常棒的概念。)的时候进行了。
当然,测试用例要Cover尽可能多的情况,比如不标准的Exif信息等等,当开发结束,所有的测试都通过的时候,你就可以冲上一杯咖啡,来想想重构的事儿了(当然,重构完毕还是需要用TestCase来检验重构的结果的,呵呵)。
TestNG(Test Next Generation - The next generation of unit testing),顾名思义,目标直指下一代的测试框架。
TestNG比起JUnit来说,变化主要表现在:
1)最大的不同就是TestNG利用了JavaSE 5.0中的Annotations(JSR175)来代替test开头的用例函数名(TestNG说,现有IDE大多都按照函数名排序了,test打头弄得这些函数不好分辨,呵呵)。我觉得这个Idea确实不错,而且本应如此,Annotation就是用来干这个的嘛。不过这个其实不能怪JUnit,JUnit出来的时候Annotations还没有出现在Java语言中。
2)解决JUnit中的多实例化问题。在JUnit中,每一个测试用例都会实例化一份TestCase,同时也会在测试执行前执行setUp,在测试后执行tearDown。这会带来效率的降低,而有些测试,比如数据库链接,也会带来一些其它问题。TestNG用XML配置文件来解决这样的问题。不过,我觉得,简单才是最美,弄成Ant配置那么复杂的话,真够麻烦。
3)TestNG对多线程测试的支持良好,只需要配置即可。JUnit中要想进行多线程测试比较麻烦,需要其它模块,比较著名的是GroboUtils。
我觉得很多概念都不错,比如Group Testing,不需要派生TestCase等等,测试用例函数的参数化等等,不过这些还是站在了巨人(JUnit)的肩膀上。我不喜欢的是XML Configuration的部署策略,太麻烦。TestNG给出的是这样的应用场景,一个小组开发,写好所有的测试用例,有的人只需要这几个,有的人需要那几个,因为全部编译测试非常花费时间,这样,更改XML Configuration就可以了,确实如此,不过我实在不喜欢什么东西都用这种配置文件来弄,简单的事情变得复杂,就不好玩儿了。就连Ant之父James Duncan Davidson也觉得Ant现在的脚本太复杂呢,呵呵。
从0到1和从1到2是完全不同的,基于测试开发这个Idea真的是非常棒,这种Test Driven Development真的极大的改变了软件开发的方式。最早的Idea不知道是谁的,我记着从前看Bruce Eckel的Thinking in Java的时候,就有单元测试的影子。插一句,其实,Java中的Assert Keyword,MFC中的Assert宏,也都有TDD的影子,不过还差很多,但是开发理念已经有几分相像了。