我正在編寫一個多模塊應用程序。一些模塊只是基本的Java庫,然後包含在Web應用程序的WAR中。客戶端/服務器Web應用程序的代碼覆蓋範圍
我想運行在下列情況下的代碼覆蓋率:
我通過通過Maven的啓動嵌入式的Jetty運行web應用程序。
我有測試正在執行對web應用程序的HTTP請求。
我想得到的代碼涵蓋在Web應用程序和測試。
這是可能的嗎?如何用Cobertura,JaCoCo或Emma實現?據我所知,在這種情況下,代碼覆蓋率將只覆蓋客戶端代碼。我對麼?
我正在編寫一個多模塊應用程序。一些模塊只是基本的Java庫,然後包含在Web應用程序的WAR中。客戶端/服務器Web應用程序的代碼覆蓋範圍
我想運行在下列情況下的代碼覆蓋率:
我通過通過Maven的啓動嵌入式的Jetty運行web應用程序。
我有測試正在執行對web應用程序的HTTP請求。
我想得到的代碼涵蓋在Web應用程序和測試。
這是可能的嗎?如何用Cobertura,JaCoCo或Emma實現?據我所知,在這種情況下,代碼覆蓋率將只覆蓋客戶端代碼。我對麼?
我想如果您能夠將JaCoCo代理附加到運行jetty的jvm,那麼它應該能夠測量在您針對您的webapp運行集成測試時所調用的代碼。所以你應該得到一個統計數據來顯示你的代碼覆蓋率。
有一個JaCoCo Maven插件 - 儘管我不確定這是否會對你有幫助。在單元測試中使用它。
編輯:發現了一個博客,帖子,似乎在指向這裏的正確方向 Measure Code Coverage by Integration Tests with Sonar
您可以使用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插件
我不使用Eclipse。我更感興趣的是在CI服務器上運行它們時生成報告(我的情況是Jenkins)並將結果存儲到Sonar。這項工作會......? – carlspring
不確定。我使用eclipse /命令提示符。所以在命令提示符下運行mvn測試,它將在運行測試用例的同時在fork到jvm之後生成jacoco exec文件。然後運行mvn jacoco:報告以html格式生成報告 –
這裏是我如何實現它
假設你已經有一個最小的pom.xml配置:
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</
<version>0.7.4.201502262128</vers
</plugin>
Download JaCoCo's agent並將jacocoagent.jar
複製到合適的位置(例如$HOME/tools/jacocoagent0.7.4.jar
)
附上JaCoCo的代理Maven的JVM通過:
export MAVEN_OPTS="$MAVEN_OPTS \
-javaagent:$HOME/tools/jacocoagent0.7.4.jar=output=tcpserver,port=6300"
例如運行嵌入式Jetty服務器應用程序mvn jetty:run
運行的集成測試
在另一個shell,傾倒並通過mvn jacoco:dump jacoco:report
報告./target/site/index.html
打開報表(默認)
我們有類似的情景集成測試在碼頭服務器上運行。我們還需要所有測試單元和集成的綜合報告。我們實現的解決方案是運行分支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:報告
希望它能幫助。
出於興趣:你能解釋你如何執行測試嗎?這是否會自動工作,或者您是否需要手動測試碼頭和來電者? – PepperBob
好吧,目前我有一個基於Maven的項目,它啓動了一個Web模塊的Jetty。代碼覆蓋率使用Sonar插件在Jenkins中執行。測試是JUnit 4.x.如果可能的話,我想我需要使用JaCoCo。我是否需要爲此使用一些Maven插件,還是會被Sonar拾起...? – carlspring
項目中的JaCoCo Maven插件將啓動代理,Jenkins中的生成後操作將對Sonar進行測試。這就是它在單元測試中的作用。 – PepperBob