美文网首页
代码增量覆盖率计算

代码增量覆盖率计算

作者: 祁小彬 | 来源:发表于2022-02-19 14:28 被阅读0次

转:https://zhuanlan.zhihu.com/p/158958885
计算增量测试覆盖率,总共需要3步

计算出增量代码的所有行号
计算出测试未覆盖的代码的所有行号
对比计算增量代码被测试覆盖的比例,得出增量覆盖率

一、计算增量代码的所有行号

git diff命令可以使用如下格式,用来对比不同commit(或分支)间的增量代码

git diff [<options>] <commit> <commit>

其中<commit>可以是分支名,对比分支间的差异,则是 git diff [<options>] targetBranchName sourceBranchName。可以简写为 git diff targetBranchName 表示对比当前分支与目标分支间的代码增量差异。

例如 git diff master 生成当前分支与master分支的增量信息,当有多个文件变化时,会有多个这样的信息块

解决方法:
使用 git diff --unified=0 master 或 git diff -U0 master看运行结果

数据结构与不带options的结果基本一致,只不过第2部分和第3部分作为一个整体可能会出现1次或多次,还有一点变化是第2部分行号信息的表达出现了三种格式。

-(+)后面只有一个数字,数字是<m>,表示删除(增加)了1行,行号是<m>。此例中-1, +1, +5, -10分别表示第1行删除1行,第1行增加1行,第5行增加1行,第10行删除一行。
-(+)后面有两个数字,第一个数字是<m>,第二个数字是0, 表示删除(增加)了0行,即m行没有变化,此例中-4,0表示第4行没有变化
-(+)后面有两个数字,第一个数字是<m>,第二个数字是<n>,不是0,表示删除(增加了)n行,起始行号是m。此例中+11,7表示从第11行开始,共增加了7行,行号一次递增,即 11, 12, 13, 14, 15, 16, 17 这几行。
因此,计算增量代码的信息只使用第1部分和第2部分就可以完成,由第1部分计算出增量代码的路径,由第2部分的+后面的数字计算得到增量代码的行号(-后面是删除的行信息,不是增量代码)。本例中a.js文件的增量行号是[1, 5, 11, 12, 13, 14, 15, 16, 17]。

对于linux系统,可以通过管道符|将diff文本导给grep命令(参考文献2),使用正则匹配出需要的信息,命令如下

git diff -U0 master | grep -Po '^+++ ./\K.*|^@@ -[0-9]+(,[0-9]+)? +\K[0-9]+(,[0-9]+)?(?= @@)'

生成结果如下图,此时,再按行遍历,生成以文件路径为Key,增量行号组成的Array为值的Hash表,用于后续逻辑的索引。

二、计算测试未覆盖的代码的所有行号

计算未被测试覆盖的行号,需要先在当前分支运行测试脚本生成对应的测试报告。

由此可见,计算未覆盖代码的行号,只需要提取覆盖率数据中SF和DA字段的值即可

SF是源码文件路径
DA字段有两个数字,第1个是行号,第2个是执行次数,半角逗号分隔,执行次数的值是0的即是未被覆盖的行
同解析diff增量数据一样,解析覆盖率数据时也可以按行读取字符串后做正则解析即可。对于linux系统,可以通过管道符|连接cat和grep命令(参考文献2),使用正则匹配出需要的信息,命令如下

cat coverage/lcov.info | grep -Po 'SF:\K.*|DA:\K[0-9]+(?=,0)'

生成的结果如下图,得到未被覆盖的行号,再按行遍历,生成以文件路径为Key,增量行号组成的Set为值的Hash表,用于后续逻辑的索引

相关文章

网友评论

      本文标题:代码增量覆盖率计算

      本文链接:https://www.haomeiwen.com/subject/guajlrtx.html