您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 其它办公文档 > 21用Junit进行单元测试
NeusoftGroupLtd.Date:8/31/2007沈阳东软软件股份有限公司(版权所有,翻版必究)1BeyondTechnology单元测试NeusoftGroupLtd.Date:8/31/2007沈阳东软软件股份有限公司(版权所有,翻版必究)2目的与目标•理解单元测试基本概念•学会编写单元测试代码•掌握执行单元测试的方法NeusoftGroupLtd.Date:8/31/2007沈阳东软软件股份有限公司(版权所有,翻版必究)3引言z错误分布14%86%40%60%业界编码阶段错误数国内某企业编码阶段错误数NeusoftGroupLtd.Date:8/31/2007沈阳东软软件股份有限公司(版权所有,翻版必究)4单元测试基本概念•单元测试是什么?•单元测试什么时候做?•单元测试由谁来做?•单元测试测什么?•单元测试不测什么?NeusoftGroupLtd.Date:8/31/2007沈阳东软软件股份有限公司(版权所有,翻版必究)5单元测试是什么?•单元测试•是在软件开发过程中要进行的最低级别的测试活动,在单元测试活动中,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。•是从程序员的角度编写的,它确保类的某个特定方法能成功执行一系列特定的任务。每个测试都确保只要给定输入,方法将输出预期的结果NeusoftGroupLtd.Date:8/31/2007沈阳东软软件股份有限公司(版权所有,翻版必究)6单元测试什么时候做?•Codealittle,testalittle•Codeall,testallNeusoftGroupLtd.Date:8/31/2007沈阳东软软件股份有限公司(版权所有,翻版必究)7单元测试由谁来做?•单元测试是程序员的事•单元测试是编码的一部分•单元测试是程序员必备的一项基本素质NeusoftGroupLtd.Date:8/31/2007沈阳东软软件股份有限公司(版权所有,翻版必究)8•过程语言:函数、过程或完成某一功能的程序块•OO语言:类的成员函数单元测试测什么?NeusoftGroupLtd.Date:8/31/2007沈阳东软软件股份有限公司(版权所有,翻版必究)9单元测试测什么?•核心方法及可能引入错误的地方•特定边界条件•复杂算法•复杂的业务逻辑•需求变动频繁之处NeusoftGroupLtd.Date:8/31/2007沈阳东软软件股份有限公司(版权所有,翻版必究)10单元测试不测什么?•单元测试不测构造函数•单元测试不测setter()、getter()方法,如ActionForm的大部分方法•单元测试不测框架,如Struts框架NeusoftGroupLtd.Date:8/31/2007早期单元测试示例•测试目标:Factorial类•publicclassFactorial{•publicinteval(intnum){•returnnum*eval(num-1);//???•}•publicstaticvoidmain(String[]args){•Factorialapp=newFactorial();•intx=app.eval(3);•System.out.println(x==6);•}•}NeusoftGroupLtd.Date:8/31/2007早期单元测试方式的不足•代码膨胀由于加入了测试,所以产品代码比所需要的要大。但我们不想交付测试代码,而只想交付产品。•测试不可靠既然main()是代码的一部分,main()就对其他开发者通过类接口无法访问的私有成员和方法享有访问权。出于这个原因,这种测试方法很容易出错。•缺乏对自动测试的支持要进行自动测试,必须能够方便的收集测试结果以及对测试用例进行筛选,利用main()方法进行测试要做到这两点就比较麻烦。沈阳东软软件股份有限公司(版权所有,翻版必究)12NeusoftGroupLtd.Date:8/31/2007沈阳东软软件股份有限公司(版权所有,翻版必究)13JUnit简介•帮助开发人员测试Java代码的测试框架•OpenSource()•由ErichGamma和KentBeck(极限编程创始人)设计并实现NeusoftGroupLtd.Date:8/31/2007沈阳东软软件股份有限公司(版权所有,翻版必究)14JUnit定位JUnitis…JUnitisnot…作用范围单元测试集成测试系统结构框架,架构完整系统使用等级工具方法论测试用例手动产生自动产生测试实现代码部分手写全自动NeusoftGroupLtd.Date:8/31/2007JUnit架构NeusoftGroupLtd.Date:8/31/2007沈阳东软软件股份有限公司(版权所有,翻版必究)16学会编写单元测试代码•JUnit基础篇•JUnit进阶篇NeusoftGroupLtd.Date:8/31/2007沈阳东软软件股份有限公司(版权所有,翻版必究)17JUnit基础篇•自动产生测试框架•最简单的完整测试示例NeusoftGroupLtd.Date:8/31/2007沈阳东软软件股份有限公司(版权所有,翻版必究)18示例1FooFooTesttest1test2…junitTestCaseexercise1..*NeusoftGroupLtd.Date:8/31/2007沈阳东软软件股份有限公司(版权所有,翻版必究)19示例1待测代码packagecom.company;publicclassHelloWorld{publicStringsayHello(){returnHelloWorld;}}NeusoftGroupLtd.Date:8/31/2007沈阳东软软件股份有限公司(版权所有,翻版必究)20产生测试用例NeusoftGroupLtd.Date:8/31/2007沈阳东软软件股份有限公司(版权所有,翻版必究)21产生测试用例NeusoftGroupLtd.Date:8/31/2007沈阳东软软件股份有限公司(版权所有,翻版必究)22产生测试用例NeusoftGroupLtd.Date:8/31/2007沈阳东软软件股份有限公司(版权所有,翻版必究)23产生测试用例NeusoftGroupLtd.Date:8/31/2007沈阳东软软件股份有限公司(版权所有,翻版必究)24产生测试用例NeusoftGroupLtd.Date:8/31/2007沈阳东软软件股份有限公司(版权所有,翻版必究)25产生测试用例NeusoftGroupLtd.Date:8/31/2007沈阳东软软件股份有限公司(版权所有,翻版必究)26产生测试用例NeusoftGroupLtd.Date:8/31/2007沈阳东软软件股份有限公司(版权所有,翻版必究)27LessonLearned•Codealittle,testalittleNeusoftGroupLtd.Date:8/31/2007沈阳东软软件股份有限公司(版权所有,翻版必究)28示例2junitFooTestCaseexercise1..*TestRunnerrunFooTesttest1test2…NeusoftGroupLtd.Date:8/31/2007沈阳东软软件股份有限公司(版权所有,翻版必究)29示例2测试代码packagecom.company;importjunit.framework.*;publicclassHelloWorldTestextendsTestCase{publicHelloWorldTest(Stringname){super(name);}publicvoidtestSayHello(){StringexpectedReturn=HelloWorld;StringactualReturn=helloWorld.sayHello();assertEquals(returnvalue,expectedReturn,actualReturn);}继承:TestCase命名规则:xxxTest(类名称后加”Test”)命名规则:testXXX(测试方法前加”test”)断言(判断类实例的特性是否和你期待的一致)NeusoftGroupLtd.Date:8/31/2007沈阳东软软件股份有限公司(版权所有,翻版必究)30示例2测试代码[续]publicstaticvoidmain(String[]args){junit.swingui.TestRunner.run(HelloWorldTest.class);}}NeusoftGroupLtd.Date:8/31/2007沈阳东软软件股份有限公司(版权所有,翻版必究)31选择一个TestRunner•eclipseTestRunnerNeusoftGroupLtd.Date:8/31/2007沈阳东软软件股份有限公司(版权所有,翻版必究)32SwingUITestRunner•junit.swingui.TestRunner.run(HelloTest.class)NeusoftGroupLtd.Date:8/31/2007沈阳东软软件股份有限公司(版权所有,翻版必究)33TextUITestRunner•junit.textui.TestRunner.run(HelloTest.class)不推荐使用NeusoftGroupLtd.Date:8/31/2007沈阳东软软件股份有限公司(版权所有,翻版必究)34LessonLearned•Generate&exercisetestcase(s)–Writetest…()method(s)•Verify–ChooseaAssert.assert…()•ChooseaTestRunner–junit.textui.TestRunner–junit.swingui.TestRunner•Failurevs.errorNeusoftGroupLtd.Date:8/31/2007沈阳东软软件股份有限公司(版权所有,翻版必究)35JUnit进阶篇•Fixture/context管理•Testsuite•其他特性•断言类别•测试代码编写步骤•最佳实践NeusoftGroupLtd.Date:8/31/2007沈阳东软软件股份有限公司(版权所有,翻版必究)36示例3junitFooTestCaseexercise1..*TestRunnerrun1..*FooTesttest1test2…setUp()tearDown()NeusoftGroupLtd.Date:8/31/2007沈阳东软软件股份有限公司(版权所有,翻版必究)37publicclassMoneyimplementsCloneable{privateintfAmount;privateStringfCurrency;publicMoney(intamount,Stringcurrency){/*...*/}publicMoneyadd(Moneym){if(m==null)return(Money)clone();returnnewMoney(amount()+m.amount(),currency());}publicObjectclone(){/*...*/}publicbooleanequals(Objectobj){/*...*/}publicintamount(){/*...*/}publicStringcurrency(){/*...*/}}示例3待测代码NeusoftGroupLtd.Date:8/31/2007沈阳东软软件股份有限公司(版权所有,翻版必究)38Fixture•setUp():•用来初始化对象为某种特定状态、准备数据等。•tearDown():•用来撤销初始化、销毁数据。NeusoftGroupLtd.Date:8/31/2007沈阳东软软件股份有限公司(版权所有,翻版必究)39示例3测试代码publicclassMon
本文标题:21用Junit进行单元测试
链接地址:https://www.777doc.com/doc-4413217 .html