不知道是不是原文,转载下来,除了本文,参考文献可以拿来细读。
  中国金融期货交易所 陈冬严 http://www.sohu.com/a/123565341_470023


摘要

  本文介绍自动化金字塔以及两种自动化测试的反模式(蛋筒冰激凌、纸杯蛋糕)中存在的问题与产生的原因,并借助经济学分析,简要介绍了一种适合独立测试团队自动化实施的改良模式-橄榄模式。

一、自动化金字塔

自动化金字塔最早是在2009年由Mike Cohn提出的。最早提出来的时候是一个三层的金字塔,从上到下分别是UI/Service/Unit测试。后来Lisa Cripin 在她著名的《agile testing》 [1]这本书中,又给这个金字塔加了一个手工测试的帽子。随着敏捷测试的不断推进,帽子部分又转变成了探索式测试,如图1所示。当然service层可以也理解为 API测试,或者集成测试等等。这种下宽上窄的三角形结构,代表着各层自动化的投入分配应该是底层的单元测试最多,接口测试居中,UI层最少。

图1自动化金字塔(敏捷测试)

自动化金字塔提出之后,几乎为奉为圭旨,甚至还一度出现了配合敏捷转型,大规模裁撤独立测试部门,将人员打散并入各个Scrum团队的风潮。但在现实中,真正能长期通过TDD等实践大力发展单元测试,构建稳定的自动化金字塔的团队是少之又少。

另外,有些重要的决策信息并没有在金字塔模式中体现。如从每个用例的价值来说,手工或者UI层的用例价值最高,越往下越低。这里的价值,可以是用例带来的质量信心,也可以是每个用例所覆盖的代码行数等等。并且自上而下,用例也是逐步从面向业务过渡到面向技术。

二、蛋筒冰激凌模式(反模式)

Alister Scott 在2012年提出了蛋筒冰激凌(ice cream cone)这一反模式[2]。从图形上看,这其实是一个倒置的自动化测试金字塔。这个模式的特点就是,整个组织的自动化测试主要还是针对于用户界面,对于单元测试和集成测试用例的数量或者投资要少许多。更为可怕的是,这个冰激凌桶上面有一大坨手工用例。这个冰淇淋吃起来,估计远不如哈根达斯或者暴风雪那么好的口味了。

图2 自动化冰激凌

这一模式中庞大的手工用例数量,反映了工程团队对于自动化测试投资的不足。许多开始投资自动化测试的团队,为了能尽快产出效果,获得收益,就采取了一些短平快的措施,从最容易上手的用户界面开始。在传统的商用软件供应商或者某些新兴的SAAS服务提供商的系统中,往往用户界面中包含有非常多的业务逻辑,他们的测试团队过往主要依赖于通过手工测试来完成其业务的测试,评测产品的质量,因此其自动化测试的投资重点和目标,也往往是逐步提高现有手工测试用例的自动化替代率。这是一种非常典型的路径依赖,由此产生的结果就是,团队对于底层的自动化测试方面的关注相当不足。

三、纸杯蛋糕模式(反模式)

如果说蛋筒冰激凌模式还只是反应了自动化测试在测试类型和投资分配上的问题,那么来自ThoughtWorks的Fabio Pereira于2014年提出的纸杯蛋糕模式(Software Testing Cupcake)[3]这一反模式就反映出了许多更深层次的问题。

图3 自动化纸杯蛋糕

从图形上看,这个团队的自动化测试投资在各个类型间的分布更加的合理。集成测试或者接口的数量相比蛋筒冰激凌模式来说大了许多,单元测试的规模也有较大增长。在引入敏捷和全员质量的意识之后,工程团队也愈加重视测试和产品质量,于是测试用例可能来自于以下三个团队:

1.开发团队编写单元测试、集成测试和组件测试用例

2.自动化测试团队编写UI自动化测试用例

3.手工测试团队编写手工运行的测试用例,以系统集成测试/业务场景测试为主

根据提出者的介绍,纸杯蛋糕模式的形成原因,主要是因为开发和测试团队分属不同部门,两者中间有着厚厚的部门墙。从团队协作的角度上来讲,因为墙的存在,这些团队都各自为政,彼此间并不能很有效地协作。在测试的级别/类型/场景划分上,这三个团队是彼此没有协同的。这样就必然导致某些重复工作,有些用例被反复地进行自动化;而另一方面,质量拼图不完整也是不完整的,存在缝隙和漏洞,结果必然是1+1+1<3。

从流程上来讲,测试工作也依然是依次线性发生的,而不是同步的。首先,开发编写代码以及对应的测试用例;然后手工测试者设计并运行自己编写的用例;最后,自动化测试团队编写UI自动化测试用例并执行。这个场景可能某些读者非常熟悉,这就是许多声称已经敏捷化的团队的工作模式,在Scrum的流程中依旧使用传统的瀑布式开发模式。他们的Scrum模式,有同行给取了个名字,叫做Scrummerfall[4] 。

类似的模式还有ThoughtWorks公司的Anand Bagmar 在《Is Selenium Finely Aged Wine?》中提到的“双金字塔反模式”(Dual Test Pyramid Anti-Pattern)以及Graham Russell 提出的以伫立在英国纽卡斯尔南部的地标性雕塑“北方天使”(Angel of North)命名的“北方天使反模式”(Angel of North Anti-Pattern)等,这里就不一一赘述了。它们都不约而同地关注于协作与沟通、利益与壁垒等有关人员与组织层面的问题,而不仅仅集中在如何进行自动化测试自身。

当然,很多时候拘泥于部门间职责的切分,有些很好的建议,在现实中比较难以展开。如使用垂直分布的自动化测试度量目标,实现针对某个story或者某个发布在所有级别(UI, Unit)上与所有团队(开发、测试)进行共享。因为度量目标是分享的,更容易达到双赢和互相补位的结果。而现实中,有些Scrum团队的工作DOD(Definition of Done,完成的定义)并不包含测试团队或者测试人员的交付物。当在看板里把一个story置为“Done”的时候,那么很可能只是"Dev Done"(开发完成),然后交付给测试去实现“Test Done”(测试完成)。另外,出于专注于本职工作,做精做细功能和非功能测试的考虑,一般独立的测试团队也很少去参与开发团队的测试,更不要说共同探讨如何分享测试资源、度量目标了。

四、橄榄模式(不倒翁模式)

众所周知,软件测试的边际成本会随着缺陷探测率的提高而提高,这就是软件测试的基本公理之一"测试的不可穷尽性"的经济学体现。这一规律也适用于自动化测试,也就是说随着自动化覆盖率的提升,自动化的成本也呈现指数式上升。按照这个思路进行拓展,可以分析下单元测试,集成测试和UI测试的自动化成本曲线如图4所示。与通常理解的一致,为了达到相同的自动化率(x0),UI的成本最高、其次是API,Unit则最低。

经济学中有另外一个著名的理论叫做边际效益递减。当做一项投资,随着投资量的增加,单位投资增量所带来的单位收益是越来越少的,甚至在某个临界点之后,这个收益有可能是负数。而这个零界点,就是投资收益最大的点。在这个点之前的所有投资,都可以扩大总收益,而在超过之后继续进行投资,就不那么明智了。

图4 自动化成本/收益曲线

按照这个思路,在图4上,针对三种不同类型的自动化测试,可以获得三个零界点。而总收益最大的点在集成测试上,随后是单元测试,UI测试则最低。

如果从测试效果上看,接口测试和UI/单元测试相比,有很多优势。 对于单元测试来说,通常单元测试是针对代码进行的测试,而接口测试是在测试一个活的,经过部署的系统。 另外,单个接口测试与单个单元测试用例相比,也可以覆盖更多的代码。更重要的是,接口测试也可以是面向业务的测试,通过接口进行业务层面的测试。

而相比UI自动化用例,接口测试更加的简单直接,执行效率更高。 除了部分如企业级应用软件,可能很多业务在前端进行之外,很多情况下,绝大部分通过UI完成的业务操作完全可以通过API端完成。某些情况下,API的测试条件覆盖率甚至可以多过UI。

综合上述的分析,笔者认为在在自动化测试的初级阶段,适合奔小康的测试团队的自动化模式应该是中间层的接口最大,两端的UI和Unit测试适度实施。从图形上看,就是一个橄榄型。如果再加上一部分的手工测试,那就是一个不倒翁了,如图5所示。

图5 橄榄模式(不倒翁模式)

按照这个模式,将大部分自动化投资用于接口测试,可以获得最高的投资回报。再结合持续测试与持续集成等最佳实践,在团队之间彼此共享测试用例、测试框架或者平台,通过接口测试这一承上启下的测试类型,可以自下而上地逐步翻越过纸杯蛋糕模式中的那堵墙。

参考文献

  [1].敏捷软件测试:测试人员与敏捷团队的实践指南[美]克里斯平(Lisa Crispin) 等 著;崔康 译 清华大学出版社

  [2].蛋筒冰激凌模式 http://watirmelon.com/2012/01/31/introducing-the-software-testing-ice-cream-cone/

  [3].Software Testing Cupcake https://www.thoughtworks.com/insights/blog/introducing-software-testing-cupcake-anti-pattern

  [4].scrummerfall http://clearmindsoftware.com/post/scrummerfall-waterscrum-waterscrumfall

转载:自动化测试金字塔与反模式相关推荐

  1. 自动化测试金字塔与反模式

    本文介绍自动化金字塔以及两种自动化测试的反模式(蛋筒冰激凌.纸杯蛋糕)中存在的问题与产生的原因,并借助经济学分析,简要介绍了一种适合独立测试团队自动化实施的改良模式-橄榄模式. 一.自动化金字塔 自动 ...

  2. Ajax 和 XML: 五种 Ajax 反模式(转载)

    通过理解错误的编码方式,可以更好地了解如何正确地进行编码.当然,编写 Asynchronous JavaScript™ + XML(Ajax)有正确的方法,也有错误的方法.本文将讨论一些需要避免的常见 ...

  3. 反模式? 只有模式不彻底吧

    我认为,没有反模式,只有模式不彻底. " 某人说:"软件都不是一个人能写出来的,我们需要去整体控制." 他快要走了,那个影响我太多的人. " 1. Cremat ...

  4. SQL反模式笔记17——用一条sql解决复杂问题

    目标:检查sql查询次数 反模式:试图用一条sql解决复杂问题 结果是:性能很低,而且往往得到了一个笛卡尔积. 解决方案:分而治之 用多个sql得到数据,再进行整合.或者union多个sql的结果. ...

  5. 查询反模式 - 隐式的列

    一.减少输入 程序员都喜欢使用通配符,如: SELECT * FROM Person 又或者省略字段名: INSERT INTO Person VALUES('10','张飞'...) 二.捷径会让你 ...

  6. SQL反模式笔记7——多列属性

    目标:存储多值属性 反模式:创建多个列.比如产品主图,开始需求是,每个产品都是3张图,但随着时间的推移,可能就不止3张了. 1.查询:多个列的话,查询时可能不得不用IN,或者多个OR 2.添加.删除. ...

  7. SOA系列文章(二):服务设计原理:服务模式和反模式

    服务设计系列的法则已经发展到最佳通信实践和取样相关编码的程度.本文提供了设计和实现网络服务的基本原理,并且对面向服务的体系结构(SOA)的相关概念做了一个简要的回顾,以及有关于几种模式和反模式的详细讨 ...

  8. 从安全到镜像流水线,Docker 最佳实践与反模式一览

    作者 | Timothy Mugayi 译者 | 弯月,责编 | 夕颜 封图 | CSDN付费下载自视觉中国 出品 | CSDN(ID:CSDNnews) 在使用Docker的大部分时间里,我们并不关 ...

  9. 小鸟云:浅谈5 种典型的云原生架构反模式

    云服务器,就上小鸟云. 反模式是随着项目的推进演变而来的,主要的原因,如重大需求调整,但架构没有对应的变化,性能和安全需求对当前架构的硬性改变,团队或组织强行调整技术等.本文将为大家讲解云原生架构中常 ...

最新文章

  1. 看来Kubernetes将一统天下?Docker也无法幸免
  2. PHP几个防SQL注入攻击自带函数区别
  3. Day11多态部分-6 【1.3 对象的向上转型和向下转型】
  4. 【转】01.Dicom 学习笔记-DICOM C-Store 消息服务
  5. mysql数据库表的导入导出
  6. shell 做加法运算_使用shell脚本实现加法乘法运算
  7. 【 全干货 】5 分钟带你看懂 Docker ! 1
  8. Unity2020.1新功能探路:编辑器相关更新
  9. dataframe groupby_python pandas获取groupby之后的数据
  10. Android 7.0(API 24)以上调用系统安装包问题
  11. 触摸屏驱动学习并移植
  12. python京东抢购 github_GitHub - DevGuan/jd-autobuy: Python爬虫,京东自动登录,在线抢购商品...
  13. c语言四个人中有一个人是小偷,、甲,乙,丙,丁四个人中有一个人是小偷,请根据四个人的谈话判断谁是小偷?已知四个人中有一个人说假话...
  14. 004.python基础知识之基本数据类型及基本运算符
  15. 再肝一个R包!一行代码绘制精美火山图!
  16. 微信小程序实现点赞与取消点赞功能
  17. 《Spring响应式微服务》读书笔记
  18. JAVA微信商城 有后台
  19. 用python的statamodels模块拟合VAR模型
  20. 微信小程序【DEMO】:会议室预定小程序

热门文章

  1. 电视台以IPTV系统为载体扩展融媒体解决方案
  2. HEVC代码学习19:MV、MVD、MVP概念解析
  3. 公历转农历matlab,公历转农历
  4. 树的遍历(python)
  5. Google电面狂出难题,春招比秋招难多了……
  6. MySql使用MyCat分库分表(三)配置详解
  7. 淘宝、天猫获得商品类目API调用
  8. Go换国内源解决go get -u 问题
  9. 未来已来:探寻2019智博会上的前沿科技
  10. Scratch图形化编程等级考试简介