【51CTO.com快译】众所周知,在软件开发的生命周期中,开发人员往往需要修改已有代码,或将新功能引入目标系统。不过,此类更改可能会通过影响现有功能对系统造成破坏。因此,我们需要执行一系列测试,以验证新的代码对系统不会造成负面影响。这便是回归测试。
在本文中,我们将从回归测试的概念入手,讨论其实施的重要性,以及那些实现自动化测试的方法与优秀实践。
什么是回归测试?
回归测试(https://en.wikipedia.org/wiki/Regression_testing)是一种软件的测试形式,能够涵盖软件系统中的各种功能性和非功能性的元素。我们可以在执行如下操作后,通过它来发现潜在的问题或错误。
部署新的功能
添加新的模块
修复现有缺陷
重构程序代码
更改系统配置
改善应用程序的性能
针对上述任何事件,如果采用手动的方式测试整个系统,显然既费时又费力。开发团队往往希望通过自动化测试的方式,来加快整个工作流程,以实现每修改一次代码,都能执行一系列预先开发好的测试脚本。据此,他们能够在进行连续性回归测试的同时,降低测试的总体成本,减少人为错误,并保持更高的准确性。
为何要使用自动化回归测试?
如前文所述,我们在对每个系统组件进行下一阶段开发之前,需要对其进行彻底的测试,否则就会积累所谓的技术债(technical debt)。这不仅成本高昂,而且对于开发工作流程来说也是危害极大的。
值得注意的是,错误的修复成本会在软件开发的各个阶段呈指数性增长(请参考:https://www.nist.gov/system/files/documents/director/planning/report02-3.pdf),并且会在产品发布的时候高达30倍以上。下图是此类费用随时间增加的统计图。
可见,通过在开发的早期阶段进行彻底的测试,不但可以及时地发现错误,还能够避免纠正错误所带来的高昂成本。这也正是自动化回归测试发挥作用的地方。当然,除了改进错误检测的效率,自动化回归测试还能够为开发工作、及其流程带来如下好处:
更高的测试覆盖范围 - 自动化能够让我们通过运行更多的回归测试,来检查系统的各个方面。显然,这是手动回归测试所无法达到的彻底水平。
更高的测试投资回报率 - 尽管自动化测试有时会引发更高的初期投资,但是从长远来看,由于软件开发和维护是一个连续性的过程,因此自动化回归测试往往可以在可预见的将来,为团队节省大量的时间与金钱,并能收获更大的回报。
更少的人力成本 - 使用自动化测试平台时,团队只需一名QA(质量检测)工程师即可测试脚本。相反,手动回归测试将需要数名专业人员,才能达到相似的效果。因此,自动化大幅减少了回归测试所需的总体时间和人力成本。
增强的稳定性 - 手动回归测试的结果,往往取决于团队中QA专家的专业知识和测试方法。而自动化却能够确保用相同的专业技术,来测试整个系统的方方面面。
重复性 - 自动化回归测试可以按需随时执行,而无需顾及QA团队是否有时间和精力。而手动测试则需要为每个新项目配备足够的QA人员。
如何执行自动化回归测试?
正如执行任何其他类型的自动化软件测试一样,我们需要遵循预定义的测试路线,才能成功地完成回归测试。
正所谓“工欲善其事,必先利其器”,我们在执行自动化回归测试前,首先也是最重要的一步是:选择合适的工具。目前市场上的自动化回归测试工具林林总总,其中比较流行的包括Selenium、TestComplete、Ranorex Studio和Perfecto。
接着,我们可以按照如下四步来开展自动执行回归测试:
发现和计划 - 首先概述产品将要发布的范围,确定哪些测试用例可能会被包含在回归测试的套件中。
设计和开发 – 在确定测试项目需包含的所有任务后,开始为每个测试用例编写自动化的脚本。
测试执行 – 运行测试,并在执行过程中识别错误。
测试结束 - 最后,记录和提交测试报告,进而执行其他的后续测试。
自动化回归测试的方法
目前,业界通常会使用如下三种方法,来执行自动化回归测试(请参见--https://ieeexplore.ieee.org/document/10189)。您该具体选择哪种方法,则完全取决于开发的优先级、代码库的大小、以及可用在测试中的资源。
全部重新测试 - 有时候,在代码库上执行所有现有的回归测试是一种最佳选择。尽管需要初期大量的投入,但是只要设计合理,就能够发现一些不需要回归的环节。当然,客观地说,该方法对于大型代码库几乎是不可行的。
基于优先级重新测试 – 按照重要性和紧迫性的顺序,执行测试用例。在确定具有最高优先级的测试用例时,往往需要QA专家给出专家意见。而且,优先级测试应涵盖所有关键的代码路径,以发现那些严重的错误。
选择性重新测试 - 您可以选择回归测试套件中的一个子集来执行,而不是重新运行整个测试套件。在后续的回归周期中,您只需执行那些可以在代码库上复用的测试用例,并将过时的用例剔除出去。
此外,您还可以使用混合回归测试技术,即:先执行优先级测试,然后再运行其他必要的测试,以避免遗漏并实现全覆盖。
自动化回归测试的实例
如前所述,我们可以根据对代码库所进行的更改,来采用不同形式的回归测试。有些是在添加新的功能后执行,而有些是在修复了系统中已知错误后执行。下面,让我们来讨论回归测试的一些实际案例:
场景1:假设有一个具有数据库管理功能的应用,其核心功能有三个,即:数据添加、数据保存、以及数据删除。当我们在新版本中,引入允许用户对数据进行修改的“数据更新”功能时,则需要通过执行回归测试,来确保该功能不会影响到既有的“添加”、“保存”和“删除”功能。
场景2:某个系统具有管理员、版主、客户和作者,四个角色模块。如果管理员模块出现了错误,那么就会导致作者使用其凭据,以版主的身份登录到后台系统中。因此,测试团队需要反馈开发团队修复该错误。而在实施了有效修复后,测试团队将再次检查系统,以确保具有修复功效的代码能够正常工作,且不会影响到其他模块与功能(该过程便是回归测试)。
根据上述的场景,我们来讨论其中的登录验证功能,即:用户输入其登录凭据(如用户名和密码),然后单击登录按钮。其中,用于测试此功能的分步实施代码如下:
如下代码则展示了当我们对该功能性代码进行测试时,生成的具有登录功能的类:
上述代码实为手动回归测试的示例。如果我们使用诸如Perfecto之类的自动化回归测试工具,则无需对测试脚本进行硬编码。我们只需做到:首先,确定可能用到的回归测试,并记录每个测试用例的工作流程。接着,使用Perfecto仪表板对测试方案进行建模。如下图所示,我们可以让Perfecto协助将工作流程转换为测试脚本。
在工作流程准备就绪后,我们即可执行测试并捕获结果。而在完成测试之后,Perfecto将返回对应的测试通过或失败状态,并为每个执行的命令提供详细的反馈。据此,您可以相继开展分析测试结果,生成报告,以及重新测试更改等工作。
自动执行回归测试的最佳做法
在执行回归测试时,开发团队往往会碰到包括:时间与资源有限,测试时间过长,测试用例增多等各方面的挑战。为了避免“踩坑”,并能够成功地完成自动化回归测试,我在此为您罗列了如下实践建议:
选用可靠的自动化工具,以扩大测试的范围,并利用其自动化的优势。
在整个项目中采用常规化的测试方案。
通过独立可重用的回归测试,以节省时间。
在修改代码库后,应重新运行过往已成功完成的测试。
通过定期更新回归测试包,以确保与更新的产品版本相对应。
为每个新发现的错误编写各种测试。
确保所有集成测试用例都被包含在回归测试的套件中。
希望上述实践经验能够帮助您平滑地开展回归测试,并获得预期的结果。
小结
回归测试是在减少潜在技术债,并改善软件项目维护态势的有效方法。借助自动化测试工具,开发团队不但能够简化测试的整体工作量,并且可以确保产品在交付到生产环境之前的稳定性与代码质量。
原文标题:All You Need To Know About Automating Regression Tests,作者: Dickson Mwendia