2012-06-19 75 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目錄。