我正在编写一个多模块应用程序。一些模块只是基本的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