您好,欢迎访问三七文档
单元测试第五讲单元测试介绍使用JUNIT测试的一些技巧边界条件ant与JUnit本章内容单元测试单元测试是开发者写的一小段代码,用于检验被测代码的一个很小的、明确的功能是否正确。通常而言,一个单元测试是用于判断某个特定条件下某个特定的函数的行为。执行单元测试,是为了证明某段代码的行为确定和开发者所期望的一致。及早发现软件开发过程中实现或者设计带来的缺陷跟踪详细设计文档中设计的实现,发现详细设计文档中存在的错误验证单元代码和详细设计文档的一致性发现在编码过程中引入的错误单元测试的目的单元测试标准通常为详细设计说明书但是在没有详细设计说明书的情况下可以以注释为测试标准单元测试标准是什么单元测试计划单元测试设计单元测试实现单元测试执行单元测试评估单元测试过程时间表工作量任务分配资源安排测试工具结束标准风险分析风险应对输出单元测试计划文档单元测试计划单元测试设计对哪些单元进行测试被测单元的关系被测单元与其他模块的关系测试策略选择如何设计测试用例如何设计单元测试代码输出单元测试用例文档单元测试实现编写测试用例编写测试规程测试脚本编写测试驱动构建桩构建输出测试用例输出测试规程输出测试代码和脚本单元测试执行搭建测试环境执行测试脚本记录测试结果跟踪缺陷回归测试输出单元测试报告单元测试策略自顶向下的单元测试方法先对最顶层的单元进行测试,把顶层单元所调用的单元做成桩模块。其次对第二层单元进行测试,使用上面已测试的单元做驱动模块。依次类推直至测试完所有的模块。优点可以节省驱动函数开发的工作量,测试效率较高缺点随着被测单元一个个的加入,测试过程将变得复杂,并且开发和维护的成本将增加。自底向上的单元测试孤立的单元测试混合的单元测试单元测试策略自底向上的单元测试先对最底层的单元进行测试,模拟主调单元构建驱动模块。然后再对上面一层做单元测试,用下面已经测试通过的模块做桩模块。依次类推,直至测试完所有的模块。优点可以节省桩模块开发的工作量,测试效率高缺点不是纯粹的单元测试,底层函数的测试质量对上层函数的测试将产生很大的影响。单元测试策略孤立的单元测试方法不考虑模块和模块之间的关系,为每个模块设立桩模块和驱动模块。每个模块进行独立的单元测试优点该策略最简单,最容易操作。可以达到很高的覆盖率。似乎纯粹的单元测试缺点该策略效率很低,需要构建大量的驱动和桩单元测试策略混合的单元测试自顶向下和自底向上的测试策略综合了集成的概念,随着单元测试的进行,可以看到系统一个初步集成的概貌,但是测试覆盖率会越来越难保证。并且在每个单元测试之前必须保证相关的单元的正确性。孤立的测试策略比较独立,覆盖率容易保证,并且可以并行进行,但工作量大。所以采用混合方法比较好。单元测试用例设计单元测试用例设计方法黑盒白盒单元测试用例编写思路为系统运行起来设计测试用例为正向测试设计用例为逆向测试设计用例为满足特殊需求而设计用例为代码覆盖而设计测试用例单元测试用例设计要点单元测试用例设计五要点单元接口局部数据结构独立路径出错处理边界条件JunitJunit测试框架的第一个和最杰出的应用就是由ErichGamma(《设计模式》的作者)和KentBeck(XP(ExtremeProgramming)的创始人)提供的开放源代码的JUnit。Junit框架run()interfaceTestfNamesetUp()runTest()tearDown()run()TestCaserun()addTest()TestSuite*TestResultjunit.frameworkassertTrue()assertEquals()...Assertjunit.textui.TestRunnerjunit.swingui.TestRunnerAssert断言AssertMethodsummaryMethodDescriptionassertEquals()进行等值比较assertFalse()进行boolean值比较assertTrue()进行boolean值比较assertNull()比较对象是否为空assertNotNull()比较对象是否不为空assertSame()对2个对象应用的内存地址进行比较.assertNotSame对2个对象应用的内存地址进行比较fail()引发当前测试失败,通常用于异常处理JUnit4与JUnit3的区别测试类不必再从junit.framework.TestCase派生了;测试方法也不必再以“test”作为前缀,而是代之以@Test注解来表示;作为Fixtures的setUp与tearDown也不再强制使用这两个方法名了,只要在任何方法名称前冠以@Before或@After,即可达到一样的效果;对setUp/tearDown的一大改进还包括,可以限定二者只在整个testcase范围内执行一次,这是通过@BeforeClass和@AfterClass注解达成的;@Test注解还可以带上timeout参数和expected参数,前者代表测试方法超过指定时间即被认为失败,后者则声明了预期被抛出的异常类型。JUnit4与JUnit3的区别publicstaticTestgetTest(){TestSuitesuite=newTestSuite(测试项目);suite.addTestSuite(TestA.class);suite.addTestSuite(TestB.class);returnsuite;}publicstaticvoidmain(String[]args){junit.textui.TestRunner.run(getTest());}@RunWith(Suite.class)@SuiteClasses({TestA.class,TestB.class})publicclassMain{}JUnit与Eclipse集成JUnit与Eclipse集成测试案例需求:定义一个人命币小写转换成大写的方法。要求输入的返回数字为=0并且小于万万亿。小数点只保留到分。输入:23423322111233.2731输出:贰拾叁万肆仟贰佰叁拾叁亿贰仟贰佰壹拾壹万壹仟贰佰叁拾叁元贰角柒分程序实现privatestaticString[]text=newString[]{元,拾,佰,仟,万,拾,佰,仟,亿,拾,佰,仟,万,拾,佰,仟};privatestaticString[]numText=newString[]{零,壹,贰,叁,肆,伍,陆,柒,捌,玖};程序实现DecimalFormatformat=newDecimalFormat(#,##0.00);Stringstrmoney=format.format(money);String[]tmp=strmoney.split(\\.);StringBuilderresult=newStringBuilder();//转换小数部分Stringjiao=numText[Character.digit(tmp[1].charAt(0),10)];Stringfen=numText[Character.digit(tmp[1].charAt(1),10)];result.append(分).append(fen).append(角).append(jiao);//转换整数部分longmoneynum=(long)money;StringBuildermoneynumstr=newStringBuilder();moneynumstr.append(moneynum);moneynumstr.reverse();for(inti=0;imoneynumstr.length();i++){result.append(text[i]).append(numText[Character.digit(moneynumstr.charAt(i),10)]);}returnresult.reverse().toString();设计单元测试用例路径覆盖:3456789012345.4442边界值分析:10000000000000000.00,9999999999999999.99,9999999999999999.98边界值分析:-0.1,0,0.1等价类划分:大于万万亿,889898989.898989,-1231231.909参数化@RunWith(Parameterized.class)@ParameterspublicstaticCollectiondata(){returnArrays.asList(newObject[][]{{e,abcd},{e,abce}});}@TestpublicvoidtestB(){Assert.assertEquals(result,b.add(param));}Ant介绍Ant是一个构建工具,是一个小程序。但是它通过自动完成所有的编译代码,运行测试以及打包重新部署的结果等繁琐费力的任务来帮助软件团队开发大程序.Ant使用Java编写,跨平台,易使用且可伸缩。既可以用在小型个人项目中,也可以用于大型多团队软件项目。Ant的目标是自动完成所有的构建过程。Ant安装下载:当前最新版本是1.9.3配置环境变量:验证Ant是否正常:命令行输入ant-versionBuilder.xml文件介绍Project:一个builder.xml文件就是一个项目name:名称default:默认任务basedir:本项目中当前路径为Property介绍property:用于设置当前builder.xml文件中需要用到的变量name:变量名value:变量值在文件的其他地方使用变量方法为:${变量名}pathPath:编译以及运行所依赖的classpathpathid=classpath.runpathelementpath=${class.dir}/filesetdir=${lib}includename=*.jar//fileset/pathTarget任务target:描述需要完成的任务,name:名称depends:依赖关系,比如该任务需要在其他任务完成之后才能运行可通过该属性来描述常用操作delete:删除文件mkdir:创建文件夹deletedir=${test.report}/deletemkdirdir=${test.report}/mkdirjavac:编译javacdestdir=${class.dir}srcdir=${src.dir}classpathrefid=classpath.run//javacJUnitjunitprintsummary=onfailureProperty=failsyspropertykey=file.encodingvalue=UTF-8/classpathrefid=classpath.run/classpathformattertype=xml/formatterbatchtesttodir=${test.xml}filesetdir=${class.dir}includename=**/Test*.class/include/fileset/batchtest/junitjunitreportjunitreporttodir=${test.xml}filesetdir=${test.xml}includename=TEST-*.xml/include/filesetreportformat=framestodir=${test.report}/re
本文标题:第五讲单元测试.
链接地址:https://www.777doc.com/doc-2085452 .html