什么是自动化测试?

自动化测试是,把人对软件的测试行为转化为由机器执行测试行为的一种实践。
自动化测试的本质是先写一段代码,然后去测试另一段代码,所以实现自动化测试用例本身属于开发工作,需要投入大量的时间和精力,并且已经开发完成的用例还必须随着被测对象的改变而不断更新,你还需要为此付出维护测试用例的成本。当你发现自动化测试用例的维护成本高于其节省的测试成本时,自动化测试就失去了价值与意义,你也就需要在是否使用自动化测试上权衡取舍了。

自动化测试的优势:

  1. 自动化测试可以替代大量的手工机械重复性操作,测试工程师可以把更多的时间花在更全面的用例设计和新功能的测试上;
  2. 自动化测试还可以保证每次测试执行的操作以及验证的一致性和可重复性,避免人为的遗漏或疏忽。
  3. 自动化测试可以大幅提升回归测试的效率,非常适合敏捷开发过程;
  4. 自动化测试可以更好地利用无人值守时间,去更频繁地执行测试,特别适合现在非工作时间执行测试,工作时间分析失败用例的工作模式;
  5. 自动化测试可以高效实现某些手工测试无法完成或者代价巨大的测试类型,比如关键业务 7×24 小时持续运行的系统稳定性测试和高并发场景的压力测试等;

自动化测试的劣势:

  1. 自动化测试并不能取代手工测试,它只能替代手工测试中执行频率高、机械化的重复步骤。你千万不要奢望所有的测试都自动化,否则一定会得不偿失。
  2. 自动测试远比手动测试脆弱,无法应对被测系统的变化,维护成本高。其根本原因在于自动化测试本身不具有任何 “智能”,只是按部就班地执行事先定义好的测试步骤并验证测试结果。对于执行过程中出现的明显错误和意外事件,自动化测试没有任何处理能力。
  3. 自动化测试用例的开发工作量远大于单次的手工测试,所以只有当开发完成的测试用例的有效执行次数大于等于 5 次时,才能收回自动化测试的成本。
  4. 手工测试发现的缺陷数量通常比自动化测试要更多,并且自动化测试仅仅能发现回归测试范围的缺陷。
  5. 测试的效率很大程度上依赖自动化测试用例的设计以及实现质量,不稳定的自动化测试用例实现比没有自动化更糟糕。
  6. 实行自动化测试的初期,用例开发效率通常都很低,大量初期开发的用例通常会在整个自动化测试体系成熟,和测试工程师全面掌握测试工具后,需要重构。
  7. 业务测试专家和自动化测试专家通常是两批人,前者懂业务不懂自动化技术,后者懂自动化技术但不懂业务,只有二者紧密合作,才能高效开展自动化测试。
  8. 自动化测试开发人员必须具备一定的编程能力,这对传统的手工测试工程师会是一个挑战。

适合实施测试自动化的项目:

第一,需求稳定,不会频繁变更。
第二,研发和维护周期长,需要频繁执行回归测试。
对于一些中长期项目,我的建议是:对比较稳定的软件功能进行自动化测试,对变动较大或者需求暂时不明确的功能进行手工测试,最终目标是用 20% 的精力去覆盖 80% 的回归测试。
第三,需要在多种平台上重复运行相同测试的场景。兼容性测试
第四,某些测试项目通过手工测试无法实现,或者手工成本太高。性能和压力测试
第五,被测软件的开发较为规范,能够保证系统的可测试性。某些用例的自动化必须要求开发人员在产品中预留可测试性接口,否则后续的自动化会很难开展。
第六,测试人员已经具备一定的编程能力。

推行自动化测试的阻力:

软件研发生命周期各个阶段的自动化测试技术

在软件研发生命周期的各个阶段都有自动化测试技术的存在,并且对提升测试效率有着至关重要的作用。软件研发各个阶段的自动化测试有:单元测试、代码级集成测试、Web Service 测试和 GUI 测试阶段的自动化技术。

** 单元测试的自动化技术 **

** 代码级集成测试的自动化技术 **
从测试用例设计和测试代码结构来看,代码级集成测试和单元测试非常相似,它们都是对被测试函数以不同的输入参数组合进行调用并验证结果,只不过代码级集成测试的关注点,更多的是软件模块之间的接口调用和数据传递。
代码级集成测试与单元测试最大的区别是,代码级集成测试中被测函数内部调用的其他函数必须是真实的,不允许使用桩代码代替,而单元测试中允许使用桩代码来模拟内部调用的其他函数。

由于代码级集成测试主要应用在早期非互联网的传统软件企业,那时候的软件以 “单体” 应用居多,一个软件内部包含大量的功能,每一个软件功能都是通过不同的内部模块来实现的,那么这些内部模块在做集成的时候,就需要做代码级集成测试。
现在的开发理念追求的是系统复杂性的解耦,会去尽量避免 “大单体” 应用,采用 Web Service 或者 RPC 调用的方式来协作完成各个软件功能。所以现在的软件企业,尤其是互联网企业,基本不会去做代码级集成测试。

** Web Service 测试的自动化技术 **
Web Service 测试,主要是指 SOAP API 和 REST API 这两类 API 测试,最典型的是采用 SoapUI 或 Postman 等类似的工具。但这类测试工具基本都是界面操作手动发起 Request 并验证 Response,所以难以和 CI/CD 集成,于是就出现了 API 自动化测试框架。

对于基于代码的 API 测试用例,通常包含三大步骤:

Web Service 测试 “自动化” 的内涵:

** GUI 测试的自动化技术 **
GUI 自动化测试主要分为两大方向:

自动化测试试一把 “双刃剑”,虽然它可以从一定程度上解放测试工程师的劳动力,完成一些人工无法实现的测试,但并不适用于所有的测试场景,如果维护自动化测试的代价高过了节省的测试成本,那么在这样的项目中推进自动化测试就会得不偿失。

对自己测试现状的反思:没有真正理解自动化的概念,过去只是片面的认为用例执行的自动化就是自动化,也是为自动化而自动化。其实自动化贯穿了整个测试过程,从用例设计,数据准备,用例生成,响应判断,用例执行,执行结果分析,都包含了自动化的内容。现在 devops 的流行,让自动化的占据了更多的比重。个人认为自动化最重要的是思想,当现在宏观的角度看待项目,看待整个测试过程,自动化应该是我们工作的指导思想,就是通过一切手段高质量、高效率、低入驻成本的守护产品的质量。

测试主要精力放在用例设计和业务的理解上,自动化的实现只是一种手段,不能过于追求自动化实现,反而忽略了测试用例的设计,这样不仅本末倒置,而且失去了自动化的意义。


↙↙↙阅读原文可查看相关链接,并与作者交流