2.1 为什么自动化测试是必要的

在谈为什么自动化测试是必要的之前,我们先来看看自动化测试到底是什么。

简单来讲,自动化测试是以程序测试程序,以代码代替思维,以脚本的运行代替手工测试。自动化测试涵盖了:黑盒(功能)自动化测试、白盒(功能)自动化测试、性能测试、压力测试、GUI(Graphical User Interface)测试、安全性测试等。

从广义上来讲,自动化测试包括一切通过工具(程序)的方式来代替或辅助手工测试的行为,包括接口测试(REST Assured、Postman)、性能测试工具(LoadRunner、JMeter)和自己所写的一段程序。

从狭义上来讲,自动化测试通过工具记录或编写脚本的方式模拟手工测试的过程,通过回放或运行脚本来执行测试用例,从而代替人工对系统的功能进行验证。

自动化测试是将自动化工具和技术应用于软件测试中,旨在减少测试工作量,更快、更经济地验证软件质量,有助于以更少的工作量构建质量更好的软件。

自动化测试引入的作用是节省人力、物力、时间、硬件资源等,提升测试效率,特别是对于烦琐重复的测试用例,可以使测试人员更专注于新的测试模块的建立和开发,从而提高测试覆盖率。

总结一下,引入自动化测试的核心目的主要围绕两个方面:(更高的)质量+(更高的)效率。

现如今,许多公司多多少少都在做自动化测试,但手动测试仍然占很大的比例,因为有些团队不知道如何在开发过程中更好地利用自动化测试来替代手动测试。

有些公司认为在组织中引入自动化测试时,需要投入大量财力和时间,但一般没有太多的投资回报。因此,他们害怕投资自动化测试,不是因为负担不起这个投入,而是因为他们担心回报不会像预期的那样,或者根本不会产生积极的投资回报。

有诸如此类想法的公司或团队往往没有深层次地认识到自动化测试所能带来的长久价值。下面从几个方面进行介绍,帮助大家理解为什么说自动化测试对组织是必要的,以及它可以给组织带来的益处。

1.降低成本(特别是问题出现时的成本)

如果想证明引入自动化测试的合理性,不能只关注投资回报,而应考虑应用出现问题导致的隐性成本。例如,一个问题在手动测试中没有被发现而出现在产品环境中,公司会花多少钱?你是否会失去客户?需要花多少时间、资源和资金来解决这个问题?

如果每次对代码进行更改时,都可以自动地执行一组非常强大的测试套件,可以降低问题出现在产品环境的风险。自动化测试有助于在软件开发生命周期的早期发现错误,从而降低交付故障软件的风险。

说到底,向市场提供高质量的产品的重要性远大于任何其他类型的节省。

2.节省人力时间

手工测试通常是工程师执行预定义的测试用例,将执行结果与预期的行为进行手工比较并记录结果。每次源代码更改时都会重复这些手工测试,由于都是人为参与和准备的,这个过程中不仅容易出错而且耗时费力。

虽然引入自动化测试一开始需要花费大量的时间和人力,但是一旦自动化测试系统建立了,就可以重用这些测试。自动化测试的执行速度明显快于手工测试,从而将重复的手工测试时间从数周缩短至数小时。

同样一旦编写好,测试可以执行任意次。与手工测试不同,自动化测试可以在下班后无人值守时执行。

3.自动化测试是推动CI和DevOps的基础

自动化测试是构建CI(持续集成)或DevOps的基础。从本质上讲,CI和DevOps都依赖于“Fail fast,Fail early”的理念。对代码库的每次提交都将自动进行测试,并将结果报告给开发人员。开发人员优先修复导致构建失败或导致主要测试失败的错误,确保主线代码始终按预期工作。

4.准确性和可靠性

由于运行每个测试涉及多个先决条件,手工测试容易出错。另外每个测试可能需要不同的执行顺序。毕竟手工测试人员是人,很多人有不善于执行重复枯燥工作的特点,因此可以预料手工测试不会精确并有一定的出错概率,这会导致将不准确的结果反馈到开发团队。

而自动化测试每次都执行相同的步骤,不仅精确,而且结果可在最短的时间内提供给所有相关人员。

另外,在不同服务器上重新执行相同的测试,使得能够快速验证测试是否在所有服务器上按预期运行,从而排除了出现服务器配置问题的可能性。

5.模拟人工难以实现的测试手段

自动化测试可以模拟一些人工很难模拟的测试手段,比如性能测试。利用自动化性能测试能够同时运行数千个用例,模拟数百万用户,所有这些用户如果采用人工手动测试几乎都是不可能的。

6.增强产品快速持续迭代发布的能力

现如今,大多数互联网企业都采用敏捷开发方法,而敏捷产品最突出的一个特点就是产品要能根据市场不断变化的需求快速迭代适应。在敏捷产品研发中,好的情况是能维持2~3周一个版本迭代,但我们经常需要1周内对新特性进行发布,甚至有的周期更短,这就需要一种新的方式来组织测试工作并要求有更高的效率。

在敏捷迭代中,每个Sprint都专注于开发一组小功能,但必须在其结束的时候提供较完整的新功能特性,还包括之前Sprint的所有功能特性。如果没有做适当的测试,在不破坏之前正常工作的功能特性的情况下提供全功能系统风险很高。在每个Sprint中反复手工测试所有功能效率很低。

这也是自动化测试最大的好处。自动化测试能够在每个Sprint中快速重复测试,可以确保所有事情都按预期进行。

7.衡量质量指标

自动化测试还提供了测量产品代码质量指标的功能,例如代码覆盖率(即实际测试的代码百分比)、技术债、代码语义检查等。

之所以能够测量这些指标,是因为自动化测试代码本身可以与产品代码共存,通过在自动构建阶段解析源代码,能在几分钟内测量巨大代码库质量的潜在风险。这在手工测试中根本不可能。