测试自动化,如何改善汽车软件交付

文摘   2024-10-28 07:01   上海  
“测试导致失败,失败导致理解”—— Burt Rutan
GitLab 2021 年对 DevOps 团队的全球调查显示,测试效率低下是 2021 年软件发布延迟的主要原因。越来越多的团队拥有完全自动化的软件测试,但测试仍然是软件交付的一大瓶颈。
可以理解的是,许多企业尚未实现其软件测试工作流程的自动化。自动化手动测试是一个极具挑战性的过程,需要仔细规划、标准化代码和设计可重复的测试用例有些企业可能看不到切换到自动化测试的任何价值。
因此,如果做得好,自动化软件测试将非常有益。测试自动化可以帮助团队构建更高质量的产品,更好地满足最终用户的需求(Khan,等人,2020 年)。更重要的是,自动化测试可以帮助企业在更短的时间内取得更多成就。
但测试自动化究竟如何帮助团队实现这些成果呢?要回答这个问题,我们需要了解什么是测试自动化。


什么是测试自动化?
测试自动化是使用专门的软件或脚本来测试代码,而无需 QA 工程师的手动参与。测试自动化是 CI/CD 中的一个重要组件,它几乎涵盖了 QA 工程师为验证功能更新质量而可能执行的任何类型的测试。可以自动化的测试包括:
  • 单元测试和集成测试。
  • 安全测试。
  • 可扩展性和性能测试。
  • API 测试。
  • GUI 测试。

从高层次来看,软件交付团队可以使用测试自动化来:
  • 在 CI/CD 管道的早期阶段进行测试。通过尽早测试和检测问题,团队可以防止功能更新在 CI/CD 工作流程中累积错误。这种方法可以让开发人员更轻松地修复错误,因为他们不必对即将进入准备阶段或生产阶段的代码进行大量修改。
  • 在发布之前进行更频繁的测试。与早期测试一样,更频繁的测试使团队能够尽早发现和解决问题。不仅如此,自动化还可以连续执行数百次测试,从而减少运行全面测试管道所需的时间。
  • 跨不同的环境、平台和设备进行测试。自动化测试可以与平台无关,也就是说,它们可以在任何设备或操作系统上运行。这使团队能够在设计的环境范围内更全面地测试其应用程序的质量。

“问题不在于测试是瓶颈。问题是你不知道瓶子里有什么。这是测试要解决的问题。” —— Michael Bolton


如果我们从更细微的层面来看待测试自动化,它的好处如下:
  • 缩短上市时间。CI/CD 管道的速度决定于最慢的组件,木桶能装多少水决定于最短的那个木板。自动化可以显著缩短上市时间,因为手动测试可能是软件交付的一大瓶颈。QA 工程师可能需要花几天时间才能通过手动测试完成测试例程。自动化可以将测试时间缩短到几分钟。
  • 增加测试覆盖率。测试覆盖率是手动或自动测试覆盖的代码或应用程序组件的百分比。通过自动化测试,软件交付团队可以覆盖更多领域并确保没有遗漏任何代码。此外,通过释放 QA 工程师的时间,测试自动化可以让他们探索提高工作质量的新途径。
  • 提高软件质量。测试自动化通过多种方式提高了软件质量。首先,随着测试覆盖率的提高,测试自动化在应用程序中几乎没有盲点,并且可以确保覆盖所有关键领域。其次,正确实施的测试自动化消除了人为错误的风险,并实现了对新代码的一致、可靠的测试。最后,测试自动化让人们对频繁变化的产品充满信心,并允许团队始终如一地为其应用程序提供完善的高质量更新。




手动软件测试面临哪些挑战?
根据 GitLab 2021 年对全球 DevOps 团队的调查,大多数软件交付团队都没有进行自动化软件测试。虽然手动测试可以在小规模上取得成功,但每当我们开始谈论每天需要多次运行数十和数百个测试时,手动工作就会变得极其低效。
如今,高绩效软件交付团队每天多次提交新代码。如果没有任何自动化,QA 工程师每次提交新代码时都需要手动测试。每天提交几次,每次提交几十个测试,这意味着 QA 工程师需要花费大量工作时间来运行测试。
手动一遍又一遍地进行相同的测试效率极低——以至于手动测试可以完全抵消频繁提交代码的好处。无论开发人员提交新功能的速度和频率如何,这些功能在通过测试程序之前都无法上线。
为了证实测试效率的重要性,GitLab 的 2021 年调查显示,测试是 2021 年发布延迟的主要原因。此外,2021 年是测试连续第三年被强调为发布延迟的主要原因。
安全测试对团队来说是一个特别令人担忧的问题。超过 42% 的受访者表示,安全测试在流程中发生得太晚了,大致相同的人表示他们在解压、处理和修复漏洞方面遇到了困难。对于约 37% 的人来说,跟踪错误修复的状态是一项挑战,33% 的人难以确定补救措施的优先级。也许最令人惊讶的是,32% 的人表示很难找到人来解决问题。
测试自动化可以使跟踪、识别和补救问题变得更加容易。尽管如此,根据 GitLab 的调查,大多数团队并没有完全实现测试自动化。 2021 年,各组织估计:
  • 25% 的受访团队报告称已实现全面测试自动化,是上一年的两倍多;
  • 28% 的团队报告称他们至少已实现测试自动化的一半;
  • 25% 的团队尚未实现测试自动化或刚刚开始考虑。

测试自动化有哪些商业优势?
“测试策略就像买一件新衣服……您可以买到普通商店的尺寸和款式,但如果您量身定制,它就会像手套一样合身!测试策略应该针对项目制定!”– Joao Proenca
从纸面上看,测试自动化的好处似乎很明显。但是,它在现实世界中的商业优势是什么?2021 年,Forrester Consulting 与自动化软件提供商 BMC 联合发布了一项研究,详细介绍了 BMC Compuware Topaz For Total Test 带来的节省。BMC Compuware Topaz For Total Test 是一款大型机软件测试解决方案,允许团队运行自动化单元、集成、系统和其他形式的测试。
根据研究,BMC Compuware Topaz For Total Test 的四位用户在三年内取得了以下成果:
  • 节省了 450 万美元的时间并提高了开发人员的产出,
  • 通过修复错误节省了 376,000 美元的成本,
  • 通过测试自动化节省了 290 万美元,
  • 通过减少主要大型机缺陷节省了 260 万美元。

根据研究,使用 BMC Compuware Topaz For Total Test 进行自动化测试仅需 2-3 小时,而手动测试则需要 2-3 天。开发人员节省了 90% 的测试时间,大型机代码中的错误减少了 20%。
我们已经多次提到的 GitLab 调查也提供了一些关于测试自动化和 CI/CD 实用性的见解。由于开发流程的优化:
  • 84% 的开发人员可以比以前更快地发布代码,
  • 57% 的开发人员报告代码发布速度提高了一倍(而 2020 年这一比例为 35%),
  • 19% 的开发人员设法将代码交付到生产的速度提高了 10 倍。

2021 年,10.38% 的团队将测试自动化添加到他们的武器库中。考虑到这一点,自动化测试可能有助于加速软件交付。然而,这并不是提高软件交付速度的唯一因素。除了测试自动化之外,
  • 21.02% 的团队还实施了源代码管理,
  • 17.74% 的团队实施了持续集成,
  • 13.59% 的团队实施了持续交付,
  • 11.65% 的团队采用了 DevOps 平台。

再加上测试是软件交付的主要瓶颈,测试自动化必须与 DevOps 文化和 CI/CD 管道相结合才能取得成果。 Sharma 和 Angmo (2014, p.910) 记录了 Web 自动化测试的一系列好处:
  • 节省时间和资金
  • 提高准确性,
  • 增加测试覆盖率,
  • 通过自动化实现手动测试无法实现的成就,
  • 为 QA 测试开发人员和测试人员提供自动化支持,以及
  • 提高团队士气。

NASA 喷气推进实验室 (Cervantes, 2009 年 3 月) 评估了其任务数据处理和控制子系统 (MPCS) 和多任务自动任务调用子系统 (MATIS) 中测试自动化的价值主张。STAF 框架提供了一组可用于开发自动化测试解决方案的通用测试服务。一个关键的附加组件是 STAF 执行引擎 (STAX)。它提供了一种测试自动化编程语言。STAX 促进了测试执行工作流程的开发。测试人员可以:
  • 分发测试数据,
  • 配置测试环境,
  • 执行测试,
  • 分析测试结果。

STAX 可选地提供了一个可选的 GUI,允许测试人员执行、监控和与测试活动交互。结果表述如下:
“使用 STAF 和 STAX 实施自动化测试用例展示了使用测试自动化框架的好处。最大的好处是无需开发测试基础设施来支持自动化测试的实施。似乎有 STAF 服务或 STAX 功能来促进测试每个部分的开发。”(同上,第 5 页)“使用测试框架会产生一定的开销。测试人员必须投入大量时间来学习如何使用和适应使用测试自动化框架。此外,由于测试自动化是一个开发项目,测试人员需要大量软件工程领域的知识。出于这些原因,测试自动化框架可能不适合开发人员和测试人员团队较少的小型软件项目。”(第 7 页)

可以且应该自动化的测试类型
QA 工程师的武器库可以包括各种各样的测试,每个测试都旨在检查其产品的特定区域或功能。测试自动化可以应用于各个级别的应用程序和代码,从单个功能到完整的应用程序。Sharma 和 Angmo (2014) 提出了三种类型的测试:
  • 静态和动态测试、
  • 盒式方法(白盒、灰盒和黑盒测试)以及
  • 手动和自动化测试。

以下是可以自动化的四个测试层:
  • 单元测试。单元测试检查应用程序中的单个代码或组件。QA 工程师可以自动化单元测试来检查函数、类或 API 端点的行为。单元测试非常细粒度,可以帮助工程师检查其产品的低级功能。
  • 集成测试。集成测试在更大的组件组上运行,旨在确保应用程序单元独立工作,并相互结合。本质上,集成测试结合了几个相关的单元测试并检查它们的操作。可以使用集成测试测试的功能示例包括支付处理、用户注册或消息传递。
  • 系统测试。系统测试检查整个系统的运行情况,所有通过单元测试和集成测试的组件都可以协同工作。 QA 工程师可以自动化系统测试,例如,确保他们的应用程序允许用户无缝地将产品添加到购物车、选择送货方式,然后付款以完成订单。
  • 验收测试。验收测试旨在确定应用程序是否符合最终用户的规格和要求。与前三种检查产品技术是否有效的测试不同,验收测试旨在确保产品满足最终用户的期望。验收测试可以是功能性的,也可以是非功能性的。功能测试检查产品的行为是否符合用户的预期,例如,用户提交的数据是否传递给正确的 API。相比之下,非功能测试检查应用程序的安全性、可扩展性和性能。

软件交付团队如何决定要自动化哪些测试?测试自动化的良好候选者将是:
  • 可重复。如果特定测试需要在不同的功能更新或不同的应用程序中频繁运行,那么它就是自动化的绝佳候选者。一遍又一遍地重复手动测试可能会浪费大量时间,因此自动化测试可以帮助提高软件交付团队的工作效率。
  • 决定因素。软件交付团队应该能够清楚地概述哪些测试通过,哪些测试失败。否则,当代码通过或未通过测试时,自动化测试管道将无法采取适当的措施。
  • 乏味。重复的测试让人不满意,很无聊,而且很容易导致 QA 工程师分心。自动化单调的测试是让测试更有成就感的好方法。自动化还可以让 QA 工程师腾出时间来完成更重要的任务。
  • 业务关键。对测试自动化的投资应该具有商业意义。如果某些测试的自动化将产生比交付价值更多的成本,团队应该保持手动。

不应自动化的测试类型
虽然团队可以自动化大多数类型的测试,但有几类测试很难自动化或不应该自动化。这些包括:
  • 只运行一次的测试。从业务角度来看,自动化一次性测试可能没有意义,因为成本可能会超过收益。话虽如此,如果测试很复杂并且需要很长时间,自动化测试可能是值得的。
  • 探索性测试。由于探索性测试是在不太了解的组件上进行的,因此它们通常不可能实现自动化——至少是完全不可能。此外,探索性测试可能具有一定的随机性,因为 QA 工程师可能需要探索现有测试未涵盖的应用程序的新方面。
  • 正在开发的新功能的测试。正在进行的功能和代码可能会频繁更改,因此自动化测试不切实际。团队可能能够成功地为正在开发的功能开发自动化测试套件,但如果该功能由于不符合性能或安全要求而突然更改,则可能需要完全重写自动化测试。在编写新代码和功能时,应尽可能同时考虑手动和自动测试,但自动化测试本身应在功能最终确定和部署后进行。
  • UX 测试。UX 测试可能很难实现自动化,因为它们严重依赖最终用户的反馈。量化用户体验是 UX 测试自动化的主要挑战之一。应用程序或网站上线后,衡量用户体验会很容易,因为团队可以使用跳出率、转化率或平均订单价值等指标来衡量客户满意度。但在应用程序开发过程中,预测用户体验的好坏可能非常困难。但是,机器学习等预测方法可以根据真实用户的过去数据有效地对用户体验进行评分,从而使用户体验测试自动化更加容易实现。

下一步
“一组经理被分配了测量旗杆高度的任务。所以他们带着梯子和卷尺来到旗杆前,他们努力获得正确的测量结果;他们把卷尺掉在地上,从梯子上摔下来。一位测试人员走过来,看到他们在做什么,走过去,把旗杆拉下来,放平,从一端到另一端测量,把测量结果交给其中一位经理,然后走开。测试人员走后,一位经理转向另一位经理笑道,‘这不就是测试人员吗?我们寻找高度,他给我们长度。”——笑话:旗杆的“高度”
在面向 DevOps 的 CI/CD 管道中,没有相应的自动化测试套件,任何代码都不会交付。尽早进行测试是保持软件无错误、安全、高效和对最终用户有吸引力的关键。
软件交付团队可以从头开始编写自己的自动化测试,也可以使用第三方自动化软件来节省时间。选项很多,但无论软件交付团队选择哪种方式,标准化和模块化都是测试自动化的最重要先决条件。
由于标准化的代码和应用程序组件,微服务可以轻松地在多个项目中重复使用。同样,标准化使软件测试可重复和可转移。如果不同的应用程序产品建立在相同的标准化组件上,开发人员和 QA 工程师可以构建自动化测试套件并轻松地在各种产品中重复使用它们(Garousi 和 Elberzhager,2017 年;Polo 等人,2013 年)。
然而,自动化测试只是故事的一部分。测试并不是软件交付管道中唯一应该自动化的事情——从提交到部署的每个步骤都应该自动化。自动化软件交付的关键是编排 [TA2],更具体地说是 CI/CD。

References:

Bossert, O., Ip, C., & Starikova, I. (2015). Beyond agile: Reorganizing IT for faster software delivery. McKinsey & Company.

Brown, A. W. (2012). Enterprise software delivery: bringing agility and efficiency to the global software supply chain. Addison-Wesley.

Forsgren, N., & Humble, J. (2016). The role of continuous delivery in IT and organizational performance. In the Proceedings of the Western Decision Sciences Institute (WDSI).

Google Cloud. (2021). Accelerate State of DevOps 2021.

Motingoe, M., & Langerman, J. J. (2019, July). New Organisational Models That Break Silos in Organisations to Enable Software Delivery Flow. In 2019 International Conference on System Science and Engineering (ICSSE) (pp. 341-348). IEEE.

软硬件协同设计 HW-SW Co-Design
欢迎后台留言,AI 客服全天在线。脱离物理硬件,开发测试和调试软件。基于虚拟原型的软硬件协同设计,提前一年实现产品上市创收,降低一半开发时间。
 最新文章