jacoco代码覆盖率明明逻辑已经覆盖了但是显示覆盖率为0(二)

上一次我们讲过,关于代码覆盖率为0的原因,很大概率是因为我们相同的类,但是classId不同导致了这个问题,所以我们在上一篇文章里面提到过,通过类名再做一次合并的动作避免这种问题的出现。结果在改完代码逻辑以后,还是相同的同学,他又出现了一个一样的现象, 抱着一样的排查方式,我又重新排查了一次。

背景

先介绍下项目的背景: 出现问题的类名是 xxx.service.impl.MessageServiceImpl,测试同学反馈的还是一样的问题,就是代码逻辑其实他通过手工测试已经触发了,但是在覆盖率报告里面却是没有覆盖,出现这个问题,其实我们刚才已经说过了,基本上是因为classId不一致导致了这个问题。所以我们重新查看下exec文件的情况。

在这里插入图片描述
在这里插入图片描述

我们分别找到了两个不同的服务覆盖率文件,发现了一个特殊的情况,竟然两个相同的类名探针的数据是不一样的。按理来说不应该会发生这种情况才对,因为相同的代码探针插入的情况应该是一样的才对,除非是代码不相同(开始我并没有往这块去思考)

分析

既然这样子我们就去分析下插桩后的代码的探针是啥样的,这里我们需要使用到阿里的一个神器了 arthas。 我们需要使用的是他一个反编译的功能,这里就不介绍arthas的使用方法了,有兴趣的同学可以百度了解下。

jad xxx.service.impl.MessageServiceImpl

通过以上的命令我们就得到了反编译后的代码

private static /* synthetic */ boolean[] $jacocoInit() {
    boolean[] blArray = $jacocoData;
    if ($jacocoData == null) {
        Object[] objectArray = new Object[]{-8970768149164403672L, "com/seewoedu/train/service/impl/MessageServiceImpl", 539};
        UnknownError.$jacocoAccess.equals(objectArray);
        blArray = $jacocoData = (boolean[])objectArray[0];
    }
    return blArray;
}

我们可以看到大概这样子的效果,这里的blArray实际上就是探针的数组长度, 这里定义的就是539的长度,

我们再看下另外一个服务反编译后的代码情况

private static /* synthetic */ boolean[] $jacocoInit() {
    boolean[] blArray = $jacocoData;
    if ($jacocoData == null) {
        Object[] objectArray = new Object[]{8280241422563924486L, "com/seewoedu/train/service/impl/MessageServiceImpl", 540};
        UnknownError.$jacocoAccess.equals(objectArray);
        blArray = $jacocoData = (boolean[])objectArray[0];
    }
    return blArray;
}

这里的长度确实是540。 所以这个就是为什么代码覆盖率不准确的原因了,因为探针长度不一样,导致覆盖率数据合并不成功导致的。

既然都已经能反编译出具体的代码代码内容了,那我们就看下具体不一样代码的地方吧。
在这里插入图片描述

在这里插入图片描述

通过以上截图我们终于知道为什么了,因为这两处的代码是不一样的,导致探针的数组就不一样了。

分析了一大波,结果发现问题的原因其实很简单,就是因为两个被测的服务其实使用的公共模块的代码并不是一致的,所以导致了这个问题。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Jacoco是一个用于Java代码覆盖率分析的开源工具。它可以帮助开发团队评估测试用例对代码的覆盖情况,从而提供关于代码质量和测试覆盖率的详细报告。 首先,为了将Jacoco应用于项目中,我们需要在构建工具中配置Jacoco插件。常用的构建工具有Maven和Gradle,两者都支持Jacoco插件。在配置中,我们需要指定Jacoco的启动参数、输出文件的路径等等。 接下来,我们需要确保项目的测试用例充分覆盖到代码的各个分支和逻辑路径。可以通过编写更全面的测试用例或使用自动化测试工具来实现。在这个阶段,我们可以通过运行测试用例来收集代码覆盖率数据。 然后,我们可以生成Jacoco覆盖率报告。Jacoco可以将收集到的数据转化为易读的HTML或XML格式报告,其中包含了代码覆盖率的详细信息,例如每个类、方法和行的覆盖率百分比。这个报告可以帮助开发团队发现哪些部分的代码缺乏测试覆盖,从而优化测试策略。 最后,我们可以将Jacoco覆盖率报告集成到持续集成环境中,例如Jenkins。这样,每次代码发生变更时,都会自动运行测试用例并生成最新的覆盖率报告。通过与其他开发团队成员共享这份报告,可以促进团队合作和代码质量的持续改进。 需要注意的是,Jacoco只能提供代码覆盖率信息,不能保证测试用例的质量和覆盖率的完整性。因此,在使用Jacoco时,我们还需要关注测试用例的编写质量,以确保基于Jacoco代码覆盖率评估结果是准确可信的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值