从SonarQube6.2
开始,测试报告不再在这些类别中分开。SonarQube
将所有测试报告合并为一份涵盖整体的测试报告。因此,如果在Maven
项目中将单元测试(由Maven Surefire
插件运行)和集成测试(由Maven Failsafe
插件运行)分开进行测试,那么如何配置JaCoCo Maven
插件呢?
在以下各节中,提出了满足以下条件的解决方案:
- 构建工具:Maven。
- 该项目可以是多模块项目。
- 单元测试和集成测试是每个模块的一部分。
- 测试覆盖率是通过
JaCoCo Maven
插件来衡量的。
首先显示了Maven
项目结构,用于单元测试和集成测试的分离。然后显示了Maven
项目配置,其中包含单独的单元测试运行和集成测试运行。之后,我们来看看Maven
项目配置以生成涵盖单元测试和集成测试的测试报告。最后,SonarQube
的仪表板中显示了SonarQube
的配置,用于测试报告的可视化查看。
Maven项目结构
首先,我们看一下默认的Maven
项目结构在单个模块项目中的样子。
FunTester-app
├── pom.xml
├── src
│ ├── main
│ │ └── java
│ └── test
│ └── java
目录src/main/java
包含生产源代码,目录src/test/java
包含测试源代码。我们可以将单元测试和集成测试放到这个目录中。但是我们想将这两种类型的测试放在单独的目录中。因此,我们添加了一个名为src/it/java
的新目录。然后将单元测试放在src/test/java
目录中,并将集成测试放在src/it/java
目录中,因此新的项目结构如下图所示。
FunTester-app
├── pom.xml
├── src
│ ├── it
│ │ └── java
│ ├── main
│ │ └── java
│ └── test
│ └── java
单元和集成测试运行
幸运的是,单元测试运行配置是Maven
默认项目配置的一部分。如果满足以下条件,Maven
将自动运行这些测试:
- 测试位于目录
src/test/java
和 - 测试类名称以
Test
开头或以Test
或TestCase
结尾。
在Maven
的构建生命周期阶段测试中运行这些测试。
集成测试运行配置必须手动完成,也有Maven
插件提供方便。前提是满足以下条件:
- 集成测试存储在目录
src/it/java
和 - 集成测试类名称要么以
IT
开头,要么以IT
或ITCase
结尾, - 集成测试在
Maven
的构建生命周期阶段进行集成测试。
首先,必须在其测试类路径中包含目录src/it/java
。在这里用BuildHelperMaven
插件。它将目录src/it/java
添加到测试类路径。
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<goals>
<goal>add-test-source</goal>
<goal>add-test-resource</goal>
</goals>
<configuration>
<sources>
<source>src/it/java</source>
</sources>
<resources>
<resource>
<directory>src/it/resources</directory>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
上面的代码段必须插入到项目根pom
中的<project><build><plugins>
部分。
Maven
的构建生命周期包含一个称为集成测试的阶段。在此阶段,我们要运行集成测试。幸运的是,当在POM
中设置Maven
安全插件的目标集成测试时,会自动绑定到此阶段。如果希望在集成测试失败时取消构建,那么还必须将目标验证添加到POM
中:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>3.0.0-M4</version>
<configuration>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
<executions>
<execution>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>
同样,以上代码片段也必须插入到项目根pom
中的<project><build><plugins>
部分。然后,当Maven
安全插件的类名称以IT
开头或以IT
或ITCase
结尾时,它们会自动运行集成测试。
测试报告生成
使用JaCoCo Maven
插件生成测试报告,它应该为单元测试和集成测试共同生成测试报告。因此,该插件必须要准备两个分开的代理,然后他们在测试运行期间生成报告。当JaCoCo
的目标prepare-agent
和在POM
中设置了prepare-agent-integration
。JaCoCo
还必须创建一个报告,以便SonarQube
可以读取报告以进行可视化。因此,我们必须在POM
中添加目标报告和报告集成:
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.5</version>
<executions>
<execution>
<goals>
<goal>prepare-agent</goal>
<goal>prepare-agent-integration</goal>
<goal>report</goal>
<goal>report-integration</goal>
</goals>
</execution>
</executions>
</plugin>
同样,它也必须添加在<project><build><plugins>
中。
SonarQube测试报告可视化
现在,我们想在SonarQube
中可视化我们的测试报告。成功构建后,我们必须在我们的项目中运行SonarMaven3
插件(命令mvn sonar:sonar
)。因此Sonar Maven
插件知道将报告存放到哪里,我们必须在〜/.m2/setting.xml
中配置SonarQube
信息:
<profile>
<id>sonar</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<sonar.host.url>http://localhost:8080</sonar.host.url>
</properties>
</profile>
在SonarQube
仪表板中打开项目时,我们会看到总体测试覆盖率报告。