2014-01-07 53 views
0

我已經花了整天昨天上下StackOverflow和谷歌和接近一些解決方案,但沒有任何工作。我希望有人能告訴我這是否可能。IT代碼覆蓋多個模塊Maven項目,有不同的父母

我們有一個多模塊Maven項目。我剛剛瞭解到這樣的結構:

Web Service XYX 
    +- pom.xml 
    +- Web Module 
     +- pom.xml (parent pom is WebService 123) 
    +- API Module 
     +- pom.xml (parent pom is API ABC) 
    +- API Implementation 
     +- pom.xml (parent pom is API ABC) 

我所做的是通過詹金斯設置從Jacoco到Sonar的UT和IT代碼覆蓋範圍。將UT覆蓋範圍正確發送到Sonar,以便組合UT。 IT覆蓋率始終爲0%。在使用Maven Tomcat插件啓動WAR之後,我的IT針對Web Module運行。它應該執行的代碼存在於模塊API實現中。即使一個jacoco-it.exec文件由Sonar生成並分析,它總是向我顯示沒有任何代碼行被擊中。有沒有辦法實際做到這一點?

順便說一句 - 我知道這是可以做到,因爲這文章指出正是我需要的: http://www.sonarqube.org/measure-code-coverage-by-integration-tests-with-sonar/

不過,文章沒有提到,如果這些模塊被稱爲項目相同的父。我正在做一個假設。

回答

0

在上下搜索互聯網之後,最好的解決方案似乎爲實際上將主pom指定爲父項的IT添加了另一個模塊。使用Cargo使用Tomcat Maven模塊獲取並運行來自IT模塊的WAR。 Code Coverage現在擁有所有的類,而不僅僅是Web Module的類。

0

我懷疑這是由於使用不同的父母。 分析覆蓋率聲納時,將根據sonar.jacoco.itReportPath屬性中指定的覆蓋率文件檢查每個模塊的代碼。默認值是target/jacoco-it.exec。因此,在分析WebModule時,它會檢查WebModule/target/jacoco-it.exec中的覆蓋範圍信息。

因此,我爲我的項目所做的工作就是在根模塊中爲IT覆蓋數據使用中央文件。

<plugin> 
    <groupId>org.jacoco</groupId> 
    <artifactId>jacoco-maven-plugin</artifactId> 
    <version>0.7.4.201502262128</version> 
    <executions> 
    <execution> 
     <id>prepare-it-agent</id> 
     <phase>pre-integration-test</phase> 
     <goals> 
     <goal>prepare-agent</goal> 
     </goals> 
     <configuration> 
     <destFile>${session.executionRootDirectory}/target/jacoco-it.exec</destFile> 
     <append>true</append> 
     <propertyName>failsafeArgLine</propertyName> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 

${session.executionRootDirectory}屬性是執行的根,你的情況WebServiceXYZ如果您運行的是構建。如果您有多個嵌套級別的多模塊,這也適用。

現在,您需要指出聲納在分析IT覆蓋率時使用該文件。所以你必須將sonar.jacoco.itReportPath設置爲該文件。不幸的是,這不適用於session.executionRootDirectory屬性,您必須手動設置文件的絕對路徑。我不建議在pom.xml中指定絕對路徑,因爲此路徑特定於您的構建環境。因此,要麼在Sonar中設置路徑,要麼將其設置爲構建環境的System屬性。我直接在Sonar Project Settings(Java> Jacoco)中設置它,例如/opt/buildroot/myProject/target/jacoco-it.exec。 現在聲納將檢查該文件以獲取每個模塊的IT覆蓋分析。