ImageVerifierCode 换一换
格式:DOCX , 页数:12 ,大小:22.14KB ,
资源ID:10664202      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10664202.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(junit3与junit4的区别.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

junit3与junit4的区别.docx

1、junit3与junit4的区别JUnit 4的新特征一、引言在本文开始,我将假定,你已经了解由Kent Beck和Erich Gamma发明的这个Java单元测试框架并因此而略过必要的简介。所以,我将集中分析从JUnit 3.8到最新版本JUnit 4的迁移过程以及其在IDE和Ant中的集成。JUnit 4是一种与其之前的版本完全不同的API,它根据Java 5.0中的新特征(注解,静态导入等)构建而成。如你所见,JUnit 4更简单、更丰富和更易于使用,而且它引入了更为灵活的初始化和清理工作,还有限时的和参数化测试用例。 代码实例最能说明问题。因此,在本文中,我将使用一个例子来展示不同的测

2、试用例:一个计算器。该示例计算器很简单,效率并不高,甚至还有一些错误; 它仅仅操作整数,并且把结果存储在一个静态变量中。Substract方法并不返回一个有效的结果,而且也没有实现乘法运算,而且看上去在 squareRoot方法中还存在一个错误:无限循环。这些错误将帮助说明使用JUnit 4进行测试的有效性。你可以打开和关闭这个计算器,而且你可以清除这些结果。下面是其实现代码:package calc;public class Calculator private static int result; /存储结果的静态变量public void add(int n) result = resu

3、lt + n;public void substract(int n) result = result - 1; /错误:应该是result = result - npublic void multiply(int n) /还没实现public void divide(int n) result = result / n;public void square(int n) result = n * n;public void squareRoot(int n) for (; ;) ; /错误:无限循环public void clear() /清除结果result = 0;public void

4、 switchOn() /打开屏幕,显示hello,并报警result = 0; /实现其它的计算器功能public void switchOff() /显示bye bye,报警,并关闭屏幕public int getResult() return result; 二、迁移一个测试类现在,我将把一个已经使用JUnit 3.8编写成的简单的测试类迁移到JUnit 4。这个类有一些缺陷:它没有测试所有的业务方法,而且看上去在testDivide方法中还存在一个错误(8/2不等于5)。因为还没有实现乘法运算功能,所以对其测试将被忽略。下面,我们把两个版本的框架之间的差别以粗体显示出现于表格1中。表格

5、1.分别以JUnit 3.8和JUnit 4实现的CaculatorTest。JUnit 3.8 package junit3;import calc.Calculator;import junit.Framework.TestCase;public class CalculatorTest extends TestCase private static Calculator calculator = new Calculator();Override protected void setUp() calculator.clear(); public void testAdd() calcul

6、ator.add(1); calculator.add(1); assertEquals(calculator.getResult(), 2);public void testSubtract() calculator.add(10); calculator.subtract(2);assertEquals(calculator.getResult(), 8);public void testDivide() calculator.add(8);calculator.divide(2);assert calculator.getResult() = 5;public void testDivi

7、deByZero() try calculator.divide(0);fail();catch (ArithmeticException e) public void notReadyYetTestMultiply() calculator.add(10);calculator.multiply(10);assertEquals(calculator.getResult(), 100); JUnit 4package JUnit 4; import calc.Calculator;import org.junit.Before;import org.junit.Ignore;import o

8、rg.junit.Test;import static org.junit.Assert.*;public class CalculatorTest private static Calculator calculator = new Calculator();Before public void clearCalculator() calculator.clear();Test public void add() calculator.add(1); calculator.add(1);assertEquals(calculator.getResult(), 2);Test public v

9、oid subtract() calculator.add(10);calculator.subtract(2);assertEquals(calculator.getResult(), 8);Test public void divide() calculator.add(8);calculator.divide(2);assert calculator.getResult() = 5;Test(expected = ArithmeticException.class)public void divideByZero() calculator.divide(0);Ignore(not rea

10、dy yet)Test public void multiply() calculator.add(10);calculator.multiply(10);assertEquals(calculator.getResult(), 100); #p# 三、包首先,你可以看到,JUnit 4使用org.junit.*包而JUnit 3.8使用的是junit.Framework.*。当然,为了向后兼容性起见,JUnit 4jar文件发行中加入了这两种包。四、继承在中,测试类不必再扩展junit.framework.TestCase;事实上,它们不必须扩展任何内容。但是,JUnit 4中使用的是注解。

11、为了以一个测试用例方式执行,一个JUnit 4类中至少需要一个Test注解。例如,如果你仅使用Before和After注解而没有至少提供一个Test方法来编写一个类,那么,当你试图 执行它时将得到一个错误:Java.lang.Exception: No runnable methods. 五、断言(Assert)方法因为在JUnit 4中一个测试类并不继承自TestCase(在JUnit 3.8中,这个类中定义了assertEquals()方法),所以你必须使用前缀语法(举例来说,Assert.assertEquals()或者 (由于JDK5.0)静态地导入Assert类。这样以来,你就可以完

12、全象以前一样使用assertEquals方法(举例来 说,assertEquals()。另外,在JUnit 4中,还引入了两个新的断言方法,它们专门用于数组对象的比较。如果两个数组包含的元素都相等,那么这两个数组就是相等的。public static void assertEquals(String message, Object expecteds, Object actuals);public static void assertEquals(Object expecteds, Object actuals); 由于JDK 5.0的自动装箱机制的出现,原先的个assertEquals方法全

13、部去掉了。例如,原先JUnit 3.8中的assertEquals(long,long)方法在JUnit 4中要使用assertEquals(Object,Object)。对于assertEquals(byte,byte)、 assertEquals(int,int)等也是这样。这种改进将有助于避免反模式。在JUnit 4中,新集成了一个assert关键字(见我们的例子中的divide()方法)。你可以象使用assertEquals方法一样来使用它,因为它们都抛 出相同的异常(java.lang.AssertionError)。JUnit 3.8的assertEquals将抛出一个junit.

14、framework.AssertionFailedError。注意,当使用assert时, 你必须指定Java的-ea参数;否则,断言将被忽略。六、预设环境(Fixture)Fixture是在测试期间初始化和释放任何普通对象的方法。在JUnit 3.8中,你要使用setUp()来实现运行每一个测试前的初始化工作,然后使用tearDown()来进行每个测试后的清理。这两个方法在 TestCase类中都得到重载,因此都被唯一定义。注意,我在这个Setup方法使用的是Java5.0内置的Override注解-这个注解指示该 方法声明要重载在超类中的方法声明。在JUnit 4中,则代之使用的是Befo

15、re和After注解;而且,可以以任何命名(在我们的例子中是clearCalculator()来调用这些方法。 在本文后面,我将更多地解释这些注解。七、测试JUnit 3.8通过分析它的签名来识别一个测试方法:方法名必须以“test”为前缀,它必须返回void,而且它必须没有任何参数(举例来 说,publicvoidtestDivide()。一个不遵循这个命名约定的测试方法将被框架简单地忽略,而且不抛出任何异常(指示发生了一个错 误)。JUnit 4不使用与JUnit 3.8相同的约定。一个测试方法不必以test为前缀,但是要使用Test注解。但是,正如在前一个框架中一样,一个测试方法也必须返

16、回void并 且是无参数的。在JUnit 4中,可以在运行时刻控制这个要求,并且不符合要求的话会抛出一个异常:java.lang.Exception: Method xxx should have no parametersjava.lang.Exception: Method xxx should be voidTest注解支持可选参数。它声明一个测试方法应该抛出一个异常。如果它不抛出或者如果它抛出一个与事先声明的不同的异常,那么该测试失败。在我们的例子中,一个整数被零除应该引发一个ArithmeticException异常。八、 忽略一个测试记住,不能执行多个方法。然而,如果你不想让测试失

17、败的话,你可以仅仅忽略它。那么,在JUnit 3.8中,我们是如何实现临时禁止一个测试的呢?方法是:通过注释掉它或者改变命名约定,这样测试运行机就无法找到它。在我的例子中,我使用了方法名 notReadyYetTestMultiply()。它没有以“test”开头,所以它不会被识别出来。现在的问题是,在成百上千的测试中间,你可能记 不住重命名这个方法。#p# 在JUnit 4中,为了忽略一个测试,你可以注释掉一个方法或者删除Test注解(你不能再改变命名约定,否则将抛出一个异常)。然而,该问题将保留:该运行机将不 报告这样一个测试。现在,你可以把Ignore注解添加到Test的前面或者后面。测

18、试运行机将报告被忽略的测试的个数,以及运行的测试的数目和运行 失败的测试数目。注意,Ignore使用一个可选参数(一个String),如果你想记录为什么一个测试被忽略的话。九、运行测试在JUnit 3.8中,你可以选择使用若干运行机:文本型,AWT或者Swing。JUnit 4仅仅使用文本测试运行机。注意,JUnit 4不会显示任何绿色条来通知你测试成功了。如果你想看到任何类型的绿色的话,那么你可能需要使用JUnit扩展或一种集成了JUnit的IDE(例如 IDEA或者Eclipse)。首先,我想使用老式但好用的junit.textui.TestRunner来运行该JUnit 3.8测试类(考

19、虑到使用assert关键字,我使用了-ea参数)。java -ea junit.textui.TestRunner junit3.CalculatorTest .F.E.There was 1 error:1) testDivide(junit3.CalculatorTest)java.lang.AssertionErrorat junit3.CalculatorTest.testDivide(CalculatorTest.java:33)There was 1 failure:1) testSubtract(junit3.CalculatorTest)junit.framework.Asse

20、rtionFailedError: expected:9 but was:8at junit3.CalculatorTest.testSubtract(CalculatorTest.java:27)FAILURES!Tests run: 4, Failures: 1, Errors: 1 TestDivide产生一个错误,因为断言确定了8/2不等于5。TestSubstract产生一个失败,因为10-2应该等于8,但是在这个实现中存在一个错误:它返回9。现在,我使用新的org.junit.runner.JUnitCore运行机来运行这两个类。注意,它能执行JUnit 4和JUnit 3.8测试

21、,甚至是这二者的结合。java -ea org.junit.runner.JUnitCore junit3.CalculatorTestJUnit version 4.1.E.E.There were 2 failures:1) testSubtract(junit3.CalculatorTest)junit.framework.AssertionFailedError: expected:9 but was:8at junit.framework.Assert.fail(Assert.java:47)2) testDivide(junit3.CalculatorTest)java.lang.

22、AssertionErrorat junit3.CalculatorTest.testDivide(CalculatorTest.java:33)FAILURES!Tests run: 4, Failures: 2* java -ea org.junit.runner.JUnitCore JUnit 4.CalculatorTestJUnit version 4.1.E.EIThere were 2 failures:1) subtract(JUnit 4.CalculatorTest)java.lang.AssertionError: expected:9 but was:8at org.j

23、unit.Assert.fail(Assert.java:69)2) divide(JUnit 4.CalculatorTest)java.lang.AssertionErrorat JUnit 4.CalculatorTest.divide(CalculatorTest.java:40)FAILURES!Tests run: 4, Failures: 2 第一个非常明显的区别是,JUnit版本号被显示于控制台中(4.1)。第二个区别是,JUnit 3.8区分失败和错误;JUnit 4则仅使用失败进行简化。一个新奇的地方是,字母“I”,它显示一个测试被忽略。十、高级测试现在,我将展示JUnit

24、 4的一些高级特征。列表1(见下载源码)是一个新的测试类-AdvancedTest,它派生自AbstractParent。(一) 高级预设环境两个类都使用新的注解BeforeClass和AfterClass,还有Before和After。表格2展示了在这些注解之间的主要区别。表格2.BeforeClass/AfterClass比较于Before/After。BeforeClass和AfterClass Before和After在每个类中只有一个方法能被注解。多个方法能被注解,但其执行的顺序未特别指定,且不运行重载方法。方法名是不相关的。方法名是不相关的。每个类运行一次。在每个测试方法运行前或运

25、行后运行。在当前类的BeforeClass方法运行前先运行超类的BeforeClass方法。在超类中声明的AfterClass方法将在所有当前类的该方法运行后才运行。 超类中的Before在所有子类的该方法运行前运行。在超类中的After在在所有子类的该方法运行后才运行。必须是公共和非静态的。必须是公共和非静态的。即使一个BeforeClass方法抛出一个异常,所有的AfterClass方法也保证被运行。即使一个Before或者Test方法抛出一个异常,所有的After方法也保证被运行。如果你仅有一次需要分配和释放昂贵的资源,那么BeforeClass和AfterClass可能很有用。在我们的

26、例子 中,AbstractParent使用这些在startTestSystem()和stopTestSystem()方法上的注解启动和停止整个测试系 统。并且它使用Before和After初始化和清除系统。子类AdvancedTest也混合使用这些注解。在你的测试代码中使用System.out.println不是一种良好的实践习惯;但是,在这个用例中,它有助于理解这些注解被调用的顺序。当我运行AdvancedTest时,我得到如下结果:Start test system /父类的BeforeClassSwitch on calculator /子类的BeforeClassInitialize

27、test system /第一个测试Clear calculatorInitialize test system /第二个测试Clear calculatorClean test systemInitialize test system /第三个测试Clear calculatorClean test systemInitialize test system /第四个测试Clear calculatorClean test systemSwitch off calculator /子类的AfterClassStop test system /父类的AfterClass 如你所见,BeforeC

28、lass和AfterClass仅被调用一次,而Before和Afterare在每次测试中都要调用。 (二) 限时测试在前面的例子中,我为squareRoot()方法编写了一个测试用例。记住,在这个方法中存在一个错误-能够导致它无限循环。如果没有结果的话, 我想让这个测试在1秒钟后退出。这一功能正是timeout参数所要实现的。Test注解的第二个可选参数(第一个参数是必需的)可以使一个测试失败, 如果该测试花费比一个预先确定的时限(毫秒)还长的时间的话。当我运行该测试时,我得到如下的运行结果:There was 1 failure:1) squareRoot(JUnit 4.AdvancedT

29、est)Java.lang.Exception: test timed out after 1000 millisecondsat org.junit.internal.runners.TestMethodRunner.runWithTimeout(TestMethodRunner.java:68)at org.junit.internal.runners.TestMethodRunner.运行(TestMethodRunner.java:43)FAILURES!Tests run: 4, Failures: 1 (三) 参数化测试在列表1中,我测试了squareRoot(它是square方法

30、而不是squareRoot方法)-通过创建若干测试方法 (square2,square4,square5),这些方法都完成相同的事情(通过被一些变量参数化实现)。其实,现在这里的复制/粘贴技术可以通过 使用一个参数化测试用例加以优化(列表2)。在列表2(见本文相应下载源码)中的测试用例使用了两个新的注解。当一个类被使用RunWith注释时,JUnit将调用被参考的类来运行该测试 而不是使用缺省的运行机。为了使用一个参数化测试用例,你需要使用运行机org.junit.runners.Parameterized。为了确定使用 哪个参数,该测试用例需要一个公共静态方法(在此是data(),但是名字似乎无关),该方法返回一个Collection,并且被使用参数加以注解。 你还需要一个使用这些参数的公共构造函数。当运行这个类,该输出是:java org.junit.runner.JUnitCore JUnit 4.SquareTestJUnit version 4.1.EThere was 1 failure:1) square6(JUnit 4.Squa

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1