在我们测试工作中,常常遇到这样的问题:开发与测试团队分属不同的不同(部门隔离、沟通不畅),质量职责划分不清(出现bug往往都是测试人员背锅),需求的不确定和易变性(需求不断变化导致代码不停更新、产品重构等),项目时间紧(互联网项目的需求对上线时间有更严格的要求)...测试团队必须纠结这样一个问题:如果在质量保证与上线时间之间找平衡,我们一方面需要尽可能的希望找出产品的“所有”bug,一方面又要保证需求能如期上线,对于一个测试团队来说,直观上只有两种方法来解决这个问题:扩充我们的测试队伍(人多力量大嘛),然而,一味的扩大队伍就意味着项目成本的增加,所有我们只能追求通过各种自动化测试方法来提高测试效率。
  自动化测试,大家的第一反应是这样:写好一个脚本,然后每次运行脚本就把人工测试要做的所有事情全做了...这只是我们的一个理想,理想是美好的,现实却很骨感。自动化测试不是万能的,这里面还存在很多问题,其中最重要的一个问题就是:对于大多数团队的测试人员来说,往往只有黑盒测试环节在咱们的全面掌控下,在这样的前提下,大多数自动化测试工程师们都在对UI层面的测试做自动化,而UI是易变的,我们想通过在这里做自动化实现“全面”的覆盖是不可能的,看下下面这篇博文,也许能为你的自动化测试平台设计提供一些灵感:

TestPyramid

马丁福勒

2012年5月1日

 

测试金字塔是一种思考不同类型自动化测试的方式,应该用来创建一个平衡的投资组合。它的基本点是你应该有更多的低级UnitTests比通过GUI运行的高级 BroadStackTests

 

对于我职业生涯的大部分时间来说,测试自动化意味着通过用户界面驱动应用程序的测试。这些工具通常会提供记录与应用程序交互的功能,然后允许您回放该交互,检查应用程序是否返回相同的结果。这种方法最初效果很好。记录测试很容易,测试可以由不懂编程的人记录。

但这种方法很快就会遇到麻烦,成为一个 冰淇淋锥。像这样通过用户界面进行测试很慢,增加了构建时间。通常它需要为测试自动化软件安装许可证,这意味着它只能在特定的机器上完成。通常情况下,这些操作不容易在“无头”模式下运行,由脚本监控以放入适当的部署管道。

最重要的是这种测试非常脆弱。对系统的改进很容易导致大量这样的测试结束,然后必须重新记录。您可以通过放弃记录回放工具来减少这个问题,但这会使测试更难写。 [1]即使在编写它们的良好实践中,端到端测试也更容易出现非确定性问题,这可能会削弱对它们的信任。简而言之,通过用户界面进行端到端测试的操作是:易碎,写入成本高,运行耗时。所以金字塔认为你应该通过单元测试进行更多的自动化测试,而不是通过传统的基于GUI的测试。[2]

金字塔还提出了一个中间测试层,它通过应用程序的服务层来执行,我称之为 SubcutaneousTests。这些可以提供端到端测试的许多优点,但避免了处理UI框架的复杂性。在Web应用程序中,这将对应于通过API层进行测试,而金字塔的顶部UI部分将对应于使用像Selenium或Sahi 这样的测试。

测试金字塔在敏捷测试圈中出现了很多,尽管其核心信息是健全的,但关于构建一个平衡良好的测试组合还有很多话要说。一个常见的问题是团队混淆了端到端测试,UI测试和面向客户的测试的概念。这些都是正交特性。例如,一个丰富的JavaScript UI应该使用像Jasmine这样的JavaScript单元测试来测试其大部分UI行为。一套复杂的业务规则可能会以面向客户的形式捕获测试,但是可以像单元测试一样在相关模块上运行。

我一直认为高级测试是第二道防线测试。如果您在高级测试中失败,不仅仅是您的功能代码中存在错误,还会丢失或错误的单元测试。因此,我建议在修复由高级测试暴露的错误之前,您应该使用单元测试复制该错误。然后单元测试可以确保错误不会消失。

笔记

1: 记录回放工具对于任何类型的自动化来说几乎总是一个坏主意,因为它们抵制可变性并阻碍有用的抽象。它们只有作为一种工具才能生成脚本片段,然后您可以使用Twist 或Emacs的方式将其编辑为适当的编程语言。

2: 金字塔是基于这样的假设:与更集中的测试(如单元测试)相比,宽泛测试的代价昂贵,缓慢且脆弱。虽然这通常是正确的,但也有例外。如果我的高水平测试是快速,可靠和便宜的修改 - 那么不需要低级测试。

我们可以根据这个测试金字塔,把自动化测试也分层来做,这样就能更好的保证我们的测试质量和效率啦。

Martin Fowler 分层测试概念博文分享的更多相关文章

  1. python selenium自动化测试之路(1)--分层测试概念、selenium工具介绍

    1.分层自动化测试概念 传统的自动化市场更关注产品UI层的自动化测试,而分层的自动化测试倡导产品开发的不同阶段都需要自动化测试 大多公司与研发团队其实是忽略了单元测试与集成测试阶段的自动化测试工作,所 ...

  2. 转:google测试分享-分层测试

    原文: http://blog.sina.com.cn/s/blog_6cf812be0102vctg.html 上一次分享了google测试分享-SET和TE,有一些自动化测试的细节没有说清楚,那这 ...

  3. 微服务(Microservices)—Martin Fowler【翻译】

    本文转载自:http://www.cnblogs.com/liuning8023/p/4493156.html -------------------------------------------- ...

  4. (转载)持续集成(第二版)[来自:Martin Fowler]

    转载自:iTech的博客 持续集成(第二版) 作者:Martin Fowler 译者:雷镇 持续集成 是一种软件开发实践.在持续集成中,团队成员频繁集成他们的工作成果,一般每人每天至少集成一次,也可以 ...

  5. MARTIN FOWLER谈敏捷开发

    转自:http://www.scrumcn.com/agile/scrum-knowledge-library/agile-development.html#tab-id-9 每个人都在谈论敏捷开发( ...

  6. robotframwork接口测试(五)—接口分层测试粗解

    个人小结,仅供参考. 接口测试很简单,但是很重要. 可以写代码,也可以用工具进行测试.工具说说就很多了,简单介绍一下我目前用过的几个能够测试接口的工具, Burpsuite:这类偏请求攻击类软件 Fi ...

  7. Martin Fowler关于IOC和DI的文章(中文版)

    IoC容器和Dependency Injection模式 Martin Fowler 编者语:最近研究IoC,在网上搜索到很多网页推荐阅读Martin Fowler的一片名叫Inversion of  ...

  8. 什么是微服务 Martin Fowler的microservices

    https://martinfowler.com/articles/microservices.html https://martinfowler.com/microservices/ 微服务,最早由 ...

  9. 敏捷史话(八):敏捷的破局之道——Martin Fowler

    在 Martin Fowler 的世界里,任何事情都有最优解. 1963年,Martin 出生于英格兰的沃尔索尔(Walsall),也在同样位于沃尔索尔的玛丽女王文法学校中接受中等教育.在这里的乡村中 ...

随机推荐

  1. String类为什么设计成不可变的

    在Java中将String设计成不可变的是综合考虑到各种因素的结果,需要综合考虑内存.同步.数据结构以安全方面的考虑. String被设计成不可变的主要目的是为了安全和高效. 1)字符串常量池的需要 ...

  2. How to make a USB stick use ISO image file in debian

    4.3.1. Preparing a USB stick using a hybrid CD or DVD image Debian CD and DVD images can now be writ ...

  3. 2017/2/12:springMVC的简单文件上传跟拦截器

    1.写文件上传的界面jsp代码如下重点为文件上传标签的类型 2.写登录成功跟失败的界面:成功自己写 3.写springMVC的文件上传的controller的方法 4.最后一步配置spring-ser ...

  4. create a plugin for PowerShell ISE

    可参考:Creating Add-ons, Plugins, and Tools for the PowerShell ISE http://www.leeholmes.com/blog/2013/0 ...

  5. 微信小程序开发工具常用快捷键

    格式调整 Ctrl+S:保存文件 Ctrl+[, Ctrl+]:代码行缩进 Ctrl+Shift+[, Ctrl+Shift+]:折叠打开代码块 Ctrl+C Ctrl+V:复制粘贴,如果没有选中任何 ...

  6. 20155312张竞予 20170510实践一:在IDEA中以TDD的方式对String类和Arrays类进行学习

    实践题目 在IDEA中以TDD的方式对String类和Arrays类进行学习 测试相关方法的正常,错误和边界情况 String类 charAt split Arrays类 sort binarySea ...

  7. css的基础用法之标签选择

    一.css的4种引入方式 #.内联式 <p style="color: red;font-size: 50px;text-align: center">Egon是一个非 ...

  8. kbmmw 中XML 操作入门

    delphi 很早以前就自带了xml 的操作,最新版里面有三种XML 解释器,一种是MSXML,看名字就知道 这个是微软自带的,这个据delphi 官方称是速度是最快的,但是只能在windows 上使 ...

  9. flask框架基础

    一 web的一些框架介绍 Flask:短小精悍,内部没有包含多少组件,但是第三方的组件是非常丰富的. Django:django是一个重武器,内部包含了非常多的组件:orm,form,modelFor ...

  10. Codeforces Round #543 (Div. 2) D 双指针 + 模拟

    https://codeforces.com/contest/1121/problem/D 题意 给你一个m(<=5e5)个数的序列,选择删除某些数,使得剩下的数按每组k个数以此分成n组(n*k ...