您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 经营企划 > Junit4教程,实例讲解
JUnit4概述JUnit4是JUnit框架有史以来的最大改进,其主要目标便是利用Java5的Annotation特性简化测试用例的编写。先简单解释一下什么是Annotation,这个单词一般是翻译成元数据。元数据是什么?元数据就是描述数据的数据。也就是说,这个东西在Java里面可以用来和public、static等关键字一样来修饰类名、方法名、变量名。修饰的作用描述这个数据是做什么用的,差不多和public描述这个数据是公有的一样。想具体了解可以看CoreJava2。废话不多说了,直接进入正题。我们先看一下在JUnit3中我们是怎样写一个单元测试的。比如下面一个类:publicclassAddOperation{publicintadd(intx,inty){returnx+y;}}我们要测试add这个方法,我们写单元测试得这么写:importjunit.framework.TestCase;importstaticorg.junit.Assert.*;publicclassAddOperationTestextendsTestCase{publicvoidsetUp()throwsException{}publicvoidtearDown()throwsException{}publicvoidtestAdd(){System.out.println(\add\);intx=0;inty=0;AddOperationinstance=newAddOperation();intexpResult=0;intresult=instance.add(x,y);assertEquals(expResult,result);}}可以看到上面的类使用了JDK5中的静态导入,这个相对来说就很简单,只要在import关键字后面加上static关键字,就可以把后面的类的static的变量和方法导入到这个类中,调用的时候和调用自己的方法没有任何区别。我们可以看到上面那个单元测试有一些比较霸道的地方,表现在:1.单元测试类必须继承自TestCase。2.要测试的方法必须以test开头。如果上面那个单元测试在JUnit4中写就不会这么复杂。代码如下:importjunit.framework.TestCase;importorg.junit.After;importorg.junit.Before;importorg.junit.Test;importstaticorg.junit.Assert.*;/****@authorbean*/publicclassAddOperationTestextendsTestCase{publicAddOperationTest(){}@BeforepublicvoidsetUp()throwsException{}@AfterpublicvoidtearDown()throwsException{}@Testpublicvoidadd(){System.out.println(\add\);intx=0;inty=0;AddOperationinstance=newAddOperation();intexpResult=0;intresult=instance.add(x,y);assertEquals(expResult,result);}}我们可以看到,采用Annotation的JUnit已经不会霸道的要求你必须继承自TestCase了,而且测试方法也不必以test开头了,只要以@Test元数据来描述即可。从上面的例子可以看到在JUnit4中还引入了一些其他的元数据,下面一一介绍:@Before:使用了该元数据的方法在每个测试方法执行之前都要执行一次。@After:使用了该元数据的方法在每个测试方法执行之后要执行一次。注意:@Before和@After标示的方法只能各有一个。这个相当于取代了JUnit以前版本中的setUp和tearDown方法,当然你还可以继续叫这个名字,不过JUnit不会霸道的要求你这么做了。@Test(expected=*.class)在JUnit4.0之前,对错误的测试,我们只能通过fail来产生一个错误,并在try块里面assertTrue(true)来测试。现在,通过@Test元数据中的expected属性。expected属性的值是一个异常的类型@Test(timeout=xxx):该元数据传入了一个时间(毫秒)给测试方法,如果测试方法在制定的时间之内没有运行完,则测试也失败。@ignore:该元数据标记的测试方法在测试中会被忽略。当测试的方法还没有实现,或者测试的方法已经过时,或者在某种条件下才能测试该方法(比如需要一个数据库联接,而在本地测试的时候,数据库并没有连接),那么使用该标签来标示这个方法。同时,你可以为该标签传递一个String的参数,来表明为什么会忽略这个测试方法。比如:@lgnore(“该方法还没有实现”),在执行的时候,仅会报告该方法没有实现,而不会运行测试方法。在Eclipse中使用JUnit4进行单元测试(初级篇)我们在编写大型程序的时候,需要写成千上万个方法或函数,这些函数的功能可能很强大,但我们在程序中只用到该函数的一小部分功能,并且经过调试可以确定,这一小部分功能是正确的。但是,我们同时应该确保每一个函数都完全正确,因为如果我们今后如果对程序进行扩展,用到了某个函数的其他功能,而这个功能有bug的话,那绝对是一件非常郁闷的事情。所以说,每编写完一个函数之后,都应该对这个函数的方方面面进行测试,这样的测试我们称之为单元测试。传统的编程方式,进行单元测试是一件很麻烦的事情,你要重新写另外一个程序,在该程序中调用你需要测试的方法,并且仔细观察运行结果,看看是否有错。正因为如此麻烦,所以程序员们编写单元测试的热情不是很高。于是有一个牛人推出了单元测试包,大大简化了进行单元测试所要做的工作,这就是JUnit4。本文简要介绍一下在Eclipse3.2中使用JUnit4进行单元测试的方法。首先,我们来一个傻瓜式速成教程,不要问为什么,FollowMe,先来体验一下单元测试的快感!首先新建一个项目叫JUnit_Test,我们编写一个Calculator类,这是一个能够简单实现加减乘除、平方、开方的计算器类,然后对这些功能进行单元测试。这个类并不是很完美,我们故意保留了一些Bug用于演示,这些Bug在注释中都有说明。该类代码如下:packageandycpp;publicclassCalculator...{privatestaticintresult;//静态变量,用于存储运行结果publicvoidadd(intn)...{result=result+n;}publicvoidsubstract(intn)...{result=result-1;//Bug:正确的应该是result=result-n}publicvoidmultiply(intn)...{}//此方法尚未写好publicvoiddivide(intn)...{result=result/n;}publicvoidsquare(intn)...{result=n*n;}publicvoidsquareRoot(intn)...{for(;;);//Bug:死循环}publicvoidclear()...{//将结果清零result=0;}publicintgetResult()...{returnresult;}}第二步,将JUnit4单元测试包引入这个项目:在该项目上点右键,点“属性”,如图:在弹出的属性窗口中,首先在左边选择“JavaBuildPath”,然后到右上选择“Libraries”标签,之后在最右边点击“AddLibrary…”按钮,如下图所示:然后在新弹出的对话框中选择JUnit4并点击确定,如上图所示,JUnit4软件包就被包含进我们这个项目了。第三步,生成JUnit测试框架:在Eclipse的PackageExplorer中用右键点击该类弹出菜单,选择“NewàJUnitTestCase”。如下图所示:在弹出的对话框中,进行相应的选择,如下图所示:点击“下一步”后,系统会自动列出你这个类中包含的方法,选择你要进行测试的方法。此例中,我们仅对“加、减、乘、除”四个方法进行测试。如下图所示:之后系统会自动生成一个新类CalculatorTest,里面包含一些空的测试用例。你只需要将这些测试用例稍作修改即可使用。完整的CalculatorTest代码如下:packageandycpp;importstaticorg.junit.Assert.*;importorg.junit.Before;importorg.junit.Ignore;importorg.junit.Test;publicclassCalculatorTest...{privatestaticCalculatorcalculator=newCalculator();@BeforepublicvoidsetUp()throwsException...{calculator.clear();}@TestpublicvoidtestAdd()...{calculator.add(2);calculator.add(3);assertEquals(5,calculator.getResult());}@TestpublicvoidtestSubstract()...{calculator.add(10);calculator.substract(2);assertEquals(8,calculator.getResult());}@Ignore(Multiply()Notyetimplemented)@TestpublicvoidtestMultiply()...{}@TestpublicvoidtestDivide()...{calculator.add(8);calculator.divide(2);assertEquals(4,calculator.getResult());}}第四步,运行测试代码:按照上述代码修改完毕后,我们在CalculatorTest类上点右键,选择“RunAsàJUnitTest”来运行我们的测试,如下图所示:运行结果如下:进度条是红颜色表示发现错误,具体的测试结果在进度条上面有表示“共进行了4个测试,其中1个测试被忽略,一个测试失败”至此,我们已经完整体验了在Eclipse中使用JUnit的方法。在接下来的文章中,我会详细解释测试代码中的每一个细节!在Eclipse中使用JUnit4进行单元测试(中级篇)我们继续对初级篇中的例子进行分析。初级篇中我们使用Eclipse自动生成了一个测试框架,在这篇文章中,我们来仔细分析一下这个测试框架中的每一个细节,知其然更要知其所以然,才能更加熟练地应用JUnit4。一、包含必要地Package在测试类中用到了JUnit4框架,自然要把相应地Package包含进来。最主要地一个Package就是org.junit.*。把它包含进来之后,绝大部分功能就有了。还有一句话也非常地重要“importstaticorg.junit.Assert.*;”,我们在测试的时候使用的一系列assertEquals方法就来自这个包。大家注意一下,这是一个静态包含(static),是JDK5中新增添的一个功能。也就是说,assertEquals是Assert类中的一系列的静态方法,一般的使用方式是Assert.assertEquals(),但是使用了静态包含后,前面的类名就可以省略了,使用起来更加的方便。二、测试类的声明大家注意到,我们的测试类是一个独立的类,没有任何父类。测试类的名字也可以任意命名,没有任何局限性。所以我们不能通过类的声明来判断它是不是一个测试类,它与普通类的区别在于它内部的方法的声明,我们接着会讲到。三、创建一个待测试的对象。你要测试哪个
本文标题:Junit4教程,实例讲解
链接地址:https://www.777doc.com/doc-6249532 .html