测试管理 敏捷团队的最佳测试实践:自动化金字塔

陈哥聊测试 · 2021年09月03日 · 最后由 赵宗浩 回复于 2022年03月18日 · 4259 次阅读

自动化测试和敏捷软件开发常常是成对出现,但敏捷中的自动化往往说起来容易做起来难。大多数开发人员都已经认识到测试自动化的好处:它加快了测试速度、降低了成本、增加了覆盖率等。但是,许多人从未超过开始所需的初始投资。就像这幅漫画中的穴居人一样,许多团队陷入了困境,他们采用着低效率的方式,因为自认为根本没有时间去做出改变。而实际上,他们自己受到损害。不要养成这个坏习惯!

今天,与你分享敏捷团队的最佳测试实践之一。

要如何开始?如何知道要关注哪些领域?哪些测试方案应该采用自动化?在非敏捷软件开发中,很多人不经意地陷入了 “冰淇淋蛋筒反模式” 的测试中,因为该模式更加强调 UI 层面的自动化。 Abstracta 团队更喜欢将冰淇淋蛋筒倒过来的模式——由 Mike Cohn 推广流行的方法,即敏捷测试自动化金字塔。它可以给自动化成本带来最大收益,提高自动化的投资回报率,保证你将从自动化中获得最大收益。

当我们的大部分工作都集中在 UI 级别的自动化上时,重点是发现错误;而对于敏捷金字塔,其重点为避免错误。

在下图中,你可以看到两种方法的不同之处。

基础层:单元测试

显然,在金字塔中(作为敏捷团队最佳测试实践的一部分),大部分测试应该在开发阶段进行,在每次构建后进行单元测试。这些测试是最容易、最低成本及最快完成的,并且是测试驱动开发的一个重要方面。在较低的级别运行更多的测试可以让我们在运行过程中即可检查相应的工作,立即获得反馈,并让团队在错误难以隐藏的时候准确地知道错误出现在哪里。在这里,这些错误的寿命也会更短,可能在不到一分钟的时间内就被发生、被清除了。而在 UI 测试过程中,错误会存活更长时间,并产生更激烈的矛盾,因为它们已经舒适地存在了相对更长的时间。

中间层:API/集成/组件测试

运行所有单元测试并通过之后,就可以进入 API/集成/组件测试阶段。运行集成测试是为了确保所有组件正常配合工作。这里无需通过 UI 即可测试大部分逻辑和业务流程,在此处最好尽可能地采用自动化。如果纠结于在此处自动化还是 UI 级别自动化,选择这里问题将变少、维护会更容易、测试执行会更快(意味着能更快发现错误,缩短它们的寿命),而且可以测试系统的逻辑。这些测试比单元测试更慢、更复杂,但它们仍然比 UI 测试更快、且不那么脆弱。

顶层:UI 测试

最后讲的,也是运行最少的是 UI 测试。最好尽可能少地进行 UI 测试,因为它们成本高、难准备、难维护,并且需要很长时间。在这一步,只是要确保用户界面本身正常工作,系统的所有其他方面都已经过测试。只测试端到端最重要的部分,流程从用户登录开始,以如交易成功消息这样的最终操作结束。关注与浏览器或 UI 相关的事情也很有帮助。运行 UI 测试后,可以进行手动和探索性测试(如金字塔上方的球体形状所示)。

如上所述,与把重点放在自动化 GUI 测试上,并且无意中遵循 “冰淇淋蛋筒反模式” 比起来,金字塔方法是实现测试自动化的更强大、更有益和更具成本效益的方法。金字塔在单元测试阶段提供了一个强大的基础,可以在集成和 UI 阶段进行进一步的测试,而冰淇淋蛋筒方法更头重脚轻且稳定性较差。

为了在敏捷开发世界中脱颖而出,就须遵循自动化金字塔测试,以尽可能生产出质量最好的软件。但不需要只遵循一家之言,可多方参考资料并不断实践以获得最适合团队的测试方法。

共收到 5 条回复 时间 点赞

我一直有几个问题
1、都说敏捷中的自动化加快了测试速度,实际上,只是把写自动化用例的时间往迁移了,测试所需要的花的时间没有真正减少,甚至可能由于测试人员的代码能力不够,导致花的时间更长。。如果从单迭代看,同等代码能力的测试做自动化花的时间比手工测试需要的时间更长,以前可能只需要 3 天手工测试,现在要花 4 天写自动化,然后 3 天做手工,反而多增加了 4 天的人力成本,所以自动化真的加快了测试速度么?
2、如果说自动化是加快了回归的速度,那么每个迭代都需要回归么 (我个人觉得无脑回归不是正解)?良好的开发设计是不是可以规避掉一个改动影响一大片功能的这种情况 (就是说测试需要深入了解评估研发的设计)?如果有了精准测试,是不是就不需要再付出大量的时间去做自动化了?

Ikaros灬 回复

UI 自动化编写看的是长久收益,在不频繁变动时,收益会更大

既然都不变,那何必要测?既然改的不多,手工测完不是更快?

Ikaros灬 回复

关于你说的无脑回归,我想试着解释下。看下面的公式:

自动化维护脚本的时间成本/自动化运行次数=单次运行分摊的维护成本

自动化用例写好,单纯执行时是没有成本的对不对?
那么每当有项目中的任意资源变动一次(配置,代码,美术资源等等所有资源),执行一次自动化,是不是就可以减小单次运行分摊的维护成本。
只要项目内容有变动,就至少运行一次在我看来是合理的。

Ikaros灬 回复

关于测试整体时间:

  1. 当前对测试人员的要求是越来越高的,写自动化测试并不需要那么久。
  2. 部分 case 自动化覆盖了,就不需要手工测试再覆盖了。 所以测试时间并不一定比纯手工测试多,而且由于有一部分工作转成了自动化,也减少了人犯错的可能。 同时也可复用,后续迭代这部分测试回归工作就不需要人工来做,而是交给自动化。

针对第二点。如果你的自动化用例足够健壮,完全可以做到每次迭代都执行。不管研发设计是不是良好(减少外部依赖),都能保障系统所有功能正确

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册