You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

162 lines
15 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 01ROI价值内核自动化测试的价值可以量化么
你好,我是柳胜。
作为测试人员,我们都想做好自动化测试,但是每个行业都有自己的规律,也就是说常说的道,自动化测试也有自己的道。所以,在这个模块,我们的目标是了解自动化测试的道是什么,怎么能运用它让自己的测试工作更加有成效。
今天是价值篇的第一讲,我们先来弄清楚自动化测试的价值究竟是什么?看到这你可能有点困惑,自动化测试有那么多公司都在搞,自然是有价值的啊,有啥可讨论的呢?
其实这个问题非常关键,在开始工作之前,要把我们的工作价值想清楚,后续工作才能事半功倍。我列几个工作中我们频繁听到的问题,你会更有感触。
* 上级沟通“产品要上线了QA人手紧能不能搞一下测试自动化减少点人手
* 调动人手“什么你还要再增加2个自动化测试开发工程师来完成这个项目他们都要做什么
* (工作述职)“听说你开发了个什么自动化脚本,它给公司带来了什么价值?用量化的数据给我讲一讲!”
这样的问句是不是似曾相识?其实它们都指向了一个硬核问题“自动化测试项目的价值是什么?”
在这节课,我要和你捋一下,为什么要做自动化测试,并且带你找到度量它价值的方法。掌握了这些,就能对自己的工作目标更清楚、更有信心,别人问到的时候,我们也能讲清楚、说明白,得到了团队理解工作将事半功倍。
## 为什么要搞自动化测试
开篇词中我提了出海捕鱼的场景,不只自动化测试,整个测试工作就像织网一样,会有弹性的空间,网眼大了、小了,捕到多少鱼,这些都有不确定性,但是这个不确定性又关系到成本和收益这些敏感问题,这是测试工作的一个特点。
我曾经跟我的团队说过 “咱们做测试工作,甭管用什么方法和技术,目标就是用最小的成本,得出对软件质量最大的确定性结论”。
自动化测试也面临相同的困难,为了解决这样的不确定,我们有必要好好分析一下,自动化的成本和收益究竟怎么算?
如果感觉这样问还有些抽象,我们不妨换个问法,自动化测试实施之前和之后,自动化带来的改变是什么?为了进一步完善思路,我们结合一个更具体的例子来做推理、估算。
这个例子是一个Web UI 订火车票的软件,成功订一张火车票这个测试案例,要做自动化所花费的成本、还有得到的收益,会是多少呢?
自动化实施之前测试案例的执行要靠手工完成一个工程师需要花费0.5个小时,运行完登录、订车票,查看数据库这样一个测试流程。
而自动化测试实施之后流程可以用Selenium脚本自动完成原先手工测试半个小时的工作量就省下来了。那么省下来的这半个小时这就是自动化测试带来的价值。对不对
但还不全面我们衡量效益不应该只看回报还要看成本我们要算上开发自动化测试花费的成本。为了开发Selenium订火车票的这个脚本自动化测试工程师花费了1天的时间合计就是8个小时。
现在这个Selenium自动化测试案例它的投资收益比ROI应该这么计算产出和投入都用时间作为单位
产出/投入 = 0.5/8= 0.0625
结果不到7%。哇投入了8个小时才收获了0.5个小时。如果这是一项投资的话,那肯定是亏本的。哪个公司愿意做这样的买卖呢?
但是上面的公式只计算了运行一次自动化测试案例的ROI。实际上自动化测试案例开发出来后肯定不止运行一次的。多运行一次就会多节省下来一份工作量如果用n来指代运行次数t指代单次测试时间现在的产出变成了n\*tn越大产出就会越大。
那上面订火车票案例运行多少次才能收回成本呢1/0.0625=16只要这个selenium脚本运行超过16次我们就可以让ROI=1收支平衡收回成本了。
![图片](https://static001.geekbang.org/resource/image/7f/82/7fa80bffaae0f230411b67310e9ca582.jpg?wh=1900x801 "运行次数&ROI关系示意图")
太棒了现在你就可以对公司说“我的自动化测试收益是可以量化的只要我保证开发出来的脚本能运行超过16次就是为公司省钱了。”
且慢,还有一笔账没有算,除了开发成本,还有维护成本。自动化测试开发出来后,还需要维护版本升级、诊断错误、优化结构等等的工作,这笔成本是需要持续投入的。
现在这个Selenium在它线上运营生命周期内的ROI计算公式变成了后面这样
产出/投入 = 0.5\*N/(8+维护成本)
我们把它提炼成一个计算公式,就是:
![图片](https://static001.geekbang.org/resource/image/cd/00/cd34280bc70b3633e696a7ba16f9e300.jpg?wh=1920x868 "ROI计算公式")
这个公式很简单,但仔细揣摩可以推导出几个有意思的结论。
**1.ROI大于1就是赚了小于1就是亏了。**那么给定一个测试案例要不要对它做自动化判断的依据是自动化测试预期ROI至少要大于1。
**2.自动化测试是一个长收益模式。**在理想情况下,是一次性投入(投入为开发成本),之后每运行一次,就会增加一份产出。所以,时间越长,次数越多,收到的回报就会越大。
3.关于开发成本包括开发成本d和维护成本m类似估算软件开发工作量代码行法、功能点法我们也可以引入到估算开发工作量里比较好掌握。**但维护成本就有点模糊了,这里包含了多种可变因素,是自动化测试项目风险的主要来源。**
维护成本来自于多个地方。一段代码从产生以后,就会持续产生维护工作量,而且,因为存在架构腐化等问题,维护工作量增加速度是以非线性来增长的。
到了最后一个陈旧的老破系统加入一个新功能需要写10行代码只要花5分钟。但是搞清楚这10行代码应该加到哪个文件里要花费3天时间。在这种时候这个软件系统就已经不可维护了它要寿终正寝了。自动化测试代码的维护成本更复杂不仅面临着腐化的问题还有被测产品更新带来的维护等等。
所以在实践中你看不到前面图里那样简单漂亮的ROI直线它会表现为一段曲线自动化的ROI增长速度要比运行次数增长慢一些直到最后每运行一次花费的维护工作量比节省的工作量还多自动化就该退休了也就是下线重构完了再上线。
![图片](https://static001.geekbang.org/resource/image/73/4d/73e3da46cce6542dceda6ddee0a5e54d.jpg?wh=1900x801 "运行次数&ROI关系示意图2.0版")
这里我想提醒你注意,**ROI模型提供的是一种自动化测试投资收益比的量化思路方便我们明确哪些因素影响着自动化测试效益。**不可能存在一个万能的公式把参数往里一带就会算出ROI的数字如果世间的事都这么简单还需人类干什么。我们需要做的是尽可能量化你对量化的了解越多对自动化测试的理解就会更加深入全面。
## 做不做自动化测试,能用数据说话么?
从ROI的公式来看自动化测试的收益取决于t和nt指的是节省下来的手工工作量还是比较容易理解的。在字面上n是一份自动化测试案例重复运行的次数那么在实践中n是什么呢
聪明的你可能已经猜到了n是测试案例的稳定回归次数。软件的新功能开发出来后第1次测试之后第2次第3次到第n次都是对第1次的回归。它们都是重复的工作应该被自动化替代。
你看从ROI公式我们很容易推导出业界熟知的经验**“自动化测试是用来做回归测试的”**。自动化是开发出来不会只运行一次除非它的t特别大实现了手工测试做不到的事情比如单元测试、性能测试。
我们再回到回归测试n作为回归测试次数对自动化测试工作有什么启发呢它的作用很大因为它能帮助我们量化地去回答一个 “做不做自动化测试” 的关键问题
一个测试案例A做不做自动化测试首先要看看它的n能有多大。
假设软件发布周期持续一年每两周迭代一次每次迭代都需要一次测试那么在这一年里需要回归测试次数至少是365/14=26次。如果还考虑一些紧急feature、patch的发布那实际的回归次数要大于26次。这样我们就能得到一个n的估算值比如说30次。
得到估算值后你的决策不再依赖直觉而是有了可量化的思考逻辑。30次能不能收回来成本那这个测试案例A就可以搞自动化。不能你就面临亏本风险自动化一顿操作猛如虎测试工作还是苦这是项目组里的每一个人都会感受到的。
刚才说的是基于软件发布周期不变的情况下如何估算回归次数n。在实际工作中自动化测试一旦做起来带来的变化是测试执行时间变快软件发布周期缩短又反过来增加回归次数n自动化测试的收益也在增加。
**这里我们又得到一个结论软件发布周期变短是自动化测试ROI提升的产物。**
总结来说只要我们把注意力关注放在ROI上后面的好处都会相继而来测试质量提高了发布周期缩短了团队也更加有信心了。
## 实践中,冒烟测试是你自动化的开始
紧接着咱们再考虑下一个问题测试案例A需要30次回归是不是在刚引入新功能A的第1次迭代就开始运行自动化我的答案是要根据情况来判断。
上面说到n是测试案例的稳定回归次数注意**稳定**这两个字它代表功能A已经稳固下来不再变了。更精确地说功能A即使有变化但是变化规律已经可以被自动化测试吸纳。这种情况下自动化测试运行才能发挥效益。
这里你可以看看后面这张图,画的是加特纳的技术成熟曲线,它也可以用来描述软件功能的发展过程。
![图片](https://static001.geekbang.org/resource/image/2f/e6/2fcb06174dca22b246630c5b5a5379e6.jpg?wh=1920x921 "加特纳技术成熟度曲线")
通过加特纳成熟度曲线可以看出,新功能在产生初期,一般是不稳定的,和它的预期有一个差距。经过几轮调整后,才会进入到一个平缓的阶段,这也是稳定回归测试的阶段。而不同类型的软件,它的功能成熟时间长短,变化剧烈程度可能是非常不一样。
有的软件是做标准化产品的比如专业性强的B端财务软件计税模块发布出来就很稳定我们采取的策略是在第1个版本做计税模块的自动化。
有的互联网软件第1版是投放试验性的我看过国外一个招聘网站经过产品设计AB测试多轮后打磨了x版才稳定下来简历模块那么这时的策略是在x版本进行简历模块自动化。
还有的生命周期比较短的软件项目虽然有迭代但功能一直无法稳定那可能需要考虑完全手工测试根本不需要自动化测试。其实这些都可以通过ROI模型讲得通。
到这里咱们总结一下我们通过ROI得出的三个核心观点
1.自动化测试是用来做回归测试的。
2.自动化测试从哪里开始实施顺序从ROI高到低也就是给定一个软件系统优先做回归次数最高的那部分功能先做自动化回归次数最高的案例再做低的直到ROI等于1的案例。在功能模块的初期可以考虑先做手工测试。
3.自动化测试什么时候开始?功能模块稳定的时候。
实际上,有一个很好的测试实践可以匹配上面的要求,那就是冒烟测试。冒烟测试是测试用例的子集,用来验证系统中基础的、影响发布软件的功能。甄选冒烟测试的一个常用办法就是二八原则。
二八原则又叫帕累托原则在因果关系中仅有20%的因素会影响80%的结果。它在各个领域都有体现比如在市场营销领域80%的利润是由20%的用户创造的在经济学里80%的财富掌握在20%的人的手里。
在软件领域80%用户常用的是系统中20%的功能。冒烟测试覆盖的这部分20%功能,是常用的,一般也是核心的,最先被开发出来的。所以,它同时满足稳定和回归次数高两个特点。
进而我们就可以得到推论:**在实践中可以设定目标冒烟测试100%自动化。**这时,自动化测试就可以和手工测试配合,形成一个新版本发布+冒烟测试的简单流水线。
如图所示先从代码管理工具比如CVS、Gitlab中的开发分支中拉取代码build构建做一轮冒烟测试。如果冒烟测试通过开发分支可以merge到发布分支如果冒烟测试失败那开发人员必须修改代码直到冒烟测试通过。
这个流水线Pipeline充分利用了自动化无人参与执行速度快的特点可以帮助开发人员在第一时间验证代码的正确。由于是每次分支归并都会调用冒烟测试所以n的次数高自动化测试的ROI也会高。
![图片](https://static001.geekbang.org/resource/image/fe/62/fe138ec5e6513c05e111f72328414962.jpg?wh=1920x726 "新版本发布+冒烟测试流程图解")
## 小结
今天这一讲我们通过一个投资产出视角来观察自动化测试它的成本是什么它的产出是什么还学习了ROI的计算公式。
我们通过ROI的收益规律不仅可以推导出自动化测试业界的已有共识比如“自动化是用来做回归测试”“冒烟测试优先做自动化”……而且我们还能挖掘出一些新的合理观点比如“ROI从高到低来做自动化测试”。
这说明业界的实践已经有意或无意地践行ROI规律因此可以说**ROI是一个自动化测试项目的隐式命脉**。
同时我们又详细介绍了ROI公式的因子n测试案例的回归次数。在实践中找到n来估算ROI能帮你判断一个案例该不该做自动化。
ROI公式里除了n还有其它因子。在后面的课程中我们再一一介绍其它因子像m维护成本现在这个概念看起来还有点模糊我还会帮你把它分解直到可操作和可度量的粒度让ROI的方法论更有效地指导你的工作。
## 思考题
学习ROI之后你可以从开篇的三个问题里选择一个或多个试着回答一下。
* “产品要上线了QA人手紧能不能搞一下测试自动化减少点人手?”
* “什么你还要再增加2个自动化测试开发工程师来完成这个项目怎么算出来的
* “听说你开发了个什么自动化脚本,它给公司带来了什么价值?用量化的数据给我讲一讲。”
欢迎你在留言区记录你的收获和思考。如果这一讲对你有启发,也可以推荐给身边更多同事、朋友,跟他一起学习进步。