正如许多事情都有其两面性一样,测试方法也是这样。要保证测试方法正确,最简单、最直观地想法就是多写些测试用例,从更多地角度去测试,但这必然增加我们的测试成本。小步快跑要求我们频繁进行测试,假如我们重构的周期是20分钟,但测试却要花掉10分钟,那么这样的成本就实在太大了。假如这种测试还是开发人员手工测试,每天都有对同样的测试反复执行数十遍,那么开发人员估计就要疯掉了。
你可能立即就想到自动化测试了。是的,在许多重构的书籍中,大师们都建议我们在重构开始前,首先建立自动化测试机制。但遗憾的是,我经过多年的实践总结出来的经验是,这几乎不可能实现。每次重构,我们面临的都是一个个遗留系统。大多数遗留系统都有一些共同的特征:代码凌乱,没有清晰的接口;代码间耦合度高,相互依赖严重;web层、业务层、数据访问层往往没有清晰的界限,代码相互参杂其中。在这样的情况下,编写自动化测试代码是几乎不可完成的任务。当然,这里所说的自动化测试代码,是指那些基于JUnit编写的自动化测试程序
举一个简单的例子:假如你现在要测试一个开票类,想编写它的测试代码。本来这个开票类并不复杂,业务也很清晰。但是在函数传递参数时,其中一个参数是Web容器中的Request、Response或Session。这下麻烦了,为了测试一个简单的函数,我们必须启动整个Web应用,这是我们不可接受的。
随后你可能会说了,我们为什么非要传递一个真正地Request、Response或Session呢?我们Mock一个假的嘛!想法不错,但你真正去尝试Mock时你会发现这也是一个不可完成的任务。Request、Response或Session有许多的状态,属性变量中又有对象,又有属性变量。除此还有大量集合变量,集合变量里都有什么对象,天才知道。因此,即使你费尽千辛万苦Mock出来,也可能因某些属性不对而使得测试失败。
另一个写自动化测试程序比较忌讳的就是访问数据库。比如你这次执行的插入操作成功了,并不意味着下次执行就可以成功。下次执行会报“主键冲突”错误,出现这个错误并不是被测程序错了,而是测试程序错了。上次执行一个查询产生的结果集,不一定就是下一次执行同样一个查询产生的结果。查询结果变了,并不意味着被测程序错了,而是测试程序不对。自动化测试程序之所以能够自动化执行,必须要保证测试过程是可以反复执行的,并且不论什么时候执行都有一个确定的结果。
总之,自动化测试不是银弹,并不是所有代码都适合自动化测试。与Web容器或其它设备驱动相关的代码是不适合自动化测试的,因为我们在测试的时候不希望去启动Web容器或其它设备。因此,我们在做自动化测试程序前,首先应当确保要测试的程序已经与Web容器或其它设备驱动相关的代码充分解耦。一个比较好的办法就是分离出Web层与BUS层,Web层负责从Web容器中获取数据,并打包传递给BUS层,而BUS层则完成真正需要测试的业务逻辑。
另一个不适合自动化测试的就是要访问数据库的程序,因为它们执行的结果总是与数据库状态有关,无法获得稳定而可以不断复现的结果。所以,我们解决它的最好办法就是将访问数据库的部分Mock掉。如何Mock呢?你不能Mock一个JDBC,也不能Mock一个Hibernate,因为那都过于复杂了,你唯一可以做的就是将DAO层Mock掉。这就要求我们对系统重构的时候,要将数据库访问的代码从业务代码中脱离出来,写入到DAO层。最后,被Mock的DAO层代码并不真正去访问数据库。每当客户程序传入一个参数时,它首先作为测试程序去验证这个参数是否与预期一致,然后返回一个确定的结果。
大话重构连载首页:
http://fangang.iteye.com/blog/2081995
特别说明:希望网友们在转载本文时,应当注明作者或出处,以示对作者的尊重,谢谢!
分享到:
相关推荐
Android之大话设计模式——:抽象工厂模式借鉴.pdf
Android之大话设计模式——:抽象工厂模式参考.pdf
大话Oracle RAC:集群、高可用性、备份与恢复。 此书被认为不可多得的好资料之一:大话Oracle RAC(PDF经典),看完之后深有感触,发出来共享一下。
微信小程序——大话骰 核心是调用wx.onAccelerometerChange()API,监测手机上下摇动重力变化,来实现摇一摇功能。 玩法: 点击按钮 -> 骰子转动 -> 按钮提示变化(请摇一摇手机) -> 摇动成功时手机释放震动,骰子...
此外,本书可能还涵盖了自动化测试、持续集成和持续交付(CI/CD)、质量保证(QA)流程、用户体验(UX)测试等主题,这些都是现代移动应用开发中不可或缺的部分。 总的来说,《大话移动APP测试》这本书为读者提供了一个...
在IT行业中,自动化是提升效率的关键工具,尤其是在处理大量重复性任务时。在这个场景中,"自动化所有的pdf.7z" 提供了一种利用自动化技术处理PDF文档的方案。7z是一种高效的压缩格式,它能将多个PDF文件打包成一个...
读书笔记:《大话设计模式》—— 随书实践
本文《OpenFaaS实战之五:大话watchdog》重点讨论了OpenFaaS的关键组件watchdog的原理和应用。 在OpenFaaS中,当外部请求到达API Gateway时,它会将请求转发到faas-netes组件。faas-netes作为服务提供者,不仅支持...
《大话移动APP测试:Android与iOS应用测试指南》是一本深入探讨移动应用测试领域的专著,由资深测试专家陈晔撰写。这本书旨在为开发者、测试工程师以及对移动应用质量控制感兴趣的人士提供全面而实用的测试策略和...
《大话数据分析:Tableau数据可视化实战》的数据集是一份重要的资源,对于想要学习和提升Tableau数据可视化技能的人来说极具价值。Tableau是一款强大的商业智能工具,它允许用户通过直观的拖放界面来探索和可视化...
大话Oracle RAC:集群、高可用性、备份与恢复(带目录清晰中文完整版)
《大话Oracle.RAC:集群、高可用性、备份与恢复(第2版)》是一部深入探讨Oracle数据库Real Application Clusters(RAC)技术的专业书籍,主要围绕Oracle RAC的集群架构、高可用性策略以及数据库的备份与恢复策略...
《大话移动APP测试:Android与 iOS应用测试指南》内容包含:移动互联网测试人员的面试,用户体验测试,功能测试,常用测试工具,常用框架,APP测试案例,以及更多的从业相关思维、手段等非技术内容。
6. 自动化测试:为了提高测试效率,自动化测试是移动应用测试中非常重要的一环。它包括编写测试脚本、使用测试框架、回归测试等方面。 在进行iOS和Android应用测试时,需要考虑各自平台的特殊性: 对于Android平台...
《大话存储》一书中可能涵盖的知识点包括但不限于: 1. 存储基础:介绍存储设备类型,如HDD、SSD,以及RAID(冗余磁盘阵列)的工作原理。 2. 存储网络:讲解FC(光纤通道)、iSCSI、NAS(网络附加存储)和SAN(存储...
由于提供的文件信息【部分内容】仅包含了重复的下载链接,并且【描述】中提到的内容不足以生成详尽的知识点,因此仅能依据【标题】:"大话存储——网络存储系统原理精解与最佳实践" 来推测可能涵盖的知识点。...
初中语文文摘历史“大话王”郭台铭:被夏普狠狠摔了个大跟