




已阅读5页,还剩11页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
JUnit中常用的接口和类Test接口运行测试和收集测试结果1. Test接口使用了Composite设计模式,是单独测试用例 (TestCase),聚合测试模式(TestSuite)及测试扩展(TestDecorator)的共同接口。 2. 它的public int countTestCases()方法,它来统计这次测试有多少个TestCase,另外一个方法就是public voidrun( TestResult ),TestResult是实例接受测试结果, run方法执行本次测试。TestCase抽象类定义测试中固定方法1. TestCase是Test接口的抽象实现,(不能被实例化,只能被继承)其构造函数TestCase(string name)根据输入的测试名称name创建一个测试实例。由于每一个TestCase在创建时都要有一个名称,若某测试失败了,便可识别出是哪个测试失败。 2. TestCase类中包含的setUp()、tearDown()方法。setUp()方法集中初始化测试所需的所有变量和实例,并且在依次调用测试类中的每个测试方法之前再次执行setUp()方法。tearDown()方法则是在每个测试方法之后,释放测试程序方法中引用的变量和实例。 3. 开发人员编写测试用例时,只需继承TestCase,来完成run方法即可,然后JUnit获得测试用例,执行它的run方法,把测试结果记录在TestResult之中。Assert静态类一系列断言方法的集合1. Assert包含了一组静态的测试方法,用于期望值和实际值比对是否正确,即测试失败,Assert类就会抛出一个AssertionFailedError异常,JUnit测试框架将这种错误归入Failes并加以记录,同时标志为未通过测试。如果该类方法中指定一个String类型的传参则该参数将被做为AssertionFailedError异常的标识信息,告诉测试人员改异常的详细信息。 2. JUnit 提供了6大类31组断言方法,包括基础断言、数字断言、字符断言、布尔断言、对象断言。 3. 其中assertEquals(Object expcted,Object actual)内部逻辑判断使用equals()方法,这表明断言两个实例的内部哈希值是否相等时,最好使用该方法对相应类实例的值进行比较。而assertSame(Object expected,Object actual)内部逻辑判断使用了Java运算符“=”,这表明该断言判断两个实例是否来自于同一个引用(Reference),最好使用该方法对不同类的实例的值进行比对。asserEquals(String message,String expected,String actual)该方法对两个字符串进行逻辑比对,如果不匹配则显示着两个字符串有差异的地方。ComparisonFailure类提供两个字符串的比对,不匹配则给出详细的差异字符。TestSuite测试包类多个测试的组合1. TestSuite类负责组装多个Test Cases。待测得类中可能包括了对被测类的多个测试,而TestSuit负责收集这些测试,使我们可以在一个测试中,完成全部的对被测类的多个测试。 2. TestSuite类实现了Test接口,且可以包含其它的TestSuites。它可以处理加入Test时的所有抛出的异常。 3. TestSuite处理测试用例有6个规约(否则会被拒绝执行测试)A 测试用例必须是公有类(Public) B 测试用例必须继承与TestCase类 C 测试用例的测试方法必须是公有的( Public ) D 测试用例的测试方法必须被声明为Void E 测试用例中测试方法的前置名词必须是test F 测试用例中测试方法误任何传递参数n TestResult结果类和其它类与接口1. TestResult结果类集合了任意测试累加结果,通过TestResult实例传递个每个测试的Run()方法。TestResult在执行TestCase是如果失败会异常抛出 2. TestListener接口是个事件监听规约,可供TestRunner类使用。它通知listener的对象相关事件,方法包括测试开始startTest(Test test),测试结束endTest(Test test),错误,增加异常addError(Test test,Throwable t)和增加失败addFailure(Test test,AssertionFailedError t) 3. TestFailure失败类是个“失败”状况的收集类,解释每次测试执行过程中出现的异常情况。其toString()方法返回“失败”状况的简要描述3.6、JUnit一个实例在控制台中简单的范例如下:1、写个待测试的Triangle类,创建一个TestCase的子类ExampleTest: 2、 ExampleTest中写一个或多个测试方法,断言期望的结果(注意:以test作为待测试的方法的开头,这样这些方法可以被自动找到并被测试)3、 ExampleTest中写一个suite()方法,它会使用反射动态的创建一个包含所有的testXxxx方法的测试套件:4、 ExampleTest可以写setUp()、tearDown()方法,以便于在测试时初始化或销毁测试所需的所有变量和实例。(不是必须的)5、写一个main()方法以文本运行器或其它GUI的方式方便的运行测试6、编译ExampleTest,执行测试。3.7、Eclipse中JUnit的使用 Eclipse自带了一个JUnit的插件,不用安装就可以在你的项目中开始测试相关的类,并且可以调试你的测试用例和被测试类。使用步骤如下:1、新建一个测试用例,点击“File-New-Other菜单项,在弹出的“New”对话框中选择”Java-JUnit”,下的TestCase 或TestSuite,就进入“New JUnit TestCase”对话框2、在“New JUnit TestCase”对话框填写相应的栏目,主要有Name(测试用例名),SuperClass(测试的超类一般是默认的junit.framework.TestCase),Class Under Test(被测试的类),Source Folder(测试用例保存的目录),Package(测试用例包名),及是否自动生成main,setUp,tearDown方法。3、如果点击下面的”Next”按钮,你还可以直接勾选你想测试的被测试类的方法,Eclipse将自动生成与被选方法相应的测试方法,点击“Fishish”按钮后一个测试用例就创建好了。4、编写完成你的测试用例后,点击“Run”按钮就可以看到运行结果了。3.8、JUnit的扩展应用以下罗列了些JUnit的扩展应用: JUnit + HttpUnit=WEB功能测试工具 JUnit + hansel =代码覆盖测试工具 JUnit + abbot =界面自动回放测试工具 JUnit + dbunit =数据库测试工具 JUnit + junitperf=性能测试工具3.9、一些使用JUnit经验1. 不要用TestCase的构造函数初始化,而要用setUp()和tearDown()方法。 2. 不要依赖或假定测试运行的顺序,因为JUnit利用Vector保存测试方法。所以不同的平台会按不同的顺序从Vector中取出测试方法。 3. 避免编写有副作用的TestCase。例如:如果随后的测试依赖于某些特定的交易数据,就不要提交交易数据。简单的回滚就可以了。 4. 当继承一个测试类时,记得调用父类的setUp()和tearDown()方法。 5. 将测试代码和工作代码放在一起,一边同步编译和更新。 6. 测试类和测试方法应该有一致的命名方案。如在工作类名前加上test从而形成测试类名。 7. 确保测试与时间无关,不要依赖使用过期的数据进行测试。导致在随后的维护过程中很难重现测试。 8. 如果你编写的软件面向国际市场,编写测试时要考虑国际化的因素。不要仅用母语的Locale进行测试。 9. 尽可能地利用JUnit提供地assert/fail方法以及异常处理的方法,可以使代码更为简洁。 10. 测试要尽可能地小,执行速度快。 Triangle.java /* * this is Triangle class * author liujun */public class Triangle /定义三角形的三边 protected long lborderA = 0; protected long lborderB = 0; protected long lborderC = 0; /构造函数 public Triangle(long lborderA,long lborderB,long lborderC) this.lborderA = lborderA; this.lborderB = lborderB;this.lborderC = lborderC; /* * 判断是否是三角形 * 是返回ture;不是返回false */ public boolean isTriangle(Triangle triangle) boolean isTrue = false; /判断边界,大于0小于200,出界返回false if(triangle.lborderA0&triangle.lborderA0&triangle.lborderB0&triangle.lborderC200) /判断两边之和大于第三边 if(triangle.lborderA(triangle.lborderB+triangle.lborderC) &(triangle.lborderB(triangle.lborderA+triangle.lborderC) &(triangle.lborderC(triangle.lborderA+triangle.lborderB) isTrue = true; return isTrue; /* * 判断三角形类型 * 等腰三角形返回字符串“等腰三角形”; * 等边三角形返回字符串“等边三角形”; * 其它三角形返回字符串“不等边三角形”; */ public String isType(Triangle triangle) String strType = ; / 判断是否是三角形 if(this.isTriangle(triangle) /判断是否是等边三角形 if(triangle.lborderA=triangle.lborderB&triangle.lborderB=triangle.lborderC) strType = 等边三角形; /判断是否是不等边三角形 else if(triangle.lborderA!=triangle.lborderB)& (triangle.lborderB!=triangle.lborderC)& (triangle.lborderA!=triangle.lborderC) strType = 不等边三角形; else strType=等腰三角形; return strType; ExampleTest.javaimport junit.framework.*;/* Some tests.*/public class ExampleTest extends TestCase public Triangle triangle; /初始化 protected void setUp() triangle=new Triangle(10,2,9); public static Test suite() return new TestSuite(ExampleTest.class); /函数isTriangle()的测试用例 public void testIsTriangle() assertTrue(triangle.isTriangle(triangle); /函数isType()的测试用例 public void testIsType() assertEquals(这次测试,triangle.isType(triangle),不等边三角形); /执行测试 public static void main (String args) /文本方式 junit.textui.TestRunner.run(suite(); /Swingui方式 /junit.swingui.TestRunner.run(suite().getClass(); /awtui方式 /junit.awtui.TestRunner.run(suite().getClass(); Junit架构下面以Money这个类为例进行说明。 public class Money privateintfAmount;/余额privateStringfCurrency;/货币类型 publicMoney(intamount,Stringcurrency)fAmount=amount;fCurrency=currency;publicintamount()returnfAmount;publicStringcurrency()returnfCurrency;publicMoneyadd(Moneym)/加钱returnnewMoney(amount()+m.amount(),currency();publicbooleanequals(ObjectanObject)/判断钱数是否相等if(anObjectinstanceofMoney)MoneyaMoney=(Money)anObject;returnaMoney.currency().equals(currency()&amount()=aMoney.amount();returnfalse;Junit本身是围绕着两个设计模式来设计的:命令模式和集成模式. 命令模式利用TestCase定义一个子类,在这个子类中生成一个被测试的对象,编写代码检测某个方法被调用后对象的状态与预期的状态是否一致,进而断言程序代码有没有bug。当这个子类要测试不只一个方法的实现代码时,可以先建立测试基础,让这些测试在同一个基础上运行,一方面可以减少每个测试的初始化,而且可以测试这些不同方法之间的联系。例如,我们要测试Money的Add方法,可以如下: publicclassMoneyTestextendsTestCase/TestCase的子类publicvoidtestAdd() /把测试代码放在testAdd中Moneym12CHF=newMoney(12,CHF);/本行和下一行进行一些初始化Moneym14CHF=newMoney(14,CHF);Moneyexpected=newMoney(26,CHF);/预期的结果Moneyresult=m12CHF.add(m14CHF);/运行被测试的方法Assert.assertTrue(expected.equals(result);/判断运行结果是否与预期的相同如果测试一下equals方法,用类似的代码,如下: publicclassMoneyTestextendsTestCase/TestCase的子类publicvoidtestEquals()/把测试代码放在testEquals中Moneym12CHF=newMoney(12,CHF);/本行和下一行进行一些初始化Moneym14CHF=newMoney(14,CHF); Assert.assertTrue(!m12CHF.equals(null);/进行不同情况的测试Assert.assertEquals(m12CHF,m12CHF);Assert.assertEquals(m12CHF,newMoney(12,CHF);/(1)Assert.assertTrue(!m12CHF.equals(m14CHF);当要同时进行测试Add和equals方法时,可以将它们的各自的初始化工作,合并到一起进行,形成测试基础,用setUp初始化,用tearDown清除。如下: publicclassMoneyTestextendsTestCase/TestCase的子类privateMoneyf12CHF;/提取公用的对象privateMoneyf14CHF; protectedvoidsetUp()/初始化公用对象f12CHF=newMoney(12,CHF);f14CHF=newMoney(14,CHF);publicvoidtestEquals()/测试equals方法的正确性Assert.assertTrue(!f12CHF.equals(null);Assert.assertEquals(f12CHF,f12CHF);Assert.assertEquals(f12CHF,newMoney(12,CHF);Assert.assertTrue(!f12CHF.equals(f14CHF);publicvoidtestSimpleAdd()/测试add方法的正确性Moneyexpected=newMoney(26,CHF);Moneyresult=f12CHF.add(f14CHF);Assert.assertTrue(expected.equals(result);将以上三个中的任一个TestCase子类代码保存到名为MoneyTest.java的文件里,并在文件首行增加 import junit.framework.*;,都是可以运行的。关于Junit运行的问题很有意思,下面单独说明。上面为解释概念“测试基础(fixture)”,引入了两个对两个方法的测试。命令模式与集成模式的本质区别是,前者一次只运行一个测试。 集成模式利用TestSuite可以将一个TestCase子类中所有test*()方法包含进来一起运行,还可将TestSuite子类也包含进来,从而行成了一种等级关系。可以把TestSuite视为一个容器,可以盛放TestCase中的test*()方法,它自己也可以嵌套。这种体系架构,非常类似于现实中程序一步步开发一步步集成的现况。对上面的例子,有代码如下: publicclassMoneyTestextendsTestCase/TestCase的子类.publicstaticTestsuite()/静态TestTestSuitesuite=newTestSuite();/生成一个TestSuitesuite.addTest(newMoneyTest(testEquals);/加入测试方法suite.addTest(newMoneyTest(testSimpleAdd);returnsuite;从Junit2.0开始,有列简捷的方法: publicclassMoneyTestextendsTestCase/TestCase的子类.publicstaticTestsuite()静态TestreturnnewTestSuite(MoneyTest.class);/以类为参数TestSuite见嵌套的例子,在后面应用案例中有。4、测试代码的运行先说最常用的集成模式。测试代码写好以后,可以相应的类中写main方法,用java命令直接运行;也可以不写main方法,用Junit提供的运行器运行。Junit提供了textui,awtui和swingui三种运行器。以前面第2步中的AllTests运行为例,可有四种: java junit.textui.TestRunner junit.samples.AllTestsjava junit.awtui.TestRunner junit.samples.AllTestsjava junit.swingui.TestRunner junit.samples.AllTestsjava junit.samples.AllTestsmain方法中一般也都是简单地用Runner调用suite(),当没有main时,TestRunner自己以运行的类为参数生成了一个TestSuite.对于命令模式的运行,有两种方法。 静态方法TestCase test= new MoneyTest(simple add) public void runTest() testSimpleAdd(); 动态方法TestCase test= new MoneyTest(testSimpleAdd);我试了一下,确实可以。importjunit.framework.*; publicclassMoneyTestextendsTestCase/TestCase的子类privateMoneyf12CHF;/提取公用的对象privateMoneyf14CHF;publicMoneyTest(Stringname)super(name);protectedvoidsetUp()/初始化公用对象f12CHF=newMoney(12,CHF);f14CHF=newMoney(14,CHF);publicvoidtestEquals()/测试equals方法的正确性Assert.assertTrue(!f12CHF.equals(null);Assert.assertEquals(f12CHF,f12CHF);Assert.assertEquals(f12CHF,newMoney(12,CHF);Assert.assertTrue(!f12CHF.equals(f14CHF);publicvoidtestAdd()/测试add方法的正确性Moneyexpected=newMoney(26,CHF);Moneyresult=f12CHF.add(f14CHF);Assert.assertTrue(expected.equals(result);/publicstaticvoidmain(Stringargs)/TestCasetest=newMoneyTest(simpleadd)/publicvoidrunTest()/testAdd();/;/junit.textui.TestRunner.run(test);/publicstaticvoidmain(Stringargs)TestCasetest=newMoneyTest(testAdd);junit.textui.TestRunner.run(test);再给一个静态方法用集成测试的例子: publicstaticTestsuite()TestSuitesuite=newTestSuite();suite.addTest(newtestCar(getWheels)protectedvoidrunTest()testGetWheels();); suite.addTest(newtestCar(getSeats)protectedvoidrunTest()testGetSeats(););returnsuite;5、应用案例1. Junit Primer例程,运行如下: java com.hedong.JunitLearning.Primer.ShoppingCartTest2. Ant+Junit+Mailto实现自动编译、调试并发送结果的build.xml3. JUnit实施,写得很棒,理解也深刻。例程运行如下: java com.hedong.JunitLearning.car.testCarNoJunitjava junit.swingui.TestRunner com.hedong.JunitLearning.car.testCar4. Junit与log4j结合,阿菜的例程运行: cd acaiant junit.6、一些问题有人在实践基础上总结出一些非常有价值的使用技巧,我没有经过一一“测试”,暂列在此。1. 不要用TestCase的构造函数初始化Fixture,而要用setUp()和tearDown()方法。2. 不要依赖或假定测试运行的顺序,因为JUnit利用Vector保存测试方法。所以不同的平台会按不同的顺序从Vector中取出测试方法。不知3.8中是不是还是如此,不过它提供的例子有一个是指定用VectorSuite的,如果不指定呢?3. 避免编写有副作用的TestCase。例如:如果随后的测试依赖于某些特定的交易数据,就不要提交交易数据。简单的回滚就可以了。4. 当继承一个测试类时,记得调用父类的setUp()和tearDown()方法。5. 将测试代码和工作代码放在一起,一边同步编译和更新。(使用Ant中有支持junit的task.)6. 测试类和测试方法应该有一致的命名方案。如在工作类名前加上test从而形成测试类名。7. 确保测试与时间无关,不要依赖使用过期的数据进行测试。导致在随后的维护过程中很难重现测试。8. 如果你编写的软件面向国际市场,编写测试时要考虑国际化的因素。不要仅用母语的Locale进行测试。9. 尽可能地利用JUnit提供地assert/fail方法以及异常处理的方法,可以使代码更为简洁。10. 测试要尽可能地小,执行速度快。11. 把测试程序建立在与被测对象相同的包中12. 在你的原始代码目录中避免测试码出现,可在一个源码镜像目录中放测试码13. 在自己的应用程序包中包含一个TestSuite测试类14.7、相关资源下载以下ja
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年平面设计师技能认证考试模拟题集
- 2026届福建省建瓯市芝华中学化学高一上期中监测试题含解析
- 2025年保险公司招聘笔试备考资料及模拟题集答案
- 2025年高级工程师英语应用能力测试题库及答案解析
- 2025年物流工程师中级考试模拟题及备考建议
- 2025年财务经理面试必-备知识与预测题详解
- 2025年编程算法竞赛实战指南与模拟题解答
- 2025年监理《建设工程监理案例分析(交通)》考后答案
- 2025年财务会计主管招聘笔试指南及模拟题解析
- 2025年产品运营经理面试题及解析
- 吊装作业专项安全检查表
- 望舌-中医舌诊-课件
- 《华为团队工作法》读书笔记PPT模板思维导图下载
- 2022年上海市法院系统辅助文员招聘128人笔试备考题库及答案解析
- 全过程工程咨询服务技术方案
- GB/T 4802.1-2008纺织品织物起毛起球性能的测定第1部分:圆轨迹法
- GB/T 35568-2017中国荷斯坦牛体型鉴定技术规程
- GB/T 28707-2012碟簧支吊架
- GB/T 2791-1995胶粘剂T剥离强度试验方法挠性材料对挠性材料
- GB/T 25702-2010复摆颚式破碎机颚板磨耗
- 超分子化学简介课件
评论
0/150
提交评论