Junit单元测试技术

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

Junit单元测试技术讲解人:邱百超Email:badqiu(a)gmail.com讲解内容测试技术介绍JUnit3.8单元测试及实例单元测试最佳实践MockObjects技术JUnit相关工具及其扩展Spring对测试的支持JUnit4.0介绍测试驱动开发(TDD)Q&A软件测试类型1软件测试类型2单元测试:测试单个对象是否工作正确集成测试:测试多个对象之间,多个子系统之间以及系统环境配置是否工作正确功能测试:测试整个应用是否工作正确性能测试:测试系统的性能验收测试:验证用户是否喜欢我的程序单元测试由谁编写程序员本身程序员PairsJUnit开源的Java单元测试框架结构:TestSuitesTestCase[Javaclass]Test[Javamethod]Fixtures:commonsetup/teardowncodeJUnit3.8例子importjunit.framework.TestCase;publicclassStringTestextendsTestCase{publicvoidtestReplace(){Stringresult=abc.replace('a','b');assertEquals(bbc,result);}publicvoidtestSubstring(){Stringresult=abc.substring(1);assertEquals(bc,result);}}断言(assert)assertFalseassertEqualsassertNotEqualsassertNullassertSame…运行JUnit測試(TestRunner)命令行JUnit自帶的Swing界面IDE集成(Eclipse,Netbean)Ant,Maven最佳实践1(Test命名及存放)1.相同的package不同的存放位置2.Calucator的测试类为CalucatorTest3.add()的测试方法为testAdd()最佳实践2细粒度的测试一个测试只测试一个方法(或多个测试测试一个方法)测试隔离测试之间相互独立,没有依赖性為assert增加描述TestCase生命周期(例子)TestSuites(一组测试)publicclassAllTests{publicstaticvoidmain(String[]args){junit.textui.TestRunner.run(AllTests.suite());}publicstaticTestsuite(){TestSuitesuite=newTestSuite(Testforjunitdemo);//$JUnit-BEGIN$suite.addTestSuite(StringTest.class);suite.addTestSuite(CalucatorTest.class);//$JUnit-END$returnsuite;}}评估测试结果测试结果报告代码测试覆盖率报告测试报告(例子)测试覆盖率报告(例子)最佳实践自动化运行测试持续集成(CruiseControl)测试技巧异常(exception)测试MockObjects技巧:Exception测试MockObjects测试技术允许你测试依赖于其它对象的方法,但那个对象非常难实例化或是太慢等.例1要测试Servlet的doGet()请求:HttpRequest,HttpResponse可以使用Mock例2要测试Service层的逻辑,但dao层要依赖数据库或是dao层只提供一个接口没有实现类Mock转帐实例1Mock转帐实例2(Account对象)publicclassAccount{privateStringaccountId;privatelongbalance;publicAccount(StringaccountId,longinitialBalance){this.accountId=accountId;this.balance=initialBalance;}publicvoiddebit(longamount){this.balance-=amount;}publicvoidcredit(longamount){this.balance+=amount;}publiclonggetBalance(){returnthis.balance;}}Mock转帐实例3publicinterfaceAccountManager{AccountfindAccountForUser(StringuserId);voidupdateAccount(Accountaccount);}publicclassAccountService{privateAccountManageraccountManager;publicvoidsetAccountManager(AccountManagermanager){accountManager=manager;}publicvoidtransfer(StringsenderId,StringbeneficiaryId,longamount){Accountsender=accountManager.findAccountForUser(senderId);Accountbeneficiary=accountManager.findAccountForUser(beneficiaryId);sender.debit(amount);beneficiary.credit(amount);this.accountManager.updateAccount(sender);this.accountManager.updateAccount(beneficiary);}}Mock转帐实例4(MockObject)publicclassMockAccountManagerimplementsAccountManager{privateHashtableaccounts=newHashtable();publicvoidaddAccount(StringuserId,Accountaccount){this.accounts.put(userId,account);}publicAccountfindAccountForUser(StringuserId){return(Account)this.accounts.get(userId);}publicvoidupdateAccount(Accountaccount){//donothing}}Mock转帐实例5(测试)publicclassTestAccountServiceextendsTestCase{publicvoidtestTransferOk(){//使用MockAccountManagerMockAccountManagermockAccountManager=newMockAccountManager();AccountsenderAccount=newAccount(1,200);AccountbeneficiaryAccount=newAccount(2,100);mockAccountManager.addAccount(1,senderAccount);mockAccountManager.addAccount(2,beneficiaryAccount);AccountServiceaccountService=newAccountService();accountService.setAccountManager(mockAccountManager);//转帐操作accountService.transfer(1,2,50);//验证assertEquals(150,senderAccount.getBalance());assertEquals(150,beneficiaryAccount.getBalance());}}JMock快速创建mockobjects使用动态生成代理避免需要手工编写MockObject实现JMock2.4.0转帐实现publicclassJMockAccountServiceTestextendsTestCase{Mockerycontext=newMockery();publicvoidtestTransferOk(){finalAccountsenderAccount=newAccount(1,200);finalAccountbeneficiaryAccount=newAccount(2,100);//使用MockAccountManagerfinalAccountManagermockAccountManager=context.mock(AccountManager.class);context.checking((newExpectations(){{one(mockAccountManager).findAccountForUser(1);will(returnValue(senderAccount));one(mockAccountManager).findAccountForUser(2);will(returnValue(beneficiaryAccount));one(mockAccountManager).updateAccount(senderAccount);one(mockAccountManager).updateAccount(beneficiaryAccount);}}));AccountServiceaccountService=newAccountService();accountService.setAccountManager(mockAccountManager);//转帐操作accountService.transfer(1,2,50);//验证assertEquals(150,senderAccount.getBalance());assertEquals(150,beneficiaryAccount.getBalance());}}为何没有测试Account对象最佳实践只测试有可能导致失败的原因(如简单的值对象不用测试)將private的方法改為package以便測試为测试修改代码以便测试测试驱动开发(TDD)极限编程的重要特点基本思想就是在开发功能代码之前,先编写测试代码。为什么编写单元测试更好的测试覆盖率(如某个if条件)提升对你编写的代码信心为重构提供支持代码即是文档提升设计团队协作可以快速的测试你的代码(避免启动服务器等)单元测试类型逻辑单元测试(JUnit)集成单元测试功能单元测试(Selenium)单元测试的使用普通的单元测试使用流程修正一个bug或重构代码运行测试确保修改正常提交修改至svnorcvs单元测试的基本原则为了能够自动化运行测试容易编写容易运行容易识别(可以容易查看那里pass,那里failure)可以重现Spring对测试的支持WebmockJndimock数据库测试支持Spring对数据库测试的支持AbstractTransactionalDataSourceSpringContextTestsSpring对Mock的支持MockHttpServletRequestMockHttpServletResponseSomeServlet.service(MockHttpServletRequest,MockHttpServletResponse)JndiMockSelenimu功能测试工具可以模拟用户的操作验证结果JUnit4.0介绍兼容3.8.1不用强制继承TestCase类使用注解(Anno

1 / 43
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功