这里用到了3个插件,sonar-maven-plugin、jacoco-maven-plugin、maven-surefire-plugin,简单介绍一下功能:
sonar-maven-plugin:代码扫描、分析出不规代码,配合jacoco-maven-plugin可以显示出junit单元测试覆盖率。
jacoco-maven-plugin:统计junit单元测试覆盖率。
maven-surefire-plugin:可以配置运行哪些junit单元测试类。
这3个插件可以各自独立运行,实现自己的功能。现在配置一个项目的pom.xml文件,记录一下:
<profiles>
<profile>
<id>sonar</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<sonar.host.url>
http://localhost:9000
</sonar.host.url>
<!--
<sonar.inclusions>
src/main/java/com/sl/service/**,
src/main/java/com/xx/service/impl/**,
src/main/java/com/sl/controller/TestController.java,
src/main/java/com/sl/controller/ArticleController.java
</sonar.inclusions>
<sonar.exclusions>
src/main/java/com/xx/service/impl/TestServiceImpl3.java
</sonar.exclusions>
-->
</properties>
<build>
<plugins>
<plugin>
<groupId>org.sonarsource.scanner.maven</groupId>
<artifactId>sonar-maven-plugin</artifactId>
<version>3.2</version>
</plugin>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.1</version>
<executions>
<execution>
<id>prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>report</id>
<phase>prepare-package</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
<execution>
<id>post-unit-test</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
<configuration>
<dataFile>target/jacoco.exec</dataFile>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19</version>
<dependencies>
<dependency>
<groupId>org.apache.maven.surefire</groupId>
<artifactId>surefire-junit47</artifactId>
<version>2.19</version>
</dependency>
</dependencies>
<configuration>
<!--配置是否跳过测试用例执行-->
<skipTests>false</skipTests>
<includes>
<include>**/ArticleServiceImplTest.java</include>
</includes>
<excludes>
<exclude>**/ArticleControllerTest.java</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
说明:
1、如果不配置jacoco,则sonar的控制台显示的覆盖率是0。
2、sonar中配置的sonar.inclusions、sonar.exclusions是指定扫描的代码:
不影响单元测试和jacoco覆盖率(项目/target/site/jacoco/index.html里面依然显示全部的)。
影响sonar控制台的单元测试覆盖率 ,实际上是它指定扫描代码的单元测试覆盖率 ,没扫描到的不会统计。
3、surefire中skipTests为true时跳过单元测试。它里面的includes、excludes指定执行哪些单元测试,肯定影响sonar和jacoco的覆盖率。
4、说明一下命令
sonar首次安装插件,进入到项目跟目录执行:mvn org.sonarsource.scanner.maven:sonar-maven-plugin:3.2:sonar
运行sonar,不执行单元测试:mvn -U compile sonar:sonar -Denv=sonar -fail-never
运行sonar, 执行单元测试:mvn -U test sonar:sonar -Denv=sonar -fail-never
运行sonar, 执行单元测试:mvn org.sonarsource.scanner.maven:sonar-maven-plugin:3.2:sonar,同首次安装一样。
只运行junit单元测试或者同时统计jacoco覆盖率:mvn test