Junit单元测试技术课件

上传人:我*** 文档编号:140094764 上传时间:2020-07-26 格式:PPT 页数:43 大小:353.50KB
返回 下载 相关 举报
Junit单元测试技术课件_第1页
第1页 / 共43页
Junit单元测试技术课件_第2页
第2页 / 共43页
Junit单元测试技术课件_第3页
第3页 / 共43页
Junit单元测试技术课件_第4页
第4页 / 共43页
Junit单元测试技术课件_第5页
第5页 / 共43页
点击查看更多>>
资源描述

《Junit单元测试技术课件》由会员分享,可在线阅读,更多相关《Junit单元测试技术课件(43页珍藏版)》请在金锄头文库上搜索。

1、Junit单元测试技术,讲解人:邱百超 Email: badqiu(a),讲解内容,测试技术介绍 JUnit3.8单元测试及实例 单元测试最佳实践 Mock Objects技术 JUnit相关工具及其扩展 Spring对测试的支持 JUnit4.0介绍 测试驱动开发(TDD) Q public class StringTest extends TestCase public void testReplace() String result = abc.replace(a, b); assertEquals(bbc,result); public void testSubstring() Str

2、ing result = 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(),最佳实

3、践2,细粒度的测试 一个测试只测试一个方法(或多个测试测试一个方法) 测试隔离 测试之间相互独立,没有依赖性 為assert增加描述,TestCase生命周期(例子),TestSuites(一组测试),public class AllTests public static void main(String args) junit.textui.TestRunner.run(AllTests.suite(); public static Test suite() TestSuite suite = new TestSuite(Test for junitdemo); /$JUnit-BEGIN$

4、 suite.addTestSuite(StringTest.class); suite.addTestSuite(CalucatorTest.class); /$JUnit-END$ return suite; ,评估测试结果,测试结果报告 代码测试覆盖率报告,测试报告(例子),测试覆盖率报告(例子),最佳实践,自动化运行测试 持续集成(CruiseControl),测试技巧,异常(exception)测试 Mock Objects,技巧:Exception测试,Mock Objects测试技术,允许你测试依赖于其它对象的方法,但那个对象非常难实例化或是太慢等. 例1 要测试Servlet的

5、doGet()请求:HttpRequest,HttpResponse可以使用Mock 例2 要测试Service层的逻辑,但dao层要依赖数据库或是dao层只提供一个接口没有实现类,Mock转帐实例1,Mock转帐实例2(Account对象),public class Account private String accountId; private long balance; public Account(String accountId, long initialBalance) this.accountId = accountId; this.balance = initialBalan

6、ce; public void debit(long amount) this.balance -= amount; public void credit(long amount) this.balance += amount; public long getBalance() return this.balance; ,Mock转帐实例3,public interface AccountManager Account findAccountForUser(String userId); void updateAccount(Account account); ,public class Ac

7、countService private AccountManager accountManager; public void setAccountManager(AccountManager manager) accountManager = manager; public void transfer(String senderId, String beneficiaryId,long amount) Account sender = accountManager.findAccountForUser(senderId); Account beneficiary = accountManag

8、er.findAccountForUser(beneficiaryId); sender.debit(amount); beneficiary.credit(amount); this.accountManager.updateAccount(sender); this.accountManager.updateAccount(beneficiary); ,Mock转帐实例4(Mock Object),public class MockAccountManager implements AccountManager private Hashtable accounts = new Hashta

9、ble(); public void addAccount(String userId, Account account) this.accounts.put(userId, account); public Account findAccountForUser(String userId) return (Account) this.accounts.get(userId); public void updateAccount(Account account) / do nothing ,Mock转帐实例5(测试),public class TestAccountService extend

10、s TestCase public void testTransferOk() /使用MockAccountManager MockAccountManager mockAccountManager = new MockAccountManager(); Account senderAccount = new Account(1, 200); Account beneficiaryAccount = new Account(2, 100); mockAccountManager.addAccount(1, senderAccount); mockAccountManager.addAccoun

11、t(2, beneficiaryAccount); AccountService accountService = new AccountService(); accountService.setAccountManager(mockAccountManager); /转帐操作 accountService.transfer(1, 2, 50); /验证 assertEquals(150, senderAccount.getBalance(); assertEquals(150, beneficiaryAccount.getBalance(); ,JMock,快速创建mock objects

12、使用动态生成代理避免需要手工编写Mock Object实现,JMock2.4.0转帐实现,public class JMockAccountServiceTest extends TestCase Mockery context = new Mockery(); public void testTransferOk() final Account senderAccount = new Account(1, 200); final Account beneficiaryAccount = new Account(2, 100); /使用MockAccountManager final Acco

13、untManager mockAccountManager = context.mock(AccountManager.class); context.checking(new Expectations() one(mockAccountManager).findAccountForUser(1); will(returnValue(senderAccount); one(mockAccountManager).findAccountForUser(2); will(returnValue(beneficiaryAccount); one(mockAccountManager).updateA

14、ccount(senderAccount); one(mockAccountManager).updateAccount(beneficiaryAccount); ); AccountService accountService = new AccountService(); accountService.setAccountManager(mockAccountManager); /转帐操作 accountService.transfer(1, 2, 50); /验证 assertEquals(150, senderAccount.getBalance(); assertEquals(150

15、, beneficiaryAccount.getBalance(); ,为何没有测试Account对象,最佳实践,只测试有可能导致失败的原因(如简单的值对象不用测试) 將private的方法改為package以便測試 为测试修改代码以便测试,测试驱动开发(TDD),极限编程的重要特点 基本思想就是在开发功能代码之前,先编写测试代码。,为什么编写单元测试,更好的测试覆盖率(如某个if条件) 提升对你编写的代码信心 为重构提供支持 代码即是文档 提升设计 团队协作 可以快速的测试你的代码(避免启动服务器等),单元测试类型,逻辑单元测试 (JUnit) 集成单元测试 功能单元测试 (Selenium

16、),单元测试的使用,普通的单元测试使用流程 修正一个bug或重构代码 运行测试确保修改正常 提交修改至svn or cvs,单元测试的基本原则,为了能够自动化运行测试 容易编写 容易运行 容易识别(可以容易查看那里pass,那里failure) 可以重现,Spring对测试的支持,Web mock Jndi mock 数据库测试支持,Spring对数据库测试的支持,AbstractTransactionalDataSourceSpringContextTests,Spring对Mock的支持,MockHttpServletRequest MockHttpServletResponse SomeServlet.service(MockHttpServletRequest,MockHttpServletResponse) Jndi Mock,Selenimu 功能测试工具,可以模拟用户的操作 验证结果,JUnit4.0介绍,兼容3.8.1 不用强制继承TestCase类 使用注解(Annotation)来标注测试 对异常(exception)测试改进

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号