这篇博客文章描述了咱们如何使用JaCoCo Maven插件为单元和集成测试建立代码覆盖率报告。java
咱们的构建要求以下:apache
运行测试时,咱们的构建必须为单元测试和集成测试建立代码覆盖率报告。 代码覆盖率报告必须在单独的目录中建立。换句话说,必须将用于单元测试的代码覆盖率报告建立到与用于集成测试的代码覆盖率报告不一样的目录中。 让咱们开始吧。编程
咱们使用JaCoCo Maven插件有两个目的:安全
将JaCoCo Maven插件添加到咱们的POM文件的插件部分。框架
经过将如下插件声明添加到其“ 插件”部分,咱们能够将JaCoCo Maven插件添加到咱们的POM文件中:maven
<plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.6.3.201306030806</version> </plugin>
咱们能够经过将两个执行添加到插件声明中来为单元测试配置代码覆盖率报告。这些执行方式以下所述:post
咱们的插件配置的相关部分以下所示:性能
<plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.6.3.201306030806</version> <executions> <!-- Prepares the property pointing to the JaCoCo runtime agent which is passed as VM argument when Maven the Surefire plugin is executed. --> <execution> <id>pre-unit-test</id> <goals> <goal>prepare-agent</goal> </goals> <configuration> <!-- Sets the path to the file which contains the execution data. --> <destFile>${project.build.directory}/coverage-reports/jacoco-ut.exec</destFile> <!-- Sets the name of the property containing the settings for JaCoCo runtime agent. --> <propertyName>surefireArgLine</propertyName> </configuration> </execution> <!-- Ensures that the code coverage report for unit tests is created after unit tests have been run. --> <execution> <id>post-unit-test</id> <phase>test</phase> <goals> <goal>report</goal> </goals> <configuration> <!-- Sets the path to the file which contains the execution data. --> <dataFile>${project.build.directory}/coverage-reports/jacoco-ut.exec</dataFile> <!-- Sets the output directory for the code coverage report. --> <outputDirectory>${project.reporting.outputDirectory}/jacoco-ut</outputDirectory> </configuration> </execution> </executions> </plugin>
让咱们找出如何为集成测试配置代码覆盖率报告。单元测试
咱们能够经过在插件声明中添加两个执行来为集成测试配置代码覆盖率报告。这些执行方式以下所述:测试
咱们的插件配置的相关部分以下所示:
<plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.6.3.201306030806</version> <executions> <!-- The Executions required by unit tests are omitted. --> <!-- Prepares the property pointing to the JaCoCo runtime agent which is passed as VM argument when Maven the Failsafe plugin is executed. --> <execution> <id>pre-integration-test</id> <phase>pre-integration-test</phase> <goals> <goal>prepare-agent</goal> </goals> <configuration> <!-- Sets the path to the file which contains the execution data. --> <destFile>${project.build.directory}/coverage-reports/jacoco-it.exec</destFile> <!-- Sets the name of the property containing the settings for JaCoCo runtime agent. --> <propertyName>failsafeArgLine</propertyName> </configuration> </execution> <!-- Ensures that the code coverage report for integration tests after integration tests have been run. --> <execution> <id>post-integration-test</id> <phase>post-integration-test</phase> <goals> <goal>report</goal> </goals> <configuration> <!-- Sets the path to the file which contains the execution data. --> <dataFile>${project.build.directory}/coverage-reports/jacoco-it.exec</dataFile> <!-- Sets the output directory for the code coverage report. --> <outputDirectory>${project.reporting.outputDirectory}/jacoco-it</outputDirectory> </configuration> </execution> </executions> </plugin>
如今,咱们已经配置了JaCoCo Maven插件。下一步是配置Maven Surefire插件。让咱们找出如何作到这一点。
咱们使用Maven Surefire插件运行示例应用程序的单元测试。由于咱们要为单元测试创建代码覆盖率报告,因此咱们必须确保在运行单元测试时JaCoCo代理正在运行。咱们能够经过添加的价值保证本surefireArgLine财产做为价值argLine配置参数。
Maven Surefire插件的配置以下所示(突出显示了所需的更改):
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.15</version> <configuration> <!-- Sets the VM argument line used when unit tests are run. --> <argLine>${surefireArgLine}</argLine> <!-- Skips unit tests if the value of skip.unit.tests property is true --> <skipTests>${skip.unit.tests}</skipTests> <!-- Excludes integration tests when unit tests are run. --> <excludes> <exclude>**/IT*.java</exclude> </excludes> </configuration> </plugin>
咱们快完成了。剩下要作的就是配置Maven Failsafe插件。让咱们找出如何作到这一点。
咱们的示例应用程序的集成测试由Maven Failsafe插件运行。由于咱们要为集成测试建立代码覆盖率报告,因此咱们必须确保在运行集成测试时JaCoCo代理正在运行。咱们能够经过将failsafeArgLine属性的值添加为argLine配置参数的值来实现。
Maven Failsafe插件的配置以下所示(突出显示了所需的更改):
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-failsafe-plugin</artifactId> <version>2.15</version> <executions> <!-- Ensures that both integration-test and verify goals of the Failsafe Maven plugin are executed. --> <execution> <id>integration-tests</id> <goals> <goal>integration-test</goal> <goal>verify</goal> </goals> <configuration> <!-- Sets the VM argument line used when integration tests are run. --> <argLine>${failsafeArgLine}</argLine> <!-- Skips integration tests if the value of skip.integration.tests property is true --> <skipTests>${skip.integration.tests}</skipTests> </configuration> </execution> </executions> </plugin>
如今,咱们已成功完成所需的配置。让咱们看看如何为单元测试和集成测试建立代码覆盖率报告。
此博客文章的示例应用程序具备三个构建配置文件,下面对此进行了描述:
在开发配置文件开发过程当中使用,这是咱们构建的默认配置文件。当此配置文件处于活动状态时,仅运行单元测试。
在集成测试配置文件用于运行集成测试。
在全部的测试配置文件用于为运行单元测试和集成测试。 咱们能够经过在命令提示符处运行如下命令来建立不一样的代码覆盖率报告:
命令mvn clean test运行单元测试,并为目录target / site / jacoco-ut建立单元测试的代码覆盖率报告。
命令mvn clean verify -P integration-test运行集成测试,并为目录target / site / jacoco-it建立用于集成测试的代码覆盖率报告。
命令mvn clean verify -P all-tests运行单元测试和集成测试,并为单元测试和集成测试建立代码覆盖率报告。