增量代码覆盖率的生成
- 获取修改代码内容
利用git工具(org.eclipse.jgit库)对比测试分支与master分支,获取新增和修改的代码。使用DiffCommand方法比较两个版本的代码差异,按照Java代码格式进行代码文件过滤,路径一般是src/main/java,从源代码文件中,过滤掉非java文件。
- 生成增量代码报告
JaCoCo工具是通过字节码操作框架asm(org.objectweb.asm)库对编译后的class进行遍历计算生成覆盖率报告的。
计算方式是:
加载所有的exec文件数据,遍历class文件,找出匹配的ExecutionData,再利用asm框架,分析计算得到覆盖率数据。阅读JaCoCo源码(0.8.5版本)后,重写ClassProbesVisitor和MethodCoverageCalculator。
- 重写ClassProbesVisitor的addMethodCoverage方法
private void addMethodCoverage(final String name, final String desc,
final String signature, final InstructionsBuilder icc,
final MethodNode methodNode) {
...
if (mc.containsCode()) {
// 判断是否在修改代码中
...
if (contains) {
// 属于增量代码
coverage.addMethod(mc);
}
}
}
- 重写MethodCoverageCalculator的calculate方法
void calculate(final MethodCoverageImpl coverage) {
...
for (final Entry<AbstractInsnNode, Instruction> entry : instructions
.entrySet()) {
if (!ignored.contains(entry.getKey())) {
final Instruction instruction = entry.getValue();
if (inModifiedLines) {
// 属于增量代码,计算分析覆盖率
coverage.increment(instruction.getInstructionCounter(),
instruction.getBranchCounter(), instruction.getLine());
}
}
}
...
}
除了增量代码覆盖率,还可以细分到代码分支、需求级别覆盖率,更多见https://zhuanlan.zhihu.com/p/429813264
网友评论