你在测试金字塔的哪一层(上)

陈哥聊测试
• 阅读 243

在准备将软件上线到生产环境之前需要进行测试。随着软件测试方式日趋成熟,软件开发团队的测试也在取代大量手动测试,逐渐实现自动化测试。 通过自动化测试,开发团队可以在短短几分钟内就了解到软件是否存在问题,而不需要等待几天的时间。

自动化测试大大地缩短了反馈周期,与敏捷开发、持续集成和DevOps文化密切相关。本文将分为上、下篇来探讨如何构建一个高响应、可靠并且可维护的测试组合,无论是针对微服务架构、移动应用程序还是物联网生态系统。

一、自动化测试的重要性

早期,软件的目的仅仅是提高企业效率,但如今软件已成为我们生活中的重要组成部分。许多公司都在努力成为一流的数字化公司,而作为用户的我们每天都在使用各种各样的软件,创新的车轮转动越来越快。

要想跟上创新的脚步,我们必须在保证软件质量的同时加快交付的速度。持续交付是一种软件工程手法,通过在短周期内完成软件产品的交付过程,确保软件可以稳定、持续地发布。通过构建流水线自动化测试,自动将其部署到测试和生产环境中。

随着软件数量的不断增加,手动构建、测试和部署很快就会变得不切实际。如果我们不想把大量时间都花在重复性的手动测试上,那么自动化测试是前进的必由之路。

从构建、测试到部署、基础架构,自动化测试是不可或缺的。它不仅能够提高效率、减少错误,还能够让开发人员释放更多时间专注于创造性的工作。

你在测试金字塔的哪一层(上)

传统的软件测试通常是手动操作完成的,包括将应用程序部署到测试环境中,然后执行黑盒测试,如点击用户界面检查是否有任何故障。这些测试通常是由测试脚本指定,以确保测试人员进行一致的检查。

**手动测试的所有变更都是耗时、重复且乏味的。**重复是枯燥的,而枯燥容易导致错误的出现,还会让测试人员随时产生“另谋高就”的想法。幸好,有一种方法可以解决这种重复性工作:自动化测试。

**自动化测试会极大程度地改变软件开发人员的工作方式。**一旦将这些测试自动化,测试人员就不再需要手动执行点击操作来检查软件是否仍能正常运行。通过自动化测试,可以轻松修改代码库。如果之前在没有适当测试组合的情况下进行大规模重构,你一定会知道这是多么可怕的经历。

如何确保在重构过程中避免不小心破坏任何内容?只能一个个手动执行测试用例了。如果能在喝一口咖啡的时间内,在几秒钟内知道自己是否进行了大规模修改,那该有多好。这听起来更有意思。

二、测试金字塔

在《敏捷成功》一书中,Mike Cohn提出了一个重要的概念:测试金字塔。这个概念通过视觉隐喻向我们展示了不同层次的测试。

Mike Cohn独创的测试金字塔由三层组成(从下到上):

  • 单元测试
  • 服务测试
  • UI测试

你在测试金字塔的哪一层(上)

然而,一些人对测试金字塔的命名或概念提出质疑。虽然测试金字塔确实过于简单,会产生某些误导,但在实际应用中,测试的层次和比例会因项目的特殊需求而有所不同。因此,我们需要灵活地应用测试金字塔,根据具体情况进行调整和定制,以确保我们能够全面而有效地测试软件。

尽管如此,测试金字塔的本质是一种经验法则,用于构建自己的测试组合。Cohn强调在最初构建测试金字塔时要注意两点:

  • 编写不同粒度的测试
  • 随着测试级别的提高,应进行的测试数量会减少

坚持金字塔的形状,以构建一个健康、快速和可维护的测试组合,但不要形成“测试冰激凌锥”,因为这会导致维护困难且运行时间过长。

我们不必过于拘泥测试金字塔中每层的名称,这些名称可能会带来一些误导。例如,“服务测试”是一个难以理解术语,正如Cohn本人曾说的“我观察到很多开发人员完全忽略了这一层”。在现代的单页面应用框架(如react、angular、ember.js)中,UI测试显然不必位于金字塔的最高层,完全可以对UI进行单元测试。

考虑到原始名称的缺点,根据代码库和团队讨的需要,为测试金字塔每层选择其他名称,只要中保持一致即可。

你在测试金字塔的哪一层(上)

三、注意事项

1、团队在测试命名上保持统一

我们很难去讨论测试的不同分类,不同的人对不同测试类型的理解存在着差异。**术语含义本身有模糊性,在这个问题上并没有绝对的对与错。**无论是端到端测试、广域栈测试,还是功能性测试,都没问题。

如果业界能有一些明确定义的术语并统一语言,那是再好不过了。迄今为止,软件开发社区也没法给出关于测试术语的明确定义。此外,在编写测试时会存在许多细微差别,它们的范围更像是互相重叠而不是互相独立的,这使得保持术语的一致性更为困难。

重要的是找到适合团队的术语,并清楚理解不同类别测试之间的区别。**团队需要在测试命名上保持统一,并为每一类测试明确定义范围。**只要在团队内部达成一致,就不需要过多关注其他事情了。

2、把测试放在部署流水线上

如果正在实施持续集成或持续交付的实践,那么在每次提交更改时,将使用一个部署流水线来运行自动化测试。这个流水线通常会被分成几个阶段,逐步建立起团队对将软件部署到生产环境的信心。在考虑如何在部署流水线中放置不同类型的测试时,需要思考持续交付的核心价值观之一:快速反馈

构建流水线的目标是在构建失败时能够及时通知测试人员。测试人员肯定不希望等待一小时后才发现最新的改动因为几个简单的单元测试而失败。

为了快速获得反馈,我们可以将运行快速快的测试放在流水线的较早阶段执行,这样我们可以在迅速得到反馈。反之,将运行时间较长的测试(通常是覆盖范围更广的测试)放到流水线的后期阶段执行,以免影响我们从运行速度快的测试中获取快速反馈的体验。

部署流水线中不同阶段的差异并不是由测试类型决定的,而是取决于测试的运行速度和覆盖范围。 在这种情况下,将一些覆盖范围有限、运行速度快的集成测试与单元测试放在同一个阶段是一个合理的决策。我们的目标是更快地获得反馈,而不是在各种类型的测试之间划出清晰的界线。

你在测试金字塔的哪一层(上)

3、避免测试重复

我们已经了解了为什么需要为软件编写不同类型的测试,**但是这还有一个需要避开的陷阱:金字塔不同层级进行重复测试。**编写和维护测试需要花费时间,而阅读和理解其他人编写的测试也是如此,此外运行这些测试也要费时间。

对于产品代码,我们应该追求间接性,尽量避免重复。在实现测试金字塔时,我们应该牢记以下两个基本法则:

  • 当上层测试发现了一个错误,并且底层测试已经全部通过时,我们应该写一个更低层级的测试来覆盖这个错误。
  • 我们应该尽可能地将测试推进到金字塔的下层。

第一条法则是因为通过低层级测试有助于缩小错误范围,并将大部分上下文隔离开,从而更容易重新调试错误。在解决当前问题时,低层级测试能够更快地运行,且没有太多冗余的内容。此外,它们也是很好的回归测试,确保已修复的问题不会再次出现。

第二条法则能保持测试组合的快速运行。如果在底层及测试中已经覆盖了所有情况,那么维护一个高层级的测试就没有必要了。因为它并不能为软件的正常工作提供更多的信心。如果有许多无效的测试,它们只会让你的日常工作变得繁琐。这样的测试组合会拖慢工作节奏,当你改变代码行为时,还需要修改更多的测试。

你在测试金字塔的哪一层(上)

总而言之,如果编写更高层级的测试能增加对软件的信心,那么就编写高层级的测试。在处理Controller类时,单元测试可以用来测试其内部逻辑,但无法验证该Controller是否能够真正响应REST路径的HTTP请求。在这种情况下,我们可以通过编写一个专门测试这一点的测试来提升测试层级,只关注这一点而不需要涉及其他内容。我们无需重复测试所有条件分支和边缘场景,因为底层级测试已经涵盖了这些内容。确保高层级测试仅关注底层及测试未覆盖到的部分。这样可以确保测试的焦点准确,并避免重复劳动。

对待已经失去价值的测试,我们需要果断将其淘汰。哪些已经被低层级测试完全覆盖的高层级测试应该被删除,因为它们不再提供额外的价值。我们应该尽可能用低层级测试来取代高层级测试。尽管有时会面临一些挑战,特别是当我们意识到设计测试本身就很具有挑战性时,但我们要警惕陷入沉没成本的思维陷阱,果断摁下删除键。我们不要在在那些不再提供价值的测试上浪费宝贵时间。

四、写在最后

不管你是工作在一个微服务项目上,还是IoT设备上,抑或是手机应用或者网页应用,希望这篇文章能够为你提供帮助。下篇,我们将详细介绍测试金字塔的三个层级。

文章翻译来源:https://martinfowler.com/articles/practical-test-pyramid.html

点赞
收藏
评论区
推荐文章
Stella981 Stella981
3年前
RSAC2019创新沙盒大赛公司shiftleft介绍
!(https://oscimg.oschina.net/oscnet/8c90299fbb33785510ed9cdc8ef611800c0.jpg)概念:本身ShiftLeft这个单词的在测试行业的意思就是将软件测试阶段尽量前置,测试、开发人员使用项目管理、自动化测试工具全量参与到软件开发活动中。ShiftLeft这家公司于17年
Stella981 Stella981
3年前
Parasoft cpptestcli 指令行参数配置
ParasoftCtest  是款功能非常强大的自动化测试工具,能有效提高软件开发效率和代码质量。功能特点如下:    静态代码分析和编码策略实施;  自动代码审查的图形界面和进度跟踪;  自动化的单元测试和回归测试;  代码覆盖率分析,集成通过应用层覆盖跟踪从单元级测试;  结合静态分析、单元测试、代码评审和其他
Wesley13 Wesley13
3年前
MySQL 快速创建千万级测试数据
备注:此文章的数据量在100W,如果想要千万级,调大数量即可,但是不要大量使用rand()或者uuid()会导致性能下降背景在进行查询操作的性能测试或者sql优化时,我们经常需要在线下环境构建大量的基础数据供我们测试,模拟线上的真实环境。废话,总不能让我去线上去测试吧,会被DBA砍死的创建测试数据的方式
Wesley13 Wesley13
3年前
2020自动化测试岗位需求的7项必备技能(更新版)
随着敏捷和DevOps等新时代项目开发方法逐渐取代旧的瀑布模型,测试需求在业界不断增长。测试人员现在正在与开发人员一起工作,自动化测试在许多方面极大地取代了手动测试。如果您是自动化测试领域的新手,刚雇用您的组织将期望您快速,开箱即用,并能够检测到错误或提供没人想到的解决方案。但是,仅凭测试的基础知识,您将如何成为一名成功的,不同于前任的测试自动化工程师?成为
Stella981 Stella981
3年前
Chapter 2 全程测试:闪光的思想
软件质量其实是在软件开发生命周期中慢慢形成的,或者说,软件质量是内建的(Qualityisbuiltin),而不是测试测出来的。贯穿于软件开发全过程的测试,不仅可以在第一时间内发现缺陷,降低缺陷带来的成本(劣质成本),而且能有效的预防缺陷的产生,构建更好的软件产品质量。2.1测试的左移和右移测试左移:将测试计划与设计提前进行,以及开展需求
新支点小玉 新支点小玉
11个月前
什么是黑盒白盒测试,他们有什么区别?
软件测试是软件开发过程中的基本活动。黑盒测试和白盒测试是两种不同类型的软件测试策略,它们具有同样强大的功能,并且结合使用时甚至更好。一、黑盒测试在软件中,黑盒测试很方便,可以减少灾难性(软件)崩溃的风险。灾难性的软件崩溃可能是什么?系统在更新客户数据库的过
陈哥聊测试 陈哥聊测试
9个月前
如何选择合适的自动化测试工具?
自动化测试是高质量软件交付领域中最重要的实践之一。在今天的敏捷开发方法中,几乎任一软件开发过程都需要在开发阶段的某个时候进行自动化测试,以加速回归测试的工作。自动化测试工具可以帮助测试人员以及整个团队专注于自动化工具无法处理的各自任务,但困难的部分就是选择
陈哥聊测试 陈哥聊测试
8个月前
你在测试金字塔的哪一层(下)
测试金字塔分为单元测试、服务测试、UI测试,那它们分别是什么呢?本期文章让我们一起详细看看测试金字塔的不同层次。
敏捷开发 敏捷开发
5个月前
实践了上万次,原来这些才是敏捷测试需要遵循的原则
与传统的阶段性测试不同的是,敏捷测试能够将测试集成到整个软件开发过程中,尽早、及时地发现缺陷,帮助交付有价值的高质量产品。传统测试与敏捷测试的比较大的区别在于:在瀑布方法中,测试只能在开发结束后进行;在敏捷方法中,测试是贯穿在整个开发过程中的,同时可以在需
陈哥聊测试
陈哥聊测试
Lv1
资深敏捷测试顾问,致力于测试自动化和DevOps等的实践和研究。
文章
48
粉丝
0
获赞
2