什么是自动化测试?
自动化测试是,把人对软件的测试行为转化为由机器执行测试行为的一种实践。
自动化测试的本质是先写一段代码,然后去测试另一段代码,所以实现自动化测试用例本身属于开发工作,需要投入大量的时间和精力,并且已经开发完成的用例还必须随着被测对象的改变而不断更新,你还需要为此付出维护测试用例的成本。当你发现自动化测试用例的维护成本高于其节省的测试成本时,自动化测试就失去了价值与意义,你也就需要在是否使用自动化测试上权衡取舍了。
自动化测试的优势:
- 自动化测试可以替代大量的手工机械重复性操作,测试工程师可以把更多的时间花在更全面的用例设计和新功能的测试上;
- 自动化测试还可以保证每次测试执行的操作以及验证的一致性和可重复性,避免人为的遗漏或疏忽。
- 自动化测试可以大幅提升回归测试的效率,非常适合敏捷开发过程;
- 自动化测试可以更好地利用无人值守时间,去更频繁地执行测试,特别适合现在非工作时间执行测试,工作时间分析失败用例的工作模式;
- 自动化测试可以高效实现某些手工测试无法完成或者代价巨大的测试类型,比如关键业务 7×24 小时持续运行的系统稳定性测试和高并发场景的压力测试等;
自动化测试的劣势:
- 自动化测试并不能取代手工测试,它只能替代手工测试中执行频率高、机械化的重复步骤。你千万不要奢望所有的测试都自动化,否则一定会得不偿失。
- 自动测试远比手动测试脆弱,无法应对被测系统的变化,维护成本高。其根本原因在于自动化测试本身不具有任何 “智能”,只是按部就班地执行事先定义好的测试步骤并验证测试结果。对于执行过程中出现的明显错误和意外事件,自动化测试没有任何处理能力。
- 自动化测试用例的开发工作量远大于单次的手工测试,所以只有当开发完成的测试用例的有效执行次数大于等于 5 次时,才能收回自动化测试的成本。
- 手工测试发现的缺陷数量通常比自动化测试要更多,并且自动化测试仅仅能发现回归测试范围的缺陷。
- 测试的效率很大程度上依赖自动化测试用例的设计以及实现质量,不稳定的自动化测试用例实现比没有自动化更糟糕。
- 实行自动化测试的初期,用例开发效率通常都很低,大量初期开发的用例通常会在整个自动化测试体系成熟,和测试工程师全面掌握测试工具后,需要重构。
- 业务测试专家和自动化测试专家通常是两批人,前者懂业务不懂自动化技术,后者懂自动化技术但不懂业务,只有二者紧密合作,才能高效开展自动化测试。
- 自动化测试开发人员必须具备一定的编程能力,这对传统的手工测试工程师会是一个挑战。
适合实施测试自动化的项目:
第一,需求稳定,不会频繁变更。
第二,研发和维护周期长,需要频繁执行回归测试。
对于一些中长期项目,我的建议是:对比较稳定的软件功能进行自动化测试,对变动较大或者需求暂时不明确的功能进行手工测试,最终目标是用 20% 的精力去覆盖 80% 的回归测试。
第三,需要在多种平台上重复运行相同测试的场景。兼容性测试
第四,某些测试项目通过手工测试无法实现,或者手工成本太高。性能和压力测试
第五,被测软件的开发较为规范,能够保证系统的可测试性。某些用例的自动化必须要求开发人员在产品中预留可测试性接口,否则后续的自动化会很难开展。
第六,测试人员已经具备一定的编程能力。
推行自动化测试的阻力:
- 前期的学习成本通常会比较大,很难在短期内对实际项目产生实质性的帮助,此时如果管理层对自动化测试没有正确的预期,很可能会叫停自动化测试;
- 测试工程师通常会非常热衷于学习使用自动化测试技术,以至于他们的工作重点会发生错误的偏移,把大量的精力放在自动化测试技术的学习与实践上,而忽略了测试用例的设计,这将直接降低软件整体的质量;
- 业务测试人员担心自动化技术会替代自己的工作,故采取不配合的工作态度;
软件研发生命周期各个阶段的自动化测试技术
在软件研发生命周期的各个阶段都有自动化测试技术的存在,并且对提升测试效率有着至关重要的作用。软件研发各个阶段的自动化测试有:单元测试、代码级集成测试、Web Service 测试和 GUI 测试阶段的自动化技术。
** 单元测试的自动化技术 **
- 1. 单元测试用例框架代码生成的自动化:框架代码应该由自动化工具生成,而不是由开发者手工完成。
- 2. 部分测试输入数据的自动化生成:自动化工具能够根据不同变量类型自动生成测试输入数据。
- 3. 自动桩代码的生成:自动化工具可以对被测试代码进行扫描分析,自动为被测函数内部调用的其他函数生成可编程的桩代码,并提供基于测试用例的桩代码管理机制。
- 4. 被测代码的自动化静态分析:目的是识别出违反编码规则或编码风格的代码行。
- 5. 测试覆盖率的自动统计与分析:自动化工具可以自动统计各种测试覆盖率,包括代码行覆盖率、分支覆盖率、MC/DC 覆盖率等。
** 代码级集成测试的自动化技术 **
从测试用例设计和测试代码结构来看,代码级集成测试和单元测试非常相似,它们都是对被测试函数以不同的输入参数组合进行调用并验证结果,只不过代码级集成测试的关注点,更多的是软件模块之间的接口调用和数据传递。
代码级集成测试与单元测试最大的区别是,代码级集成测试中被测函数内部调用的其他函数必须是真实的,不允许使用桩代码代替,而单元测试中允许使用桩代码来模拟内部调用的其他函数。
由于代码级集成测试主要应用在早期非互联网的传统软件企业,那时候的软件以 “单体” 应用居多,一个软件内部包含大量的功能,每一个软件功能都是通过不同的内部模块来实现的,那么这些内部模块在做集成的时候,就需要做代码级集成测试。
现在的开发理念追求的是系统复杂性的解耦,会去尽量避免 “大单体” 应用,采用 Web Service 或者 RPC 调用的方式来协作完成各个软件功能。所以现在的软件企业,尤其是互联网企业,基本不会去做代码级集成测试。
** Web Service 测试的自动化技术 **
Web Service 测试,主要是指 SOAP API 和 REST API 这两类 API 测试,最典型的是采用 SoapUI 或 Postman 等类似的工具。但这类测试工具基本都是界面操作手动发起 Request 并验证 Response,所以难以和 CI/CD 集成,于是就出现了 API 自动化测试框架。
对于基于代码的 API 测试用例,通常包含三大步骤:
- 1. 准备 API 调用时需要的测试数据;
- 2. 准备 API 的调用参数并发起 API 的调用;
- 3. 验证 API 调用的返回结果。
Web Service 测试 “自动化” 的内涵:
- 1. 测试脚手架代码的自动化生成;
- 2. 部分测试输入数据的自动生成:
单元测试针对的参数是函数输入参数和函数内部输入,而 API 测试对应的是 API 的参数以及 API 调用的 Payload。
- 3. Response 验证的自动化:
Response 验证自动化的核心思想是自动比较两次相同 API 调用的返回结果,并自动识别出有差异的字段值,比较过程可以通过规则配置去掉诸如时间戳、会话 ID(Session ID)等动态值。
- 4. 基于 SoapUI 或者 Postman 的自动化脚本生成:
开发一个自动化代码转换生成工具。这个工具的输入是 SoapUI 或者 Postman 的测试用例元数据(即测试用例的 JSON 元文件),输出是符合 API 测试框架规范的基于代码实现的测试用例。这样一来,原本的测试用例积累可以直接转换成在 CI/CD 上可以直接接入的自动化测试用例。
** GUI 测试的自动化技术 **
GUI 自动化测试主要分为两大方向:
- 传统 Web 浏览器的 GUI 自动化
- 移动端应用的 GUI 自动化
自动化测试试一把 “双刃剑”,虽然它可以从一定程度上解放测试工程师的劳动力,完成一些人工无法实现的测试,但并不适用于所有的测试场景,如果维护自动化测试的代价高过了节省的测试成本,那么在这样的项目中推进自动化测试就会得不偿失。
对自己测试现状的反思:没有真正理解自动化的概念,过去只是片面的认为用例执行的自动化就是自动化,也是为自动化而自动化。其实自动化贯穿了整个测试过程,从用例设计,数据准备,用例生成,响应判断,用例执行,执行结果分析,都包含了自动化的内容。现在 devops 的流行,让自动化的占据了更多的比重。个人认为自动化最重要的是思想,当现在宏观的角度看待项目,看待整个测试过程,自动化应该是我们工作的指导思想,就是通过一切手段高质量、高效率、低入驻成本的守护产品的质量。
测试主要精力放在用例设计和业务的理解上,自动化的实现只是一种手段,不能过于追求自动化实现,反而忽略了测试用例的设计,这样不仅本末倒置,而且失去了自动化的意义。
↙↙↙阅读原文可查看相关链接,并与作者交流