Java 客户机/服务器web应用程序的代码覆盖率
我正在编写一个多模块应用程序。其中一些模块只是基本的Java库,然后包含在webapp的WAR中 我希望在以下场景中运行代码覆盖率:Java 客户机/服务器web应用程序的代码覆盖率,java,maven,code-coverage,sonarqube,Java,Maven,Code Coverage,Sonarqube,我正在编写一个多模块应用程序。其中一些模块只是基本的Java库,然后包含在webapp的WAR中 我希望在以下场景中运行代码覆盖率: 我正在通过Maven启动的嵌入式Jetty运行webapp 我有针对webapp执行HTTP请求的测试 我想在webapp和测试中介绍代码 这可能吗?如何通过科贝图拉、杰科科或艾玛实现?据我所知,在这种情况下,代码覆盖范围将只覆盖客户端代码。我说的对吗?我认为,如果您能够将JaCoCo代理连接到运行jetty的jvm,它应该能够测量在您对Web应用程序运行集成
- 我正在通过Maven启动的嵌入式Jetty运行webapp
- 我有针对webapp执行HTTP请求的测试
- 我想在webapp和测试中介绍代码
这可能吗?如何通过科贝图拉、杰科科或艾玛实现?据我所知,在这种情况下,代码覆盖范围将只覆盖客户端代码。我说的对吗?我认为,如果您能够将JaCoCo代理连接到运行jetty的jvm,它应该能够测量在您对Web应用程序运行集成测试期间调用了哪些代码。因此,您应该得到一个统计数据,显示代码覆盖率
<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>
有一个JacoCoMaven插件——尽管我不确定这是否对您的场景有帮助。只是在单元测试中使用了它
编辑:在这里找到一篇似乎指向正确方向的博客文章
您可以使用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>
org.jacoco
jacocomaven插件
0.5.10.201208310627
${maven.test.skip}
文件
真的
jacoco初始化
配制剂
杰科科遗址
验证
报告
注意:在使用eclipse时,maven中可能会出现生命周期未涵盖的错误,一种方法是使用插件管理明确提到生命周期。我从市场上安装了jacoco插件,解决了我的问题以下是我如何实现的
假设您已经有一个最小的pom.xml配置:
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</
<version>0.7.4.201502262128</vers
</plugin>
mvn jetty:Run
mvn jacoco:dump jacoco:report
/target/site/index.html
(默认情况下)上打开报告我们有一个类似的场景,集成测试在jetty服务器上运行。此外,我们还需要所有单元测试和集成的组合报告。我们实现的解决方案是运行forkedjetty并将jacocojavaagent细节传递给jvmargs。我们的代码覆盖率报告涵盖了所有RESTAPI和服务层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>
org.jacoco
jacocomaven插件
${jacoco maven plugin.version}
真的
准备测试
配制剂
${project.build.directory}/jacoco.exec
surefireArgLine
准备集成
准备代理集成
${project.build.directory}/jacoco.exec
故障保护argline
通过上面的配置,我们为单元测试和集成测试生成了一个公共exec文件。接下来,我们将jetty配置为运行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>
org.eclipse.jetty
jetty maven插件
${jetty maven plugin.version}
福
9999
/麦韦
src/main/webapp/WEB-INF/WEB.xml
${failsafeArgLine}
起动码头
预集成测试
真的
假的
分叉
停靠码头
整合后测试
停止
这将在带有jvmargs的单独jvm中启动jetty。最后,我们在pom的reporting标签中生成了报告。我们注意到,将报告添加到构建插件并没有捕获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>
org.jacoco
jacocomaven插件
${jacoco maven plugin.version}
雅科科报告
报告
可以通过target/site/jacoco/index.html访问这些报告,也可以从命令行运行它
mvn jacoco:报告
希望有帮助。出于兴趣:您能解释一下您是如何执行测试的吗?这是自动工作还是需要手动为jetty和调用者插入仪器?目前,我有一个基于Maven的项目,它启动了一个带有web模块的jetty。代码覆盖使用Sonar插件在Jenkins中执行。测试是JUnit4.x。如果可能的话,我想我需要使用JaCoCo。我需要为此使用一些Maven插件吗,或者它会被Sonar接收吗…?项目中的JaCoCo Maven插件将启动代理,Jenkins中的后期构建操作将为Sonar提供仪器。这就是它在单元测试中的工作原理,我不使用Eclipse。我更感兴趣的是,在CI服务器上运行报告(在我的例子中是Jenkins)并将结果存储到Sonar时,只生成报告。这行吗…?不确定。我使用eclipse/命令提示符。因此,在命令提示符下,我运行mvn测试,在运行测试用例时,它将在fork到jvm之后生成jacocoexec文件。然后运行mvn jacoco:向gene报告