资源预览内容
第1页 / 共11页
第2页 / 共11页
第3页 / 共11页
第4页 / 共11页
第5页 / 共11页
第6页 / 共11页
第7页 / 共11页
第8页 / 共11页
第9页 / 共11页
第10页 / 共11页
亲,该文档总共11页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
Junit学习(一)TDD简介:许多书上都讨论了自动测试,但是只有很少的著作注意到这么一个问题,那就是怎样把这些测试组织起来。随着测试的增加,放置和调用这些测试却变得更加麻烦。这将成为一个重要问题,以至于出现了TDD,极限编程(XP)使TDD得以普及。另外,你可以这样理解TDD:通过测试来开发。TDD(Test-Driven Development:测试驱动开发)本质和优势测试驱动开发不是一种测试技术,它是一种分析技术、设计技术,更是一种组织所有开发活动的技术。相对于传统的结构化开发过程方法,它具有以下优势:1) TDD根据客户需求编写测试用例,对功能的过程和接口都进行了设计,而且这种从使用者角度对代码进行的设计通常更符合后期开发的需求。因为关注用户反馈,可以及时响应需求变更,同时因为从使用者角度出发的简单设计,也可以更快地适应变化。2) 出于易测试和测试独立性的要求,将促使我们实现松耦合的设计,并更多地依赖于接口而非具体的类,提高系统的可扩展性和抗变性。而且TDD明显地缩短了设计决策的反馈循环,是我们几秒或几分钟之内就能获得反馈。3) 将测试工作提到编码之前,并频繁地运行所有测试,可以尽量地避免和尽早地发现错误,极大地降低了后续测试及修复的成本,提高了代码的质量。在测试的保护下,不断重构代码,以消除重复设计,优化设计结构,提高了代码的重用性,从而提高了软件产品的质量。4) TDD提供了持续的回归测试,使我们拥有重构的勇气,因为代码的改动导致系统其他部分产生任何异常,测试都会立刻通知我们。完整的测试会帮助我们持续地跟踪整个系统的状态,因此我们就不需要担心会产生什么不可预知的副作用了。5) TDD所产生的单元测试代码就是最完美的开发者文档,它们展示了所有的API该如何使用以及是如何运作的,而且它们与工作代码保持同步,永远是最新的。6) TDD可以减轻压力、降低忧虑、提高我们对代码的信心、使我们拥有重构的勇气,这些都是快乐工作的重要前提。TDD现状由于发展时间不长,相关应用并不是很成熟。现今越来越多的公司都在尝试实践测试驱动开发,但由于测试驱动开发对开发人员要求比较高,更与开发人员的传统思维习惯相违背,因此实践起来有一定困难。(二)Junit的简单介绍简单的说,junit 是用来做单元测试的一个工具。用其主页上的话来说就是:“JUnit是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing work)。在上可以下载到最新版本的junit包。单元测试是一种白箱测试。目的是验证一个或若干个类是否按所设计的那样正常工作。集成测试则是验证所有的类是否能互相配合,协同完成特定的任务。需要强调的是:测试是一个持续的过程。也就是说测试贯穿与开发的整个过程中,单元测试尤其适合于迭代增量式(iterative and incremental)的开发过程。因为我们是测试新手,我们也不理会那些复杂的测试原理,先说一说最简单的:测试就是比较预期的结果是否与实际执行的结果一致。如果一致则通过,否则失败。(三)回归测试框架-JUnit回归测试就是你不断地对所编写的代码进行测试:编写一些,测试一些,调试一些,然后循环这一过程,你会不断地重复先前的测试,哪怕你正编写其他的类,由于软件熵的存在,你可能在编写第五个类的时候发现,第五个类的某个操作会导致第二个类的测试失败。通过回归测试我们抓住了这条大Bug。(四)junit中的几个关键点Junit4 与junit3相比,做了比较大的改动。具体不细讲了,有兴趣可在网上查找些资料进行了解。1下面通过一个简单的实例对junit框架(函数结构)做个简单的介绍。比如下面一个类: public class AddOperation public int add(int x,int y) return x+y; 我们要测试add这个方法,我们在junit4中写单元测试得这么写: import junit.framework.TestCase; import org.junit.After; import org.junit.Before; import org.junit.Test; import static org.junit.Assert.*; /* * * author bean */ public class AddOperationTest extends TestCase public AddOperationTest() Before public void setUp() throws Exception After public void tearDown() throws Exception Test public void add() System.out.println(add); int x = 0; int y = 0; AddOperation instance = new AddOperation(); int expResult = 0; int result = instance.add(x, y); assertEquals(expResult, result); 几个元数据的介绍: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(“该方法还没有实现”),在执行的时候,仅会报告该方法没有实现,而不会运行测试方法。 另外还有一些其他的元数据,具体请自己查资料。setUp与tearDown,这两个函数是junit framework中提供初始化和反初始化每个测试方法的。setUp在每个测试方法调用前被调用,负责初始化测试方法所需要的测试环境;tearDown在每个测试方法被调用之后被调用,负责撤销测试环境。它们与测试方法的关系可以描述如下: 测试开始 - setUp - testXXXX - tearDown -测试结束 2另一个实例说明建立测试的流程(步骤):假设我们要写一个整数除法和乘法的类,并且给他写测试用例:1) 建立Math类Java代码1. /*2. *authorbimingwei3. *描述:一个整数除法和乘法的工具类4. */5. publicclassMath6. publicstaticintdivide(intx,inty)7. returnx/y;8. 9. 10. publicstaticintmultiple(intx,inty)11. returnx*y;12. 13. 2) 建立测试用例选中需要建立测试用例的包,选择new-other-JUnit Test Case。有5个方法可以选择:setUp()方法在测试方法前调用,一般用来做测试准备工作。tearDown()方法在测试方法后调用,一般作测试的清理工作。setUpBeforeClass()方法在整个类初始化之后调用,一般用来做测试准备工作。tearDownAfterClass()方法在整个类结束之前调用,一般作测试的清理工作。constructor()为是否包含构造方法。自动生成的代码如下:Java代码1. /*2. *author bimingwei3. *描述:4. */5. publicclassMathTest6. 7. BeforeClass8. publicstaticvoidsetUpBeforeClass()throwsException9. 10. 11. AfterClass12. publicstaticvoidtearDownAfterClass()throwsException13. 14. 15. Test16. publicvoidtestDivide()17. fail(Notyetimplemented);(注意重写该方法时,要将该语句删除)18. 19. 20. Test21. publicvoidtestMultiple()22. fail(Notyetimplemented);23. 24. 说明:BeforeClass标签注释的方法用于在整个类测试过程的初始化后调用一次,AfterClass标签注释的方法则是整个测试类结束之前调用一次。这2个标签的搭配可以避免使用Before、After标签组合在每个测试方法前后都调用的弊端,减少系统开销,提高系统测试速度。(不过对环境独立性要求较高的测试还是应当使用Before、After来完成)Test标签用来标注待测试的方法,按照类中声明的顺序执行。我们在testDivide方法加入测试代码,分别测试三种情况:a. 完全正确也没有可能出错的数据,如:9除3 结果必须等于3b. 可能有问题的边缘数据,如:10除3 结果也必须等于3c. 错误的数据,如:10除0 必须抛出异常忽略testMultiple方法代码如下:Java代码1. Test(expected=ArithmeticException.class)2. publicvoidtestDivide()3. assertEquals(3,Math.divide(9,3);4.
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号