接口测试过程中,我们使用 Jacoco 采集了执行 case 过程中的代码覆盖率。但是在实际工作过程中,依然会遇到某次修改代码变动的代码覆盖率已达 100%(行覆盖率、分支覆盖率均达到 100%),测试用例通过率也完美的达到 100%,但是依然产生了严重的线上 bug。
在敏捷开发过程中,为了进行快速、精准地进行测试,简单介绍我们工作方式:
虽然我们关注了代码变更、代码覆盖率、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% 覆盖,依然需要坚守细心、耐心。