我正在编写一个多模块应用程序。一些模块只是基本的Java库,然后包含在webapp的WAR中。
我想在以下场景中运行代码覆盖:
我正在通过Maven启动的嵌入式Jetty运行webapp。
我有针对webapp执行HTTP请求的测试。
我想在网络应用程序和测试中获得代码。
这是可能的,如何通过Cobertura,JaCoCo或Emma实现?据我所知,代码覆盖率仅涵盖此方案中的客户端代码。我是对的吗?
答案 0 :(得分:2)
我认为如果你设法将JaCoCo-agent附加到运行jetty的jvm,它应该能够测量在你对webapp运行集成测试时调用了哪些代码。因此,您应该获得一个显示代码覆盖率的统计信息。
有一个JaCoCo Maven插件 - 虽然我不确定这对你的情况是否有帮助。只是在单元测试中使用它。
编辑:发现一篇博客帖子似乎指向了正确的方向 Measure Code Coverage by Integration Tests with Sonar
答案 1 :(得分: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>
注意:在使用eclipse时,你可能会在maven中获得生命周期未覆盖的错误,一种方法是使用插件管理明确提及生命周期。我从市场安装了jacoco插件,解决了我的问题
答案 2 :(得分:1)
以下是我实现它的方式
假设您已经有一个最小的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
(默认情况下)
答案 3 :(得分:1)
我们有类似的情况,在jetty服务器上运行集成测试。此外,我们需要所有测试单元和集成的组合报告。我们实现的解决方案是运行分叉码头并使用jacoco javaagent详细信息传递jvmargs。我们的代码覆盖率报告涵盖了所有其他api和服务层java代码。 jacoco的pom配置
<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>
通过上面的配置,我们为单元和集成测试生成了一个通用的exec文件。接下来我们将jetty配置为run-forked
<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的报告标签中生成了报告。我们注意到将报告添加到构建插件并没有捕获由jetty运行的集成测试。
<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>
可以在target / site / jacoco / index.html访问报告,也可以从命令行运行报告。
mvn jacoco:报告
希望它有所帮助。