2013-11-21 35 views
4

我正在編寫一個多模塊應用程序。一些模塊只是基本的Java庫,然後包含在Web應用程序的WAR中。客戶端/服務器Web應用程序的代碼覆蓋範圍

我想運行在下列情況下的代碼覆蓋率:

  • 我通過通過Maven的啓動嵌入式的Jetty運行web應用程序。

  • 我有測試正在執行對web應用程序的HTTP請求。

  • 我想得到的代碼涵蓋在Web應用程序和測試。

這是可能的嗎?如何用Cobertura,JaCoCo或Emma實現?據我所知,在這種情況下,代碼覆蓋率將只覆蓋客戶端代碼。我對麼?

+0

出於興趣:你能解釋你如何執行測試嗎?這是否會自動工作,或者您是否需要手動測試碼頭和來電者? – PepperBob

+0

好吧,目前我有一個基於Maven的項目,它啓動了一個Web模塊的Jetty。代碼覆蓋率使用Sonar插件在Jenkins中執行。測試是JUnit 4.x.如果可能的話,我想我需要使用JaCoCo。我是否需要爲此使用一些Maven插件,還是會被Sonar拾起...? – carlspring

+0

項目中的JaCoCo Maven插件將啓動代理,Jenkins中的生成後操作將對Sonar進行測試。這就是它在單元測試中的作用。 – PepperBob

回答

2

我想如果您能夠將JaCoCo代理附加到運行jetty的jvm,那麼它應該能夠測量在您針對您的webapp運行集成測試時所調用的代碼。所以你應該得到一個統計數據來顯示你的代碼覆蓋率。

有一個JaCoCo Maven插件 - 儘管我不確定這是否會對你有幫助。在單元測試中使用它。

編輯:發現了一個博客,帖子,似乎在指向這裏的正確方向 Measure Code Coverage by Integration Tests with Sonar

1

您可以使用Jacoco插件生成代碼覆蓋率下面是我用JUnit測試代碼覆蓋插件配置。

<plugin> 
       <groupId>org.jacoco</groupId> 
       <artifactId>jacoco-maven-plugin</artifactId> 
       <version>0.5.10.201208310627</version> 
       <configuration> 
        <skip>${maven.test.skip}</skip> 
        <output>file</output> 
        <append>true</append> 
       </configuration> 
       <executions> 
        <execution> 
         <id>jacoco-initialize</id> 
         <goals> 
          <goal>prepare-agent</goal> 
         </goals> 
        </execution> 
        <execution> 
         <id>jacoco-site</id> 
         <phase>verify</phase> 
         <goals> 
          <goal>report</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 

注:你可以在Maven中獲得生命週期不是蓋的錯誤,而使用Eclipse,一種方法是使用你的插件管理明確提到的生命週期。我安裝了從市場上它解決了我的問題jacoco插件

+0

我不使用Eclipse。我更感興趣的是在CI服務器上運行它們時生成報告(我的情況是Jenkins)並將結果存儲到Sonar。這項工作會......? – carlspring

+0

不確定。我使用eclipse /命令提示符。所以在命令提示符下運行mvn測試,它將在運行測試用例的同時在fork到jvm之後生成jacoco exec文件。然後運行mvn jacoco:報告以html格式生成報告 –

1

這裏是我如何實現它

假設你已經有一個最小的pom.xml配置:

<plugin> 
    <groupId>org.jacoco</groupId> 
    <artifactId>jacoco-maven-plugin</ 
    <version>0.7.4.201502262128</vers 
</plugin> 
  1. Download JaCoCo's agent並將jacocoagent.jar複製到合適的位置(例如$HOME/tools/jacocoagent0.7.4.jar

  2. 附上JaCoCo的代理Maven的JVM通過:

    export MAVEN_OPTS="$MAVEN_OPTS \ 
    -javaagent:$HOME/tools/jacocoagent0.7.4.jar=output=tcpserver,port=6300" 
    
  3. 例如運行嵌入式Jetty服務器應用程序mvn jetty:run

  4. 運行的集成測試

  5. 在另一個shell,傾倒並通過mvn jacoco:dump jacoco:report

  6. 報告./target/site/index.html打開報表(默認)

1

我們有類似的情景集成測試在碼頭服務器上運行。我們還需要所有測試單元和集成的綜合報告。我們實現的解決方案是運行分支jetty並將jvoco的javaagent細節傳遞給jvmargs。我們的代碼覆蓋率報告涵蓋了所有其餘的api和服務層java代碼。 爲jacoco

<plugin> 
    <groupId>org.jacoco</groupId> 
    <artifactId>jacoco-maven-plugin</artifactId> 
    <version>${jacoco-maven-plugin.version}</version> 
    <configuration> 
     <append>true</append> 
    </configuration> 
    <executions> 
     <execution> 
      <id>prepare-test</id> 
      <goals> 
       <goal>prepare-agent</goal> 
      </goals> 
      <configuration> 
       <destFile>${project.build.directory}/jacoco.exec</destFile> 
       <propertyName>surefireArgLine</propertyName> 
      </configuration> 
     </execution> 
     <execution> 
      <id>prepare-integration</id> 
      <goals> 
       <goal>prepare-agent-integration</goal> 
      </goals> 
      <configuration> 
       <destFile>${project.build.directory}/jacoco.exec</destFile> 
       <propertyName>failsafeArgLine</propertyName> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

利用上述配置的配置POM我們產生兩個單元和集成測試的共同EXEC文件。接下來我們將碼頭配置爲分叉

<plugin> 
    <groupId>org.eclipse.jetty</groupId> 
    <artifactId>jetty-maven-plugin</artifactId> 
    <version>${jetty-maven-plugin.version}</version> 
    <configuration> 
     <stopKey>foo</stopKey> 
     <stopPort>9999</stopPort> 
     <webApp> 
      <contextPath>/myway</contextPath> 
      <descriptor>src/main/webapp/WEB-INF/web.xml</descriptor> 
     </webApp> 
     <!-- passing the jacoco plugin as a jvmarg --> 
     <jvmArgs>${failsafeArgLine}</jvmArgs> 
    </configuration> 
    <executions> 
     <execution> 
      <id>start-jetty</id> 
      <phase>pre-integration-test</phase> 
      <configuration> 
       <daemon>true</daemon> 
       <waitForChild>false</waitForChild> 
      </configuration> 
      <goals> 
       <goal>run-forked</goal> 
      </goals> 
     </execution> 
     <execution> 
      <id>stop-jetty</id> 
      <phase>post-integration-test</phase> 
      <goals> 
       <goal>stop</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

這將啓動碼頭與jvmargs單獨的jvm。最後,我們在pom的報告標籤中生成報告。我們注意到將報告添加到構建插件並未捕獲碼頭運行的集成測試。

<reporting> 
    </plugins> 
    <plugin> 
     <groupId>org.jacoco</groupId> 
     <artifactId>jacoco-maven-plugin</artifactId> 
     <version>${jacoco-maven-plugin.version}</version> 
     <reportSets> 
      <reportSet> 
       <id>jacoco-report</id> 
       <reports> 
        <report>report</report> 
       </reports> 
      </reportSet> 
     </reportSets> 
     </plugin> 
    </plugins> 
</reporting> 

該報告可在目標/網站/ jacoco/index.html的訪問,交替,你可以在命令行中運行它。

MVN jacoco:報告

希望它能幫助。

相關問題