我最近在整理质量标准,质量标准是个什么东西呢?
质量标准是产品生产、检验和评定质量的技术依据。产品质量特性一般以定量表示,例如强度、硬度、化学成分等;所谓标准,指的是衡量某一事物或某项工作应该达到的水平、尺度和必须遵守的规定。而规定产品质量特性应达到的技术要求,称为 “产品质量标准”。--(百度百科)
大白话就是,我们把在研发过程中所有和质量相关的可以度量的数据拿出来,整理一个基线,形成质量标准。我们拿这个标准来规范整个研发流程,包括开发活动和测试活动。我们试图推广质量标准的时候,遇到了一些阻力,其中有一项就是关于代码覆盖率(行覆盖率和变更覆盖率)的质疑。
这 70% 的覆盖率,这是你拍脑袋的吗?
有点尴尬,我回答不出,仔细捋了下,没有发现这个数据背后的逻辑支撑。问了团队的小伙伴也不知道出处。按常理,我们能得出一个标准的时候,必然是经过了各种实践和演进,覆盖率从 0 到 70 的过程中,一定是有什么变化,才会推动覆盖率的上升。那是怎样的变化呢?我试图找出这背后的逻辑支撑。
丽姐告诉我,可能来自谷歌,于是我网上搜了下,在谷歌里,有两篇文章关于谷歌的代码覆盖率,一篇是《Code coverage at Google》,这是篇论文。一篇是《Code Coverage Best Practices》,这是篇最佳实践,来自已经很久没有更新的 google test blog。
文章说通过谷歌数不清的经验得出来的数据:
行覆盖率:
变更覆盖率:
对于不同等级的系统:
我相信国内就有很多公司就直接搬了这套规则,毕竟谷歌的东西比较香。
我也想看看国内是否有类似的标准,在阿里的《Java 开发手册(嵩山版)》中找到了相关的信息
行覆盖率:
所以基本上,阿里内部的项目应该是把这个基线定在了 70%,但是为啥是 70%,依然没有找到答案。
我继续和研发讨论,我们首先达成共识:
再讨论的过程中,我们去看了一些覆盖率 90 或者 100 的案例,发现了一个比较有趣的特点,这些代码的覆盖率之所以高,往往是因为它没有异常分支和异常处理。它覆盖率的确高,的确漂亮,可惜它太脆弱了。
我看过很多代码,基本上一个函数中,有效代码或者主路径代码大概在 60%-80% 之间,其余的都是异常处理,这是比较常见或者合理的(或者可以用二八原则来解释,有点牵强,但是有点道理)。而对于开发而言,他的单测覆盖了这 60% 到 80% 的代码,也是比较合理的。至此,我对 70% 这个数字的感觉稍微笃定了些。
至于为什么不是 80 或者甚至更高?你来写单测的话,想 100 都可以。在效果和成本之间永远需要有折中。
不知道,你们公司的覆盖率规则是怎样的?可以留言讨论下。