Sonar + JaCoco不计算Groovy代码

时间:2012-06-19 03:28:24

标签: groovy sonarqube jacoco

我有一个Groovy类,只有一个静态方法:

class ResponseUtil {
    static String FormatBigDecimalForUI (BigDecimal value){
        (value == null || value <= 0) ? '' : roundHalfEven(value)
    }
}

它有一个或几个测试用例:

@Test
void shouldFormatValidValue () {
    assert '1.8' == ResponseUtil.FormatBigDecimalForUI(new BigDecimal(1.7992311))
    assert '0.9' == ResponseUtil.FormatBigDecimalForUI(new BigDecimal(0.872342))
}

@Test
void shouldFormatMissingValue () {
    assert '' == ResponseUtil.FormatBigDecimalForUI(null)
}

@Test
void shouldFormatInvalidValue () {
    assert '' == ResponseUtil.FormatBigDecimalForUI(new BigDecimal(0))
    assert '' == ResponseUtil.FormatBigDecimalForUI(new BigDecimal(0.0))
    assert '' == ResponseUtil.FormatBigDecimalForUI(new BigDecimal(-1.0))
}

这导致根据Sonar / JaCoCo覆盖6/12个分支:

Half Code Coverage

所以我把代码更改为更详细...我不认为原始代码是“太聪明”或类似的东西,但我使它更明确,更清晰。所以,这是:

static String FormatBigDecimalForUI (BigDecimal value) {
    if (value == null) {
        ''
    } else if (value <= 0) {
        ''
    } else {
        roundHalfEven(value)
    }
}

现在,Sonar / JaCoCo没有改变任何其他内容,报告完全覆盖了它:

JaCoCo 100% Coverage

为什么会这样?

2 个答案:

答案 0 :(得分:3)

我不知道它是否适用于您的具体示例,但请记住,代码覆盖工具通常不适用于替代JVM语言,除非它们明确支持它们。这是因为几乎所有这些语言都生成额外的字节代码,这些代码只能在某些情况下执行。例如,Groovy可能会为慢速路径和快速路径生成字节代码,并且可能会自动在它们之间做出决定,而无需用户说话。

Groovy 3.0可以改善这种情况,它将围绕Java invokedynamic设计,这意味着必须生成较少的“魔术”字节代码。同时,我听说Clover有明确的Groovy支持,虽然我不知道它是如何最新的。

答案 1 :(得分:1)

因此,事实证明,Sonar的Jacoco插件明确地寻找Java代码。我知道这一点,因为我通过它进行了调试。它解码jacoco exec文件,并假设任何文件都是JavaFile,它找不到,然后说你没有覆盖信息。

因此,我抓住了Jacoco插件的源代码(它从他们的Subversion存储库中消失了,并且从未出现在我可以找到的Github上)并将其折叠成一个新的Groovy插件。我更新的一个使用Codenarc 0.18.1(它将Narc从32增加到305)并识别任何类型的Jacoco文件 - 现有插件中的代码是不必要的错误。

源代码在这里:https://github.com/rvowles/sonar-groovy - 只需构建它并将其放在extensions / plugins目录中。