什么是自动化测试?
自动化测试是一种软件工具的应用,用于自动化由人驱动的检查和验证软件产品的手工过程。大多数现代敏捷和DevOps软件项目现在都包括从一开始就进行自动化测试。然而,为了充分理解自动化测试的价值,先学习下在它被广泛采用之前的测试是什么样的。
在手工测试还是标准做法的时候,软件公司雇佣全职QA团队是很常见的做法。这个团队将开发一个“测试计划”的集合,或者一步一步的检查列表,以断言软件项目的某个特性的行为符合预期。然后,QA团队将在每次将新的更新或更改推送到软件项目时手动执行这些检查列表,然后将测试计划的结果返回给工程团队,以进行审查和任何进一步的开发以解决问题。
这个过程缓慢、昂贵且容易出错。自动化测试为团队效率和质量保证团队的投资回报率带来了巨大的收益。
自动化测试将所有权责任交给了工程团队。测试计划与常规的路线图特性开发一起开发,然后由软件持续集成工具自动执行。自动化测试促进了精益QA团队规模,并使QA团队能够专注于更敏感的特性。
持续交付(CD)就是尽可能快地向客户交付新的代码版本。自动化测试对于实现这个目标至关重要。如果在交付过程中有一个手动的、耗时的步骤,那么就没有办法自动地向用户交付。
CD是更大的部署管道的一部分。CD是持续集成的继承者,也依赖于持续集成。CI完全负责对任何新的代码更改运行自动化测试,并验证这些更改不会破坏已建立的特性或引入任何新的错误。一旦持续集成步骤通过自动化测试计划,就会触发CD。
自动化测试、CI和CD之间的这种关系为高速软件团队带来了许多好处。自动化测试通过确保新的提交不会引入任何错误来确保每个开发阶段的质量,因此软件始终保持部署就绪。
自动化测试完成后,持续集成基于自动化测试的执行结果达到预期后才开始集成。然后才是基于代码增量的持续交付。
首先应该自动化什么样的测试?
1. 端到端测试
可以说,最有价值的测试是端到端(E2E)测试。端到端测试模拟整个软件产品堆栈的用户级体验。端到端测试计划通常涵盖用户级别的故事,如:“用户可以登录”“用户可以存款”“用户可以更改电子邮件设置”。这些测试的实现是非常有价值的,因为它们可以保证真正的用户有一个流畅的无错误的体验,即使是在推送新的提交时。
端到端测试工具捕获并重放用户操作,因此端到端测试计划就成为关键用户体验流的记录。如果一个软件产品缺乏任何类型的自动化测试覆盖,那么它将通过实现最关键的业务流的端到端测试来获得最大的价值。为了捕获和记录用户流序列,端到端加密测试可能会非常昂贵。如果软件产品没有进行快速的每日发布,那么让一个人工团队手动执行E2E测试计划可能会更经济。
2. 单元测试
顾名思义,单元测试涵盖代码的各个单元。代码单元最好在函数定义中度量。单元测试将覆盖一个单独的功能。单元测试将断言函数的预期输入与预期输出相匹配。具有敏感计算的代码(可能与金融、医疗保健或航空航天有关)最好由单元测试来覆盖。单元测试成本低,实现速度快,投资回报高。
3.集成测试
通常情况下,一个代码单元会对第三方服务进行外部调用。正在测试的主要代码库将无法访问此第三方实用程序的代码。集成测试处理模拟这些第三方依赖项,并断言与它们接口的代码行为符合预期。
集成测试在编写方式和工具方面类似于单元测试。集成测试可以是E2E测试的廉价替代品,然而,当单元测试和E2E的组合已经到位时,投资回报是有争议的。
4. 性能测试
在软件开发环境中,“性能”用于描述软件项目的反应速度和响应能力。性能指标的一些例子是:“页面加载时间”,“首次呈现时间”,“搜索结果响应时间”。性能测试为这些示例用例创建度量和断言。自动化性能测试将跨这些指标运行测试用例,然后提醒团队任何倒退或速度损失。
哪些类型的软件测试应该手动完成?
任何可以自动化的测试都应该被自动化,这是有争议的。这在生产力和人力时间成本方面是一个巨大的收益。尽管如此,与执行手动测试相比,开发自动化测试套件的ROI有时是不值得的。
1. 探索性测试
自动化测试由脚本编写,并遵循一系列步骤来验证行为。探索性测试更随机,尝试无脚本的序列来发现bug或意外行为。虽然有软件工具来建立软件探索性测试套件,但它们还没有完全成熟,也没有被广泛采用。指派一名手工QA测试人员,并利用人类的创造力来探索如何破坏软件产品,这可能会更有效。
2. UI回归测试
当软件UI引入视觉设计缺陷时,就会发生视觉回归。这可能是错误定位的UI元素,错误的字体,错误的颜色或更多。与探索性测试一样,有一些工具可以编写自动化测试来捕获这些回归。这些工具从软件产品的各种状态中捕获屏幕截图,然后使用OCR将它们与预期结果进行比较。这些测试的开发成本很高,而且这些工具没有被广泛采用。让一个人来检查一些东西,看看是否有任何视觉问题,可能会更有效。
3.为DevOps团队构建一个测试自动化框架
自动化测试没有包罗万象的解决方案。当为您的团队计划一个自动化测试解决方案时,有几个关键的考虑因素需要考虑。
4. 发布频率
以固定的时间间隔发布的软件产品,比如每月或每周,可能会发现手动测试更适合。快速发布的软件产品将极大地受益于自动化测试,因为CI和CD依赖于自动化测试。
5. 可用的工具和生态系统
每种编程语言都有自己的互补工具和实用程序生态系统。每种类型的自动化测试模式都有自己的工具集,这些工具在特定的编程语言生态系统中可能可用,也可能不可用。自动化测试模式的成功实现将需要语言和工具支持的交集。
6. 产品市场适应性和代码库成熟度
如果您的团队正在构建一个尚未证明其目标受众或业务模型的新产品,那么投资自动化测试可能没有意义。自动化测试作为一种保险机制来限制意外的代码回归。如果您的团队正在以高速移动,那么当代码发生巨大而迅速的变化时,更新和维护自动化测试的成本可能会令人沮丧
让自动化测试成为CD管道的一部分
自动化测试是标准的现代软件开发实践。最好的团队和公司使用自动化测试。CI/CD依赖于自动化测试,对于帮助最好的团队向客户交付可靠和健壮的软件至关重要。
END