问题背景:
maven项目代码是groovy语言,测试代码是java语言的testng框架,执行测试用例后sonar一直没有覆盖率和单元测试结果的显示,
问题根源:
(1)没有覆盖率,是pom没有配置groovy编译器插件(gmaven-plugin),导致groovy源码没有编译生成class文件
(2)没有单元测试结果,是因为设置了sonar.language=grvy,导致只分析groovy语言,测试class(测试代码是java代码)没有加载上来。这一个设置去掉的话,默认就会触发多语言分析的动作
sonar配置详情:
1.具体配置可参考sonar官方文档中 “Steps to Analyze a Groovy Project”这一部分
https://github.com/SonarQubeCommunity/sonar-groovy#notes
2.注意事项:
sonar.groovy.binaries
这一项不要忘记配置
3.sonar-project.properties 样例
# must be unique in a given SonarQube instance
sonar.projectKey=interface-mobile
# this is the name and version displayed in the SonarQube UI. Was mandatory prior to SonarQube 6.1.
sonar.projectName=interface-mobile
sonar.projectVersion=1.0
# Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows.
# Since SonarQube 4.2, this property is optional if sonar.modules is set.
# If not set, SonarQube starts looking for source code from the directory containing
# the sonar-project.properties file.
#sonar.language=grvy java
sonar.sources=src/main/groovy
sonar.tests=src/test/java
sonar.junit.reportsPath=target/surefire-reports/
#sonar.jacoco.reportPath=target/jacoco.exec
#sonar.jacoco.itReportPath=target/jacoco-it.exec
sonar.tests.binaries=target/test-classes
#sonar.java.libraries=target/lib
sonar.groovy.binaries=target/classes
sonar.groovy.jacoco.reportPath=target/jacoco.exec
sonar.groovy.jacoco.itReportPath=target/jacoco-it.exec
sonar.jacoco.reportMissing.force.zero=true
sonar.java.coveragePlugin=jacoco
# Encoding of the source code. Default is default system encoding
sonar.sourceEncoding=UTF-8
sonar.verbose=true
sonar.dynamicAnalysis=reuseReports
4.pom文件样例
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.demo</groupId>
<artifactId>groovy-demo</artifactId>
<name>groovy-demo</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<skip.unit.tests>false</skip.unit.tests>
<skip.integration.tests>false</skip.integration.tests>
<jacoco.version>0.7.6.201602180812</jacoco.version>
</properties>
<dependencies>
<!-- 解析框架项目 -->
<dependency>
<groupId>com.demo</groupId>
<artifactId>groovy-demo</artifactId>
<version>V1.2.48R170120-SNAPSHOT</version>
</dependency>
<!-- groovy运行时 -->
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>2.4.0</version>
</dependency>
<!-- 测试覆盖率 -->
<dependency>
<groupId>org.jacoco</groupId>
<artifactId>org.jacoco.core</artifactId>
<version>${jacoco.version}</version>
</dependency>
</dependencies>
<!-- 代码质量辅助 -->
<reporting>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>findbugs-maven-plugin</artifactId>
<version>3.0.0</version>
</plugin>
</plugins>
</reporting>
<build>
<finalName>interface</finalName>
<defaultGoal>compile</defaultGoal>
<plugins>
<!-- 编译设置插件 -->
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
<compilerArguments>
<extdirs>src/main/webapp/WEB-INF/lib</extdirs>
</compilerArguments>
</configuration>
</plugin>
<!-- 依赖管理插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.8</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<!-- 将所有依赖的jar都拷贝出来 -->
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
<!-- 打包设置插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<!-- 往Manifest.MF文件中添加ClassPath -->
<addClasspath>true</addClasspath>
<!-- classpath前缀 -->
<classpathPrefix>lib/</classpathPrefix>
<!-- 主程序入口 -->
<mainClass>com.infomorrow.launcher.Launcher</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<!-- 单元测试插件 -->
<plugin>
<groupId>org.codehaus.gmaven</groupId>
<artifactId>gmaven-plugin</artifactId>
<version>1.5</version>
<configuration>
<providerSelection>2.0</providerSelection>
</configuration>
<executions>
<execution>
<goals>
<goal>generateTestStubs</goal>
<goal>compile</goal>
<goal>generateTestStubs</goal>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>2.4.0</version>
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.15</version>
<configuration>
<argLine>${surefireArgLine}</argLine>
<skipTests>${skip.unit.tests}</skipTests>
<!-- <useFile>false</useFile>
<disableXmlReport>true</disableXmlReport>
<includes>
<include>**/*Test.*</include>
<include>**/*Suite.*</include>
</includes>
<excludes>
<exclude>**/parser_auto/*Test.*</exclude>
<exclude>**/parser_manual/*Test.*</exclude>
</excludes> -->
<testFailureIgnore>true</testFailureIgnore>
<suiteXmlFiles>
<suiteXmlFile>testng.xml</suiteXmlFile>
</suiteXmlFiles>
</configuration>
</plugin>
<!-- 代码分析插件 -->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>findbugs-maven-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<!--<threshold>High</threshold> -->
<effort>Default</effort>
<findbugsXmlOutput>true</findbugsXmlOutput>
<findbugsXmlOutputDirectory>target/findbugs</findbugsXmlOutputDirectory>
</configuration>
</plugin>
<!-- Groovy -->
<plugin>
<groupId>org.codehaus.groovy.maven</groupId>
<artifactId>gmaven-plugin</artifactId>
<version>1.0</version>
</plugin>
<!-- 增加版本号 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.5</version>
<configuration>
<archive>
<manifestEntries>
<Manifest-Version>${project.version}-SNAPSHOT</Manifest-Version>
<Archiver-Version>${project.version}-Release</Archiver-Version>
</manifestEntries>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>2.15</version>
<executions>
<execution>
<id>integration-tests</id>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
<configuration>
<argLine>${failsafeArgLine}</argLine>
<skipTests>${skip.integration.tests}</skipTests>
</configuration>
</execution>
</executions>
</plugin>
<!-- 测试覆盖率 -->
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.7.6.201602180812</version>
<executions>
<execution>
<id>default-prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
<configuration>
<destFile>${project.build.directory}/jacoco.exec</destFile>
<propertyName>surefireArgLine</propertyName>
</configuration>
</execution>
<execution>
<id>post-unit-test</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
<configuration>
<dataFile>${project.build.directory}/jacoco.exec</dataFile>
<outputDirectory>${project.reporting.outputDirectory}/jacoco</outputDirectory>
</configuration>
</execution>
<execution>
<id>pre-integration-test</id>
<phase>pre-integration-test</phase>
<goals>
<goal>prepare-agent</goal>
</goals>
<configuration>
<destFile>${project.build.directory}/jacoco-it.exec</destFile>
<propertyName>failsafeArgLine</propertyName>
</configuration>
</execution>
<execution>
<id>post-integration-test</id>
<phase>post-integration-test</phase>
<goals>
<goal>report</goal>
</goals>
<configuration>
<dataFile>${project.build.directory}/jacoco-it.exec</dataFile>
<outputDirectory>${project.reporting.outputDirectory}/jacoco-it</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
<!-- 资源配置 -->
<resources>
<!-- groovy插件 -->
<resource>
<directory>src/main/groovy</directory>
<targetPath>${project.build.directory}/src/main/groovy</targetPath>
<filtering>true</filtering>
</resource>
<!-- 配置文件 -->
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
<!-- 配置文件 -->
<resource>
<directory>src/main/resources</directory>
<targetPath>${project.build.directory}</targetPath>
<filtering>true</filtering>
</resource>
<!-- web静态资源 -->
<resource>
<directory>src/main/webapp</directory>
<targetPath>${project.build.directory}/src/main/webapp</targetPath>
<filtering>true</filtering>
</resource>
</resources>
</build>
<!-- groovy-demo 不会单独部署, 只配置测试环境 -->
<profiles>
<profile>
<id>uat</id>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
<build>
<filters>
<filter>src/main/resources/environment/uat.properties</filter>
</filters>
</build>
</profile>
<profile>
<id>uat2</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<build>
<filters>
<filter>src/main/resources/environment/uat2.properties</filter>
</filters>
</build>
</profile>
</profiles>
<version></version>
</project>