您好,欢迎访问三七文档
JUnit南京大学软件学院20091课程内容•单元测试简介•JUnit简介•JUnit核心类/接口•JUnit单元测试的步骤•JUnit实例•JUnit在Eclipse下的使用•JUnit最佳实践什么是软件测试•为了发现错误而执行程序的过程•IEEE提出的软件工程标准术语中,软件测试被定义为:“使用人工和自动手段来运行或测试某个系统的过程,其目的在于检验它是否满足规定的需求或弄清楚预期结果与实际结果之间的差别。”测试类型•单元测试•集成测试•功能测试•压力/负荷测试•验收测试单元测试•单元测试是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确•通常而言,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数的行为单元测试的方法•人工静态分析:通过人工阅读代码的方式来查找代码中存在的错误•自动静态分析:使用代码复查工具,主要用来发现语法特征错误•自动动态测试:用工具自动生成测试用例并执行被测程序,主要用来发现行为特征错误•人工动态测试:人工设定程序的输入和预期输出,执行程序,判断实际输出是否符合预期,若不符则自动报告错误。利用JUnit完成的便是人工动态测试单元测试的必要性•带来比功能测试更广范围的测试覆盖•让团队协作成为可能•能够防止衰退,降低对调试的需要•能为我们带来重构的勇气•能改进实现设计•当作开发者文档使用JUnit简介•JUnit是Java社区中知名度最高的单元测试工具。由ErichGamma和KentBeck共同开发完成•开源软件•支持语言–Smalltalk,Java,C++,Perl等等•支持的IDE–JBuilder,VisualAge,Eclipse等JUnit功能•可供选择的其他前端或者test-runner,用来显示你的测试结果•用单独的classloader来运行每个单元测试,以避免副作用•标准的资源初始化和回收方式(setUp和tearDown)•各种不同的assert方法,让你检查测试结果的操作变得更容易•同流行的工具,比如Ant,以及流行IDE比如Eclipse,JBuilder整合JUnit的好处•开源工具,可以免费使用,可以找到很多实际项目中的应用示例。由于源码开放,开发者还可以根据需要扩展JUnit功能•可以将测试代码和产品代码分开•测试代码编写容易,功能强大•自动检验结果并且提供立即的反馈•易于集成到开发的构建过程中,在软件的构建过程中完成对程序的单元测试•测试包结构便于组织和集成运行,支持图形交互模式和文本交互模式JUnit安装•Java的JUnit可从网上免费下载•将下载的junit.zip解压到你指定的目录•设置环境变量–Variable:CLASSPATH–VariableValue:.;InstallPath/junit.jar•测试运行(进入命令提示符安装目录下)–javajunit.swingui(textui,awtui).TestRunnerjunit.samples.AllTestsJUnit框架run()interfaceTestfNamesetUp()runTest()tearDown()run()TestCaserun()addTest()TestSuite*TestResultjunit.frameworkassertTrue()assertEquals()...Assertjunit.textui.TestRunnerjunit.swingui.TestRunnerJUnit核心类及接口(1)JUnit核心类及接口(2)•TestRunner(测试运行器)–没有TestRunner接口,只有一个所有TestRunner都继承的BaseTestRunner–执行测试并提供相关的结果的统计信息•包含三个TestRunner类–一个用于文本控制台–一个用于Swing–还有一个AWT(遗产代码,很少有人用)JUnit核心类及接口(3)•TestRunner(测试运行器)–实际运用中的Swingtestrunner–Greenbar通过测试–Redbar测试失败JUnit核心类及接口(4)•TestCase(测试用例)–把具有公共行为的测试归入一组–扩展了JUnit的TestCase类的类。它以testXXX方法的形式包含一个或多个测试–典型的TestCase包含两个主要部件•fixture•单元测试JUnit核心类及接口(5)•TestCase(测试用例)–Fixture•管理资源,复用配置代码•运行一个或多个测试所需的公用资源或者数据集合•TestCase通过setUp和tearDown方法来创建和销毁fixture•典型应用数据库连接,生成输入文件JUnit核心类及接口(6)•TestCase(测试用例)–创建单元测试方法•继承自TestCase的一组assert方法封装了最常见的测试任务,这些assert方法可以极大地简化单元测试的编写Assert超类所提供的8个核心方法JUnit核心类及接口(7)•TestCase(测试用例)–创建单元测试方法•除了Assert提供的方法之外,TestCase还实现了10个它自己的方法•coutTestCases,CreateResult,getName,run,runBare,setName,setup,teardown,toStringTestCase的10个自己的方法JUnit核心类及接口(8)•TestCase(测试用例)–这18个方法共同为你提供了使用JUnit编写测试的全部功能JUnit核心类及接口(9)•TestSuite(测试集合)–testsuite是把多个相关测试归入一组便捷方式–若你没有提供自己的TestSuite,testrunner会自动创建一个–缺省的TestSuite不能满足时,可能会想组合多个suite,把它们作为主suite的一部分,这些suite来自几个不同的packageJUnit核心类及接口(10)•TestSuite(测试集合)–通常情况下TestAll类仅仅包括一个静态的suite方法,这个方法会注册应用程序需要定期执行的所有Test对象(包括TestCase对象和TestSuite对象),下面是一个典型的TestAll类TestAll类importjunit.framework.Test;importjunit.framework.TestSuite;importjunitbook.sampling.TestDefaultController;publicclassTestAllextendTestCase{publicstaticTestsuite(){TestSuitesuite=newTestSuite(Alltestsfrompart1);suite.addTestSuite(TestCalculator3.class);suite.addTestSuite(TestDefaultController.class);returnsuite;}}JUnit核心类及接口(11)•TestResult–所有的TestSuite都有一个对应的TestResult–负责收集TestCase的执行结果。储存了所有测试的详细情况,是通过还是失败。失败则会创建一个TestFailure对象–TestRunner使用TestResult来报告测试结果。没有TestFailure对象进度条就用绿色,否则进度条用红色并输出失败测试的数目JUnit核心类及接口(12)•TestResult–JUnit区分失败和错误•失败:是可以预期的,代码的改变不时会造成断言失败,你只要修正代码,断言就可以再次通过•错误:比如常规程序抛出的异常,则是测试时不可预料的JUnit核心类及接口(13)•TestListener–帮助对象访问TestResult并创建有用的报告。–虽然Testlistener接口是JUnit框架的重要部分,但是你编写自己的测试时不必实现这个接口。只有需要扩展JUnit框架时才会需要实现这个接口JUnit单元测试的步骤(1)•JUnit成员三重唱,共同产生测试结果–当你需要编写更多的TestCase的时候,你可以创建更多的TestCase对象。当你需要一次执行多个TestCase对象的时候,您可以创建一个TestSuite对象或使用缺省的TestSuite对象进行封装。为了执行TestSuite,需要使用TestRunner。通过TestRunner的执行生成TestResult对象JUnit单元测试的步骤(2)1.重载setUp(),封装测试环境初始化及测试数据准备2.设计测试方法,以testXXX命名3.在测试方法中使用断言方法如assertEquals(),assertTrue()等4.设计测试套件,或使用缺省的测试套件,调用TestRunner执行测试脚本,生成测试结果5.重载tearDown()析构测试环境,执行收尾动作待测类publicclassCalculator{publicintadd(inta,intb){returna+b;}publicintminus(inta,intb){returna-b;}publicintmultiply(inta,intb){returna*b;}publicintdivide(inta,intb)throwsException{if(0==b){thrownewException(除数不能为零!);}returna/b;}}该类的测试类[1/4]publicclassCalculatorTestextendsTestCase{privateCalculatorcal;publicvoidsetUp(){cal=newCalculator();}publicvoidtearDown(){}测试类必须以TestCase为父类每个测试方法执行前都会调用该方法析构测试环境,执行收尾动作生成对象该类的测试类[2/4]publicvoidtestAdd(){intresult=cal.add(1,2);Assert.assertEquals(3,result);}publicvoidtestMinus(){intresult=cal.minus(1,2);Assert.assertEquals(-1,result);}publicvoidtestMultiply(){intresult=cal.multiply(2,3);Assert.assertEquals(6,result);}Junit3.8测试方法需满足:1)Public的2)Void的3)无方法参数4)方法名称必须以test开头断言调用该方法该类的测试类[3/4]publicvoidtestDivide(){intresult=0;try{result=cal.divide(6,4);}catch(Exceptione){e.printStackTrace();Assert.fail();}Assert.assertEquals(1,result);}期望该行代码永远不会被执行,断言失败,停止执行立即失败该类的测试类[4/4]publicvoidtestDivide2(){Throwabletx=null;try{cal.divide(4,0);Assert.fail();}catch(Exceptionex){tx=ex;}Assert.assertNotNull(tx);Assert.assertEquals(Exception.class,tx.getClass());Assert.assertEquals(除数不能为零!,tx.getMessage());}}一个方法可以有多个测试方法,输入的不同情况会有不同的testcase出现tx是Exception类型的一旦发生异常,则tx一定不为空期望该行代码永远不会被执行,断言失败,停止执行立即失败同时测试多个类(1)•现有两个测试类–Calcu
本文标题:JUnit南大
链接地址:https://www.777doc.com/doc-5750262 .html