自动化测试—想说爱你不容易

简介:

正如许多事情都有其两面性一样,测试方法也是这样。要保证测试方法正确,最简单、最直观地想法就是多写些测试用例,从更多地角度去测试,但这必然增加我们的测试成本。小步快跑要求我们频繁进行测试,假如我们重构的周期是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层代码并不真正去访问数据库。每当客户程序传入一个参数时,它首先作为测试程序去验证这个参数是否与预期一致,然后返回一个确定的结果。

最新内容请见作者的GitHub页:http://qaseven.github.io/

相关文章
|
7月前
|
人工智能 搜索推荐
AIGC工具——堆友
【1月更文挑战第11天】AIGC工具——堆友
433 9
AIGC工具——堆友
|
6月前
|
Web App开发 Java 测试技术
反了!居然让我教她自动化测试!
简介:反了!居然让我教她自动化测试!
|
11天前
|
算法 数据安全/隐私保护 异构计算
基于FPGA的16QAM调制+软解调系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
本项目基于FPGA实现了16QAM基带通信系统,包括调制、信道仿真、解调及误码率统计模块。通过Vivado2019.2仿真,设置不同SNR(如8dB、12dB),验证了软解调相较于传统16QAM系统的优越性,误码率显著降低。系统采用Verilog语言编写,详细介绍了16QAM软解调的原理及实现步骤,适用于高性能数据传输场景。
110 69
|
存储 Prometheus 监控
高可用Prometheus集群
高可用Prometheus集群
1446 0
|
8天前
|
关系型数据库 MySQL Docker
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
61 24
|
11天前
|
人工智能 搜索推荐 数据挖掘
如何让产品在Go-to-Market战略中脱颖而出?
本文深入探讨了Go-to-Market战略中产品运营的关键作用,涵盖市场需求洞察、产品规划、生命周期管理、上线推广及用户反馈处理等环节,强调通过精准运营策略助力产品成功推向市场,实现商业价值。
|
11天前
|
开发工具 git 开发者
git rebase的使用
通过这些思维导图和分析说明表,您可以更直观地理解Git rebase的概念、用法和应用场景。希望本文能帮助您更高效地使用Git rebase,提高代码管理的效率和质量。
44 13
你真的需要自动化测试吗?
其实自动化这个概念很早前就有了,最初主要应用于工业生产领域,指通过指令或软件控制机械工具完成一些重复度较高的工作。后来随着计算机技术的发展和互联网行业的蓬勃趋势,开始应用于软件开发和测试领域。
你真的需要自动化测试吗?
|
存储 区块链
【Qt】Qt 实现图像格式转图标 ico 格式的应用程序
转图标文件,外网有很多在线工具可以使用,但是内网有诸多不便,可以手动实现这样一个图片格式转换工具
247 0
【Qt】Qt 实现图像格式转图标 ico 格式的应用程序
|
弹性计算 Kubernetes Ubuntu
通俗易懂的告诉你容器是什么
1.Docker本身并不是容器,它是创建容器的工具,是应用容器引擎。 2.Docker包括:镜像(Image)、容器(Container)、仓库(Repository),后面会重点介绍。 3.K8S,全称kubernetes,是基于容器的集群管理平台,可以先简单理解为是管理容器的:可以实现容器集群的自动化部署、自动扩缩容、维护等功能。
1473 0
通俗易懂的告诉你容器是什么