测试覆盖率 这 70% 的覆盖率,这是你拍脑袋的吗?

恒温 · 2021年08月15日 · 最后由 槽神 回复于 2021年08月16日 · 5200 次阅读

我最近在整理质量标准,质量标准是个什么东西呢?

质量标准是产品生产、检验和评定质量的技术依据。产品质量特性一般以定量表示,例如强度、硬度、化学成分等;所谓标准,指的是衡量某一事物或某项工作应该达到的水平、尺度和必须遵守的规定。而规定产品质量特性应达到的技术要求,称为 “产品质量标准”。--(百度百科)

大白话就是,我们把在研发过程中所有和质量相关的可以度量的数据拿出来,整理一个基线,形成质量标准。我们拿这个标准来规范整个研发流程,包括开发活动和测试活动。我们试图推广质量标准的时候,遇到了一些阻力,其中有一项就是关于代码覆盖率(行覆盖率和变更覆盖率)的质疑。

这 70% 的覆盖率,这是你拍脑袋的吗?

有点尴尬,我回答不出,仔细捋了下,没有发现这个数据背后的逻辑支撑。问了团队的小伙伴也不知道出处。按常理,我们能得出一个标准的时候,必然是经过了各种实践和演进,覆盖率从 0 到 70 的过程中,一定是有什么变化,才会推动覆盖率的上升。那是怎样的变化呢?我试图找出这背后的逻辑支撑。

Google 经验

丽姐告诉我,可能来自谷歌,于是我网上搜了下,在谷歌里,有两篇文章关于谷歌的代码覆盖率,一篇是《Code coverage at Google》,这是篇论文。一篇是《Code Coverage Best Practices》,这是篇最佳实践,来自已经很久没有更新的 google test blog。

文章说通过谷歌数不清的经验得出来的数据:

行覆盖率:

  1. 60% 为 “可接受”
  2. 75% 为 “推荐”
  3. 90% 为 “出色的”

变更覆盖率:

  1. 90% 为底线
  2. 99% 为合理

对于不同等级的系统:

  1. Level 1 Coverage automation disabled —— 没有自动化覆盖率
  2. Level 2 Coverage automation enabled —— 有自动化覆盖率
  3. Level 3 Project coverage at least 60%; Changelist coverage at least 70% —— 覆盖率>=60%,变更覆盖率>=70%
  4. Level 4 Project coverage at least 75%; Changelist coverage at least 80% —— 覆盖率>=75%,变更覆盖率>=80%
  5. Level 5 Project coverage at least 90%; Changelist coverage at least 90% —— 覆盖率>=90%,变更覆盖率>=90%

我相信国内就有很多公司就直接搬了这套规则,毕竟谷歌的东西比较香。

阿里经验

我也想看看国内是否有类似的标准,在阿里的《Java 开发手册(嵩山版)》中找到了相关的信息

行覆盖率:

  1. >=70%
  2. 核心模块行覆盖率 100%
  3. 核心模块分支覆盖率 100%

所以基本上,阿里内部的项目应该是把这个基线定在了 70%,但是为啥是 70%,依然没有找到答案。

讨论

我继续和研发讨论,我们首先达成共识:

  1. 质量很重要
  2. 覆盖率肯定要
  3. 不能一味的追求覆盖率数字
  4. 有效的单测覆盖率才对

再讨论的过程中,我们去看了一些覆盖率 90 或者 100 的案例,发现了一个比较有趣的特点,这些代码的覆盖率之所以高,往往是因为它没有异常分支和异常处理。它覆盖率的确高,的确漂亮,可惜它太脆弱了。

我看过很多代码,基本上一个函数中,有效代码或者主路径代码大概在 60%-80% 之间,其余的都是异常处理,这是比较常见或者合理的(或者可以用二八原则来解释,有点牵强,但是有点道理)。而对于开发而言,他的单测覆盖了这 60% 到 80% 的代码,也是比较合理的。至此,我对 70% 这个数字的感觉稍微笃定了些。

至于为什么不是 80 或者甚至更高?你来写单测的话,想 100 都可以。在效果和成本之间永远需要有折中。

问题

不知道,你们公司的覆盖率规则是怎样的?可以留言讨论下。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
最佳回复

我看过很多代码,基本上一个函数中,有效代码或者主路径代码大概在 60%-80% 之间

这大概也是你拍脑袋的,哈哈哈

共收到 13 条回复 时间 点赞

我看过很多代码,基本上一个函数中,有效代码或者主路径代码大概在 60%-80% 之间

这大概也是你拍脑袋的,哈哈哈

Thirty-Thirty 回复

那倒不是,基本上是这样。

哎,小弟不才,还弄不懂怎么测试这个覆盖率,给测试届的前辈丢脸了。

之前做过 python 的白盒自动生成覆盖率算法,当时语句覆盖的话,是可以通过入参控制走到 100%,但是路径,分支等就不好弄了,能走到 50% 都很勉强。我觉得阿里的 70% 可能是经过人工长期积累的 成本和收益,最终确定的性价比最高,符合概率最高的线,而且也好统计,要真算个 71.5% 这种 ,还不好凭 okr 了。😂

我们是先约定了一个共识的覆盖率(40%),然后再根据实际情况增加或者减少覆盖率的要求,涨超过 5% 的有奖励。
最终的现象是好的稳定的团队(也可能是闲的),这个一直涨到 60-70% 左右就没涨了,当然也有原地踏步的团队(人员流动很大),以前是 0%,后面是 40%,万年不动。

70% 我咋感觉还是有点高,感觉 60 多差不多

我们之前用覆盖率,不会这么硬性指定必须达到 xx%。我们关注的是没覆盖的部分,是否能给出合理的说明(比如这个只是一个捕获异常后的日志记录,对业务不那么重要),保障不会有明显漏测即可。

我去热饭 回复

这个看大家的卡点,很多项目组为了覆盖率而单测,这种可能连断言都没的。

陈恒捷 回复

如果覆盖率 0,那评估起来不是很累?

恒温 回复

覆盖率 0,那没有评估的必要,说明压根没测。。。

一般地,常规软件测试应达到语句和分支/判定测试均 100% 覆盖,对于一些高安全的的软件可能需要达到 MCDC 测试 100% 覆盖。
当然,覆盖率是动态测试用例设计是否充分的监督,而不能仅仅查看覆盖率是否达到要求。

  • 全量覆盖率 60%
  • 增量覆盖率 80%

我厂的覆盖率,都是通过外部(上层/消费者)API 来调用执行测试,完了统计测试覆盖率,握了一把草~

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