单元测试工具Junit_第1页
单元测试工具Junit_第2页
单元测试工具Junit_第3页
单元测试工具Junit_第4页
单元测试工具Junit_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、单元测试工具单元测试工具Junit本章目标本章目标n单元测试的目的单元测试的目的n掌握如何利用掌握如何利用Junit编写简单测试编写简单测试n了解了解Junit的基本框架的基本框架引入引入n测试驱动开发测试驱动开发(”(Test-Driven Development, 简称简称TDD) 是极限编程是极限编程(Extreme programming 简称简称XP)的重要特点的重要特点n以持续性的测试来推动代码的开发,即可以简化代以持续性的测试来推动代码的开发,即可以简化代码,又可以保证质量。它改变了先编写代码,后编码,又可以保证质量。它改变了先编写代码,后编写测试,而是先编写测试,然后在编写代码

2、来满足写测试,而是先编写测试,然后在编写代码来满足测试的方法。测试的方法。n这样使得测试工作不仅仅是单纯的测试,而成为了这样使得测试工作不仅仅是单纯的测试,而成为了设计的一部分。当你习惯了这种编程方式之后,你设计的一部分。当你习惯了这种编程方式之后,你会发现,会发现,TDD会成为你的得力助手。会成为你的得力助手。nJunit可以成为一个可以成为一个TDD或单元测试很好的工具或单元测试很好的工具 JUnit的目标的目标nJUnit 就是为就是为 Java 程序开发者实现单元测试程序开发者实现单元测试提供一种框架,使得提供一种框架,使得 Java 单元测试更规范有单元测试更规范有效,并且更有利于测

3、试的集成效,并且更有利于测试的集成n框架的三个目标框架的三个目标n第一个是简化测试的编写,这种简化包括测试框架第一个是简化测试的编写,这种简化包括测试框架的学习和实际测试单元的编写;的学习和实际测试单元的编写;n第二个是使测试单元保持持久性;第二个是使测试单元保持持久性;n第三个则是可以利用既有的测试来编写相关的测试。第三个则是可以利用既有的测试来编写相关的测试。一个例子:一个例子:独立静态方法,查找独立静态方法,查找list中的最大值中的最大值package TestOne;public class Largest public static int largest(int list) as

4、sertTrue(a=2); assertEquals(a,b);一个例子一个例子一个例子一个例子package TestOne;import junit.framework.*;public class TestLargest extends TestCasepublic TestLargest(String name)super(name);public void testSimple() assertEquals(9,Largest.largest(new int7,8,9);完善独立静态方法完善独立静态方法largest,package TestOne;public class Lar

5、gest public static int largest(int list) int index,max=Integer.MAX_VALUE; for (index=0;indexmax)max=listindex; /end if/end forreturn max; /end function largest 一个例子一个例子一个例子一个例子n测试出现错误测试出现错误n修改修改一个例子:一个例子:独立静态方法,查找独立静态方法,查找list中的最大值中的最大值package TestOne;public class Largest public static int largest(i

6、nt list) int index,max=Integer.MAX_VALUE; for (index=0;indexmax)max=listindex; /end if/end forreturn max; /end function largest 0一个例子一个例子n【思考】用哪些数组来进行测试【思考】用哪些数组来进行测试n考虑:考虑:n最大数的位置变化:最左、中间、最右最大数的位置变化:最左、中间、最右n数组只有一个数数组只有一个数n数组中有负数、相同的数数组中有负数、相同的数n测试为空测试为空一个例子一个例子n最大数的位置变化:最左、中间、最右最大数的位置变化:最左、中间、最右nP

7、ublic void testOrder()nassertEquals(9,Largest.largest(new int7,8,9);nassertEquals(9,Largest.largest(new int7,9,8);nassertEquals(9,Largest.largest(new int9,7,8);nn出现错误,原因?出现错误,原因?n数组只有一个数数组只有一个数npublic void testOne()nassertEquals(9,Largest.largest(new int9);n一个例子一个例子n数组中有负数数组中有负数npublic void testNega

8、tive()nassertEquals(-3,Largest.largest(new int-6,-5,-3);nn出现错误,原因?出现错误,原因?一个例子一个例子n测试为空测试为空npublic void testEmpty()ntrynLargest.largest(new int);nfail(抛出一个异常抛出一个异常);ncatch(RuntimeException e)nassertTrue(true);nnn修改考虑数组为空的情况抛出异常修改考虑数组为空的情况抛出异常nif (list.length=0)nthrow new RuntimeException(Empty list)

9、;nLesson LearnednCode a little, test a little三三 使用使用JUnit进行单元测试进行单元测试n构建单元测试构建单元测试nJUnit的各种断言的各种断言nJunit的框架的框架nJunit软件结构软件结构n自定义自定义JUnit断言断言nJUnit和异常和异常3.1 构建单元测试构建单元测试n命名习惯命名习惯n如果有一个需要测试的如果有一个需要测试的createAccount方方法,则相应的测试方法应取名为法,则相应的测试方法应取名为testCreateAccountn当然还有很多其他相关的测试方法,也必须当然还有很多其他相关的测试方法,也必须取名为

10、取名为testXxx3.1 构建单元测试构建单元测试n测试代码的准备工作测试代码的准备工作n准备测试所需要的各种条件:创建对象、分准备测试所需要的各种条件:创建对象、分配资源配资源n选择要测试的方法,设计测试用例。选择要测试的方法,设计测试用例。n验证被测试方法的行为与期望是否一致验证被测试方法的行为与期望是否一致n完成后清理资源完成后清理资源3.2 JUnit的断言的断言nJUnit给定的函数,帮助确定被测试函数给定的函数,帮助确定被测试函数是否工作正常,这些函数统称为断言。是否工作正常,这些函数统称为断言。它是单元测试的最基本组成部分它是单元测试的最基本组成部分n每个函数都会记录失败或者错

11、误,并通每个函数都会记录失败或者错误,并通过过JUnit的类来包裹错误。的类来包裹错误。n在控制台上将通过红色条及辅助信息来在控制台上将通过红色条及辅助信息来说明。说明。JUnit 的断言的断言nassertEquals(Object expected,Object actual):两个对象是否相同:两个对象是否相同nassertEquals(int expected,int actual):原始类型是否相同。原始类型是否相同。nassertNull:指针是否为空:指针是否为空nassertSame assertEquals(Object expected,Object actual): 两个

12、对象的结两个对象的结构是否相同构是否相同nassertTrue(boolean condition):是否返:是否返回真值回真值3.2 JUnit的各种断言的各种断言nassertEquals(String message, expected, actual,tolerance)比较两个对象是否相等比较两个对象是否相等nexpected是期望值,是期望值,actual是被测试代码实际产是被测试代码实际产生的值生的值n特殊:数字组(引用本身),浮点数需要格外的误特殊:数字组(引用本身),浮点数需要格外的误差参数差参数nassertEquals(“shoule be 3 1/3”, 3.33, 1

13、0.0/3.0, 0.01)3.2 JUnit的各种断言的各种断言nassertNull(String message,Object))nassertNotNull(String message,Object))n验证一个给定的对象是否为空或非空验证一个给定的对象是否为空或非空3.2 JUnit的各种断言的各种断言nassertSame (String message,Object expected,Object actual):n两个对象是否引用同一对象两个对象是否引用同一对象3.2 JUnit的各种断言的各种断言nassertTrue(String message,boolean cond

14、ition):n验证条件二元条件是否返回真值验证条件二元条件是否返回真值3.2 JUnit的各种断言的各种断言nFail(String message)n上面的断言会使测试立即失败上面的断言会使测试立即失败n用于标记某个不该到达的分支,如一个用于标记某个不该到达的分支,如一个预期发生的异常。预期发生的异常。JUnit和异常和异常n两种需要关注的异常两种需要关注的异常n从测试代码抛出的可预测异常从测试代码抛出的可预测异常n由于模块发生严重错误而抛出不可预测异常由于模块发生严重错误而抛出不可预测异常n例如例如 测试实例中数值为空的情况测试实例中数值为空的情况public void testEmpt

15、y()tryLargest.largest(new int);fail(抛出一个异常抛出一个异常);catch(RuntimeException e)assertTrue(true);测试与异常测试与异常n虽然你可以自己捕捉部分异常,但建议虽然你可以自己捕捉部分异常,但建议有些出乎意料异常还是让有些出乎意料异常还是让JUnit来完成来完成n可以写出可以写出npublic void testData() throws FileNoFoundExcepiton enFileInputStream f=new fileInputStream(“data.txt”);n3.2 JUnit的各种断言的各

16、种断言n断言一旦失败,测试方法就停止,那么断言一旦失败,测试方法就停止,那么该方法其他的断言就无法执行该方法其他的断言就无法执行n只能修复好失败的测试,一步一步的前只能修复好失败的测试,一步一步的前进。进。n只有当所有的测试都通过了,你才能够只有当所有的测试都通过了,你才能够增加新的特性增加新的特性n那么如何运行一组测试呢?那么如何运行一组测试呢?3.3 JUnit框架框架n如何运行测试呢?如何运行测试呢?n需要一个框架需要一个框架测试框架测试框架 import junit.framework.*;public class TestSimplet extends TestCase public

17、 TestSimple (String name) super(name); public void testAdd() assertEquals(2, 1+1); assertEquals(-1, -3+2); 导入所需的导入所需的JUnit类类创建创建TestCase类类的子类的子类每一个测试都每一个测试都是一个方法是一个方法判断是否相等判断是否相等创建以创建以String为参为参数的构造函数,调数的构造函数,调用用super方法方法实例一实例一FoojunitTestCaseexercise1.*FooTesttest1test2n按照框架规定:编写的所有测试类,必须继承自按照框架规定:

18、编写的所有测试类,必须继承自 junit.framework.TestCase类;类;n里面的测试方法,命名应该以里面的测试方法,命名应该以 Test 开头,必须是开头,必须是 public void 而且不能有参数;而且不能有参数;n为了测试查错方便,尽量一个为了测试查错方便,尽量一个 TestXXX 方法对一个方法对一个功能单一的方法进行测试;功能单一的方法进行测试;n使用使用 assertEquals等等 junit.framework.TestCase 中的断言方法来判断测试结果正确与否。中的断言方法来判断测试结果正确与否。n在这个测试类中有加入多少个测试方法,就会运行多在这个测试类中

19、有加入多少个测试方法,就会运行多少个测试方法。少个测试方法。测试相关规则测试相关规则3.4 JUnit 的软件结构的软件结构 nJUnit 共有七个包共有七个包n核心的包就是核心的包就是junit.framework和和 junit.runner nframework负责整个测试对象的构架负责整个测试对象的构架nrunner负责测试驱动。负责测试驱动。nTestCase、TestSuite 和和 BaseTestRunner是是 JUnit 框架的骨干。一旦理解了这框架的骨干。一旦理解了这 3 个类个类的工作方式,就可以随心所欲地编写测试了。的工作方式,就可以随心所欲地编写测试了。nTestC

20、ase (测试用例测试用例)扩展了扩展了JUnit 的的 TestCase TestCase 类的类。类的类。n它以它以 testXxx 方法的形式包含一个或多个测方法的形式包含一个或多个测试。一个试。一个 test case 把具有公共行为的测试归把具有公共行为的测试归入一组。入一组。n当提到测试的时候,指的是一个当提到测试的时候,指的是一个 testXxx方法;方法;当提及当提及 test case 的时候,指的是一个继承自的时候,指的是一个继承自Testcase 的类,也就是一组测试。的类,也就是一组测试。3.4 JUnit 的软件结构的软件结构nTestSuite(测试集合测试集合)一

21、组测试。一个一组测试。一个test suite 是把多个相关测试归入一组的便捷方式。是把多个相关测试归入一组的便捷方式。n如果你没有为如果你没有为 TestCase 定义一个定义一个 test suite,那么,那么 JUnit 就会自动提供一个就会自动提供一个 test suite,包含,包含 TestCase 中所有的测中所有的测试。试。nTestRunner(测试运行器测试运行器)执行执行 test suite 的程的程序。序。nJUnit 提供了几个提供了几个 test runner,可以用它们来执行测试。,可以用它们来执行测试。n没有没有 TestRunner 接口,只有一个所有接口

22、,只有一个所有 test runner 都继都继承的承的 BaseTestRunner。n当编写当编写 TestRunner 的时候,实际上指的是任何继承的时候,实际上指的是任何继承 BaseTestRunner 的的 test runner 类。类。3.4 JUnit 的软件结构的软件结构TestCaseTestSuiteBaseTestRunnerTestResult+=JUnit 成员共同产生测试结果成员共同产生测试结果3.4 JUnit 的软件结构的软件结构n当需要编写更多的当需要编写更多的 test case 的时候,可以创的时候,可以创建更多的建更多的 TestCase 对象。对象

23、。n当需要一次执行多个当需要一次执行多个 TestCase 对象的时候,对象的时候,可以创建另一个叫做可以创建另一个叫做 TestSuite 的对象。的对象。n为了执行为了执行TestSuite,需要使用,需要使用 TestRunnern在正常情况下,只需要编写在正常情况下,只需要编写test case,其他类会协助完成测试。其他类会协助完成测试。n这这 3 个类和另外个类和另外 4 个类紧密配合,形成个类紧密配合,形成了了 JUnit 框架的核心。下表归纳了这框架的核心。下表归纳了这 7 个核心类各自的责任。个核心类各自的责任。3.4 JUnit 的软件结构的软件结构类类/接口接口 责责 任

24、任 Assert当条件成立时 assert 方法保持沉默,但若条件不成立就抛出异常 TestResultTestResult 包含了测试中发生的所有错误或者失败包含了测试中发生的所有错误或者失败Test可以运行可以运行 Test 并把结果传递给并把结果传递给 TestResultTestListener测试中若产生事件测试中若产生事件(开始、结束、错误、失败开始、结束、错误、失败)会通知会通知 TestListenerTestCaseTestCase 定义了可以用于运行多项测试的环境定义了可以用于运行多项测试的环境TestSuiteTestSulte 运行一组运行一组 test ease (它

25、们可能包含其他它们可能包含其他 testsuite),它是,它是Test的组合的组合BaseTestRunnertest runner 是用来启动测试的用户界面,是用来启动测试的用户界面,BaseTestRunner 是所有是所有 test runner 的超类的超类JUnit 框架的基本结构框架的基本结构run()TestfNamesetUp()runTest()tearDown()run()TestCaserun()addTest()TestSuite*TestResultjunit.frameworkassertTrue()assertEquals().Assertjunit.textui.TestRunnerjunit.swingui.TestRunner3.5 自定义自定义JUnit断言断言n通常标准断言对大多数测试已经够用,通常标准断言对大多数测试已经够用,但在某些环境下可能要处理特殊数据类但在某些环境下可能要处理特殊数据类型或多个测试共享的操作,就需要自定型或多个测试共享的操作,就需要自定义断言。义断言。n如测试一个经济方面的程序且所有测试如测试一个经济方面的程序且所有测试都使用了都使用了Money数据类型数据类型3.5 自定义自定义JUnit断言断

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论