背景

接口测试过程中,我们使用 Jacoco 采集了执行 case 过程中的代码覆盖率。但是在实际工作过程中,依然会遇到某次修改代码变动的代码覆盖率已达 100%(行覆盖率、分支覆盖率均达到 100%),测试用例通过率也完美的达到 100%,但是依然产生了严重的线上 bug。

过程介绍

在敏捷开发过程中,为了进行快速、精准地进行测试,简单介绍我们工作方式:

  1. 开发提测后我们通常都会快速检查开发代码变动;
  2. 根据代码变更评估开发代码变动影响范围,针对性的设计测试用例;
  3. 执行用例,检查用例覆盖率。
  4. 当代码变更较大时,我们会在 master 分支回归测试一遍;
  5. 上线过程中检查代码代码是否包括未经测试的代码;
  6. 线上验证

为什么会这样?

虽然我们关注了代码变更、代码覆盖率、case 通过率,测试用例通过率 100%、变更代码的代码覆盖率甚至达到 100%。但是由于测试人员、开发人员疏忽,依然可能导致验证的线上问题。
简要分析一下问题原因:
(1)测试用例执行后的测试结果准确率不是 100%
借用下图解释问题产生的部分原因:

根据上图我们可以发现,对于一个用例通过率 100% 的测试用例集,用例执行结果的准确率可能并不等于 100%,这是问题产生的一个重要原因。

(2)变更的代码潜在影响其他未变动的代码

某次代码变更缩略图如上所示,图中开发新增了一个 sql 片段,与相邻代码的 sql 片段字段相同,仅 where 条件有细微差异(图中标红的两部分),以便快速满足一个业务需求,但是上线后却产生了严重 bug。
最终分析原因是开发 copy 的 sql 语句缺少一个字段造成的,不影响任何变更的代码逻辑,而是开发同学将 sql 结果传给其他方法导致的问题。

(3)原来代码潜藏 bug(遗留 bug)

部分遗留代码中潜藏一些严重 bug,虽然开发代码变更没有引入新的 bug,但是某些情况下提高了原来遗留严重 bug 出现的概率,进而导致严重的线上 bug。

res = rpc.getData(req);
String total  = res.getDataTotal();
......
String average = res.getDataTotal();

某需求调用了第 3 方接口,接口返回数据中包括多个金额字段。开发同学 copy 的代码中将 avarage 字段取值为 total,由于测试过程中本部分代码为遗留代码,测试过程中上述代码未变更,导致上线后将平均金额弄错了。

(4)问题原因不仅仅限于上述方面,虽然测试用例 100%+ 代码覆盖率 100%,依然可能产生严重的线上问题。

写在后面

测试覆盖率、测试用例通过率可以用来衡量测试过程与代码质量,测试过程中即便测试用例通过率 100%、代码覆盖率达到 100% 覆盖,依然需要坚守细心、耐心。


↙↙↙阅读原文可查看相关链接,并与作者交流