2012-06-22 161 views
1

我試圖在包含自動生成代碼的項目上設置Cobertura代碼覆蓋率,該代碼使用Freemarker(顯式地,使用fmpp maven插件)從模板創建。Freemarker自動生成代碼的Cobertura代碼覆蓋率

然後我對這些自動生成的類進行單元測試。

但是,在計算代碼覆蓋率時,Cobertura沒有考慮這些單元測試。自動生成的類出現在報告中,但這些類的覆蓋率始終爲0%。

首先,是否有一些我錯過的Cobertura配置?

SO question似乎已經問過類似的問題,但接受的答案是:

生成的代碼不應該進行測試,不應在代碼覆蓋率的指標來使用。

這看起來不太合適 - 我想我應該測試生成的代碼(測試生成的類和模板),並且我想知道代碼覆蓋率是如何生成的。

那麼,第二,是否有一個很好的理由爲什麼生成的代碼不應該被測試?

編輯:這也是相關的提及,我正在使用cobertura-maven-plugin cobertura。因此,我不確定問題是否與cobertura或Maven插件(或我的配置...)

N.b.要清楚,我不是在問自動生成測試類。這些都是手動編寫的,以測試從模板創建的類。

回答

1

這是一個局部的答案報什麼我已經學會爲止...

首先,我有一個看的Cobertura是如何工作的,以及它似乎是如下:

  • 項目java類被修改爲在整個代碼中包含對TouchCollector.touch(...)(以及類似方法)的調用,並進行編譯。 (這是儀器任務。)
  • 測試在這些cobertura編譯的類上運行,並且TouchCollector記錄測試中已經達到項目類的哪些行。這些信息記錄在cobertura.ser數據文件中。
  • cobertura/report任務讀取cobertura.ser數據文件並生成html報告。

所以,我的第一個想法是,自動生成的類沒有正確插裝。但是,反編譯這些cobertura類文件後,我可以確認正常和自動生成的類都已正確插入。

此外,我可以確認所有測試 - 包括自動生成的類的測試正在運行。

然後,我的下一個問題是爲什麼當測試運行時,自動生成的類沒有被「觸及」。進一步的調查顯示,當正在編譯測試類(即測試編譯)時,自動生成的類將被添加到項目/目標/測試類中。一個簡單的測試打印自動生成的類的文件位置(例如System.out.println(MyAutoClass.class.getResource("MyAutoClass.class"));)證實,當測試由cobertura運行時,它使用test-classes文件夾中的自動生成的類,而不是cobertura編譯的類已被裝備。

然後,下一個問題是如何防止這些類被添加到測試類文件夾...?那麼,一種方法是排除自動生成的類被編譯。這可以通過只包括測試類來完成 - 例如:

<plugin> 
    <artifactId>maven-compiler-plugin</artifactId> 
    <version>x.y.z</version> 
    <configuration> 
    <testIncludes> 
     <testInclude>**/*Test.java</testInclude> 
    </testIncludes> 
    </configuration> 
</plugin> 

還是應該可以排除自動生成的類(這將是首選) - 沿着線的東西:

<testExcludes> 
    <testExclude>**/generated-sources/fmpp/**/*.java</testExclude> 
</testExcludes> 

但是,這不起作用,我不太清楚如何讓這個工作。

另一種可能是所有自動生成的類移動到一個單一的包,然後像下面可能是可能的:

<testExcludes> 
    <testExclude>com/organisation/project/auto/**/*.java</testExclude> 
</testExcludes> 

最後,我去的唯一包括*Test.java文件