2017-02-17 46 views
1

我有一個有點大的多模塊Maven項目。我在Jacoco處理的每個模塊中都有單元測試。我有一個單獨的子模塊做「合併」和「報告聚合」,這似乎是生成數據。我甚至在SonarQube中使用生成的數據。我的大多數測試都使用PowerMock,而我正在使用脫機工具。jacoco只顯示同一模塊中的類的覆蓋率

但是,在仔細觀察覆蓋率數據之後,我發現它正在遺漏覆蓋範圍數據,以瞭解我在測試期間執行的類和方法。我在每個模塊中看到的模式是,它只報告每個模塊中的單個類的覆蓋範圍,這是實際在當前模塊中的類。幾乎所有的測試都會調用構建中其他模塊中的其他類,並且這些類的覆蓋率從不報告。

以下插件配置在各子模塊使用的父POM:

<plugin> 
    <groupId>org.jacoco</groupId> 
    <artifactId>jacoco-maven-plugin</artifactId> 
    <version>0.7.8</version> 
    <executions> 
     <execution> 
      <id>default-instrument</id> 
      <goals> 
       <goal>instrument</goal> 
      </goals> 
     </execution> 
     <execution> 
      <id>default-restore-instrumented-classes</id> 
      <goals> 
       <goal>restore-instrumented-classes</goal> 
      </goals> 
     </execution> 
     <execution> 
      <id>default-report</id> 
      <phase>prepare-package</phase> 
      <goals> 
       <goal>report</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 
<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>2.19.1</version> 
    <configuration> 
     <argLine>-Xmx1024m</argLine> 
     <includes> 
      <include>**/*Test.java</include> 
     </includes> 
     <systemPropertyVariables> 
      <jacoco-agent.destfile>${project.build.directory}/jacoco.exec</jacoco-agent.destfile> 
      <running-unit-test>true</running-unit-test> 
     </systemPropertyVariables> 
    </configuration> 
</plugin> 

當我檢查每個模塊生成的HTML結果,我發現,它僅報告在單一流的成果當前模塊,而不是其他模塊中類的數據。從這個角度來看,我會假設我如何在單獨的子模塊中進行「合併」和「報告聚合」可能與此問題無關。

生成的「jacoco.exec」文件是二進制文件,但我試圖從一個模塊中「捕捉」一個文件,以查看哪些ascii文本是可見的,並且只顯示了一個看起來像文件名的文件,它是該模塊的HTML覆蓋率報告中唯一報告的文件名。

我不確定我可以報告的其他信息。

更新

我想我可以看到很清楚,現在當萬無一失運行單元測試,它採用了儀表類從目前的模塊,但樁的類都是從行家文物。這就是爲什麼我只看到當前模塊中的類的覆蓋率。

因此,看起來我需要一種方法來指定當前模塊所依賴的每個模塊的「target/generated-classes/jacoco」文件夾,該文件夾被保存到了surefire使用的類路徑中。我沒有辦法做到這一點。

或者,我看到「工具」目標有一個「包含」配置元素。我應該爲每個當前模塊所依賴的模塊指定所有「目標/類」目錄的路徑嗎?

回答

0

記錄某些類的代碼覆蓋率需要使用其工具。目標instrument執行當前模塊的類的檢測。

所有測試的其他模塊

,以便不儀器的那些還調用其他類。如果我正確理解,那麼你正是錯過了覆蓋面。

如果您不使用PowerMock作爲來自其他模塊的類,但僅適用於當前模塊中的類,那麼您可以將脫機檢測與動態使用代理結合使用。但在這種情況下,請確保脫機檢測的代碼被代理明確排除在儀器上,否則代理將拋出IllegalStateException: Class ... is already instrumented

如果使用PowerMock針對來自其他模塊類,那麼這變得更加複雜,因爲在類路徑和相關操作的方面的Maven的嚴格。我懷疑,這可以用一個mvn COMAND可以輕鬆實現,但似乎有可能使用更多:

  1. 儀器和運行測試,但不使用restore-instrumented-classes
  2. 恢復類和生成報告(S)

可惜你沒有提供完整的示例(https://stackoverflow.com/help/mcve)和我沒有時間來準備完整的例子,現在來測試這種方法。

補充說明:不能簡單地用劑來自於PowerMock繞過任何代理,並從磁盤中讀取類文件的事實。

+0

我想我會用幾個中期戰略解決這個問題:1.雖然我們使用的是與離線儀器儀表PowerMock,接受模塊「foo」的單元測試將只顯示覆蓋該模塊,2.寫單元不被覆蓋類的其他模塊的測試,3.更換迫使PowerMock的用途使用一個工廠,然後更改這些測試使用和的Mockito在線儀表的一種機制。 –

相關問題