2012-06-19 122 views
3

我有一个Groovy类与单个静态方法Groovy代码:声纳+ JaCoco不计算为覆盖

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)) 
} 

这导致6/12分支根据声纳/ JaCoCo覆盖:

Half Code Coverage

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

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

而现在,而不必改变任何东西,声纳/ JaCoCo报告它被完全覆盖:

JaCoCo 100% Coverage

为什么会出现这种情况?

+0

我猜这是Sonar/JaCoCo中的一个错误,因为这两种方法都会产生非常类似的字节码,据我所见...... –

+0

我已经在Cobertura下运行相同的“代码覆盖看起来如何”并产生完全相同的结果。在单线上进行了半测试,并在扩展版本上进行了全面测试。那是......有关。 – Mike

+0

我已经发布了两个生成的字节码[这里](https://gist.github.com/e61f5f41175c6a8e076b),他们看起来没什么问题(但显然多行代码调用'areturn'比单行版本更)......可能有人在Groovy用户邮件列表中发现了这个问题(并找到了解决方法)......我会尝试关闭一封电子邮件,看看有没有人看到过这个问题? –

回答

3

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

的情况可能使用Groovy 3.0,这将被设计围绕Java invokedynamic,这意味着更少的“神奇”的字节码将不得不产生改善。与此同时,我听说Clover有明确的Groovy支持,但我不知道它是多么新颖。

1

所以,事实证明,在Jacoco插件声纳明确查找Java代码。我知道这一点,因为我通过它进行调试。它解码jacoco exec文件,并假定任何文件都是JavaFile,它找不到,然后说你没有覆盖信息。因此,我将源代码抓取到Jacoco插件(它从Subversion存储库中消失,从未出现在Github上,我可以找到它)并将其折叠到新的Groovy插件中。我更新的版本使用Codenarc 0.18.1(将Narc从32增加到305),并识别任何类型的Jacoco文件 - 现有插件中的代码是不必要的错误。

源是在这里:https://github.com/rvowles/sonar-groovy - 只是建立它,并把它放在你的扩展/ plugins目录。