如何强制 Jacoco 在 Gradle 中使用特定版本

Posted

技术标签:

【中文标题】如何强制 Jacoco 在 Gradle 中使用特定版本【英文标题】:How to force Jacoco to use a specific version in Gradle 【发布时间】:2020-11-07 13:11:10 【问题描述】:

根据0.8.3 版本中的发行说明,过滤掉了非空断言运算符,我正在使用 Jacoco 0.8.5 版,如下所示:

jacoco 
    toolVersion = "0.8.5"

但它告诉我Not covered by tests (8 conditions)

我正在使用com.dicedmelon.gradle:jacoco-androidGithub link

我认为toolVersion = "0.8.5" 不起作用或类似的东西,因此我需要一种强制 Jacoco 版本的方法。

有没有办法解决这个问题?

【问题讨论】:

配置看起来正确。如果您不确定正在运行哪个版本,在 html 报告的右下角,您可以看到用于生成它的版本Created with JaCoCo 0.8.X。你检查过哪个值吗?示例:eclemma.org/jacoco/trunk/index.html @rolgalan 创建于 JaCoCo 0.8.5.201910111838 ???? 然后使用 toolVersion 设置器正确应用 jacoco 版本,问题出在其他地方。您应该共享特定代码和测试来评估覆盖率问题的根源。 【参考方案1】:

没有看到你的代码和你的测试,我不能说 100% 有信心,但看起来 Jacoco 工作正常,而且有些情况没有涵盖。

您正在使用!! 3 次。当您使用此运算符时,实际上,您正在创建 2 个流,当变量为空时,另一个用于非空。如果您为变量为空的情况添加测试,您应该达到100% 的覆盖率。

明确地说,如果您使用安全调用来处理您的可空值,您将拥有如下内容:

val token = authResult.user?.let 
        authenticationDataSource.getIdToken(true, it)
            ?.let  it.token 
            ?: throw GetIdTokenResultIsNullException()
     ?: throw UserIsNullException()

    token?.let 
        authenticationDataSource.loginBy(AuthenticationPayload(it))
     ?: throw TokenIsNullException()

无论我在哪里抛出异常,您都应该根据需要处理这种情况,这是由可空性创建的备用分支。

如果您确定您的值不会为 null,那么您应该更改您的类型以使其清晰并避免额外的检查。

附带说明,jacoco-android 似乎不再维护 here 并且它与较新的 gradle 版本不兼容,所以我建议直接使用 Jacoco。从jacoco-android 迁移到jacoco 应该没有那么难。

【讨论】:

以上是关于如何强制 Jacoco 在 Gradle 中使用特定版本的主要内容,如果未能解决你的问题,请参考以下文章

使用 Sonarrunner 和 Gradle 从 Jacoco 报告中排除包

使用Sonarrunner和Gradle从Jacoco报告中排除软件包

使用 Gradle 过滤 JaCoCo 覆盖率报告

使用 JaCoCo 和 Gradle 进行离线检测

使用 gradle / sonar / Jacoco 排除项目

Jenkins中用jacoco统计gradle项目的代码覆盖率