java - 如何使用集成测试获得 servlet 的代码覆盖率
问题描述
我一直在尝试使用集成测试来获得实际开发代码(servlet 和其他)的代码覆盖率(代码覆盖率不适用于集成测试)。
技术栈:Java 1.8、Maven 3.3.9 和 IntelliJ Idea 2018.3
我的项目结构如下
- 集成测试模块
- Servlet 模块(战争)
- 模块 1
- 模块 2
为了运行我的集成测试 (IT),我在 IntelliJ 中将 Tomcat 配置为在 8081 端口上运行。为了执行 IT,我们不断在本地主机上发布信息http://localhost:8081/rm-xsp/servletname
下面是我的pom
,mvn clean verify -Pone
是我的行家目标
<properties>
<!--Servlet code-->
<server.classes>../rm-xsp-war/target/classes</server.classes>
<server.sources>../rm-xsp-war/src/main/java</server.sources>
<!--Servlet dependency code-->
<mms-main.classes>../rm-xsp-java/target/classes</mms-main.classes>
<mms-main.sources>../rm-xsp-java/src/main/java</mms-main.sources>
</properties>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>2.7.1</version>
<configuration>
<systemPropertyVariables>
<jacoco-agent.destfile>${basedir}/target/coverage-reports/jacoco-it.exec</jacoco-agent.destfile>
</systemPropertyVariables>
<parallel>methods</parallel>
<threadCount>5</threadCount>
</configuration>
<executions>
<execution>
<id>integration-test</id>
<goals>
<goal>integration-test</goal>
</goals>
</execution>
<execution>
<id>verify</id>
<goals>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.7.5.201505241946</version>
<executions>
<!-- prepare agent for measuring integration tests -->
<execution>
<id>prepare-integration-tests</id>
<phase>pre-integration-test</phase>
<goals>
<goal>prepare-agent</goal>
</goals>
<configuration>
<destFile>${basedir}/target/coverage-reports/jacoco-it.exec</destFile>
<propertyName>failsafeArgLine</propertyName>
</configuration>
</execution>
<execution>
<id>default-instrument</id>
<goals>
<goal>instrument</goal>
</goals>
</execution>
<execution>
<id>default-restore-instrumented-classes</id>
<phase>post-integration-test</phase>
<goals>
<goal>restore-instrumented-classes</goal>
</goals>
</execution>
<execution>
<id>default-report</id>
<phase>verify</phase>
<goals>
<goal>report</goal>
</goals>
<configuration>
<dataFile>${basedir}/target/coverage-reports/jacoco-it.exec</dataFile>
</configuration>
</execution>
<execution>
<id>default-report-integration</id>
<goals>
<goal>report-integration</goal>
</goals>
<configuration>
<dataFile>${basedir}/target/coverage-reports/jacoco-it.exec</dataFile>
</configuration>
</execution>
</executions>
</plugin>
<profiles>
<profile>
<id>one</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.7</version>
<executions>
<execution>
<id>post-test-report</id>
<phase>verify</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<target>
<taskdef name="report" classname="org.jacoco.ant.ReportTask">
<classpath path="${basedir}/target/jacoco-jars/org.jacoco.ant.jar"/>
</taskdef>
<mkdir dir="${basedir}/target/coverage-report"/>
<report>
<executiondata>
<fileset dir="${build.directory}">
<include name="jacoco.exec"/>
</fileset>
</executiondata>
<structure name="Integration Test Coverage Project">
<group name="Server">
<classfiles>
<fileset dir="${server.classes}"/>
<fileset dir="${mms-main.classes}"/>
</classfiles>
<sourcefiles encoding="UTF-8">
<fileset dir="${server.sources}"/>
<fileset dir="${mms-main.sources}"/>
</sourcefiles>
</group>
</structure>
<html destdir="${basedir}/target/coverage-report/html"/>
<xml destfile="${basedir}/target/coverage-report/coverage-report.xml"/>
<csv destfile="${basedir}/target/coverage-report/coverage-report.csv"/>
</report>
</target>
</configuration>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.jacoco</groupId>
<artifactId>org.jacoco.ant</artifactId>
<version>0.8.0</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</profile>
</profiles>
我看到该coverage-report
文件夹是使用目标下的文件夹创建的html
,其中包含报告。但是没有一个java类文件有任何覆盖。参考以下:
我的输出如下:
> [INFO] ---
> jacoco-maven-plugin:0.7.5.201505241946:restore-instrumented-classes
> (default-restore-instrumented-classes) @ autoTestEnv ---
> [INFO]
> [INFO] --- maven-failsafe-plugin:2.7.1:verify (verify) @ autoTestEnv
> --- [INFO] Failsafe report directory: C:\Users\workspace\autoTestEnv\target\failsafe-reports
> [INFO]
> --- jacoco-maven-plugin:0.7.5.201505241946:report (default-report) @ autoTestEnv --- [INFO] Skipping JaCoCo execution due to missing
> execution data
> file:C:\Users\workspace\autoTestEnv\target\coverage-reports\jacoco-it.exec
> [INFO] [INFO] ---
> jacoco-maven-plugin:0.7.5.201505241946:report-integration
> (default-report-integration) @ autoTestEnv --- [INFO] Skipping JaCoCo
> execution due to missing execution data
> file:C:\Users\workspace\autoTestEnv\target\coverage-reports\jacoco-it.exec
> [INFO] [INFO] --- maven-antrun-plugin:1.7:run (post-test-report) @
> autoTestEnv --- [INFO] Executing tasks
>
> main:
> [mkdir] Created dir: C:\Users\workspace\autoTestEnv\target\coverage-report [report]
> Writing bundle 'Server' with 155 classes
似乎我错过了一些东西。我已经浏览了很多相同的帖子,但无法找出解决方案。
任何指示或建议都将受到高度赞赏。
解决方案
推荐阅读
- python - 如何获取网页中的编码数字?
- typescript - tsc 编译使用文件扩展名导入的打字稿
- gradle - 如何使 Gson 在 Flutter 插件的 Android 原生部分可用?
- google-apps-script - 日期戳脚本不适用于 arrayformula
- django - Django:获取查询集对象的一日活动
- python-3.x - 如何在 Python 中使用 Heroku 环境变量?
- apache-spark - Spark - 在保存到配置单元表(ORC)时获取计数
- c++ - 无法通过循环更新数据
- javascript - 如何停止在 MySQL 中舍入 int 值
- kubernetes - kubectl deployment.yaml 权限被拒绝