我有一个与 JaCoCo 和 SONAR 的多模块 maven 项目相关的问题。
我有一个父模块和 3 个子模块。
父 |-child1 - pom.xml |-child2 - pom.xml |-child3 - pom.xml |-pom.xml
我在父 pom.xml 中包含了 JaCoCo 插件。当我从父 pom.xml 运行 mvn clean install sonar:sonar build 时,我看到每个孩子都生成了自己的 jacoco.exec 文件。像这样的 child1/target/jacoco.exec, child2/target/jacoco.exec 等。但是,在父级别中没有生成 jacoco.exec 。
当我运行声纳分析时,我看到单元测试覆盖率在声纳仪表板上显示为 0.0%。
我的问题是
1. 我应该怎么做才能看到整个项目的单元测试覆盖率?
2. 为了显示一个单元测试覆盖率,SONAR 是从父级别还是从子级别选择 jacoco.exec 文件?
请帮忙。这对我来说真的是一个障碍。感谢您的所有投入。
我们最近已升级到SonarCube 4.3.2。在以前的版本中(不记得它是什么),可以选择Jacoco作为代码覆盖率分析器,并可以将Maven中的排除项定义为简单属性。
例如
<properties>
<sonar.jacoco.excludes>*/cache/*:*/*Application.java</sonar.jacoco.excludes>
</properties>
Run Code Online (Sandbox Code Playgroud)
在此版本的SonarCube中,不再存在选择Jacoco的选项,因此我试图以其他方式使其工作。关于这个主题的很多很多帖子,但是都没有解决我的问题。我设法排除了类,但这些类在SonarCube中显示为0%(并降低了总覆盖率)。通过上述财产排除似乎不再起作用。
在我的pom中,我添加了以下插件:
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.6.0.201210061924</version>
<configuration>
<excludes>
<exclude>**/SonarTest*</exclude>
</excludes>
</configuration>
<executions>
<execution>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>report</id>
<phase>prepare-package</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
配置似乎可以,因为在Jacoco报告中完全排除了该类。SonarTest已进行了部分测试,但使用此配置,Sonar在Sonar中显示为0%,因此似乎排除项在某种程度上起作用。我如何通知Sonar这些被排除的类在覆盖范围内应该被完全忽略。
尝试使用jacoco的脱机工具获取覆盖范围(由于powermock测试用例,无法使用即时检测工具),将jacocoagent.jar添加到surefire插件的classpath中,如下所示。将“ org.jacoco.agent-0.7.7.201606060606-runtime.jar”(从本地maven存储库中)重命名为“ jacocoagent.jar”,并将其保存在此pom.xml所在的文件夹中。即使将其添加到classpath之后也是如此。
pom.xml片段(surefire-插件配置)
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<forkmode>once</forkmode>
<additionalClasspathElements>
<additionalClasspathElement>jacocoagent.jar</additionalClasspathElement>
</additionalClasspathElements>
</configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)
在控制台上看到的异常:
#############
Number of foreign imports: 1
import: Entry[import from realm ClassRealm[maven.api, parent: null]]
-----------------------------------------------------
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:166)
... 21 more
Caused by: java.lang.NoClassDefFoundError: org/jacoco/agent/rt/internal_6da5971/Offline
at com.cisco.ise.ups.modelframework.hibernate.OracleNamingStrategy.$jacocoInit(OracleNamingStrategy.java)
at com.cisco.ise.ups.modelframework.hibernate.OracleNamingStrategy.<clinit>(OracleNamingStrategy.java)
at sun.misc.Unsafe.ensureClassInitialized(Native Method)
at sun.reflect.UnsafeFieldAccessorFactory.newFieldAccessor(UnsafeFieldAccessorFactory.java:43)
at sun.reflect.ReflectionFactory.newFieldAccessor(ReflectionFactory.java:142)
at java.lang.reflect.Field.acquireFieldAccessor(Field.java:1082)
at java.lang.reflect.Field.getFieldAccessor(Field.java:1063)
at java.lang.reflect.Field.get(Field.java:387)
at com.cisco.ise.ups.build.WorkflowRunnerMojo.namingStrategyInstance(WorkflowRunnerMojo.java:335)
at com.cisco.ise.ups.build.WorkflowRunnerMojo.setupWorkflowEnvironment(WorkflowRunnerMojo.java:514)
at com.cisco.ise.ups.build.WorkflowRunnerMojo.execute(WorkflowRunnerMojo.java:816)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134)
... 21 more
Caused by: java.lang.ClassNotFoundException: org.jacoco.agent.rt.internal_6da5971.Offline
at org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy.loadClass(SelfFirstStrategy.java:50)
at org.codehaus.plexus.classworlds.realm.ClassRealm.unsynchronizedLoadClass(ClassRealm.java:271)
at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:247)
at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:239)
... 33 …Run Code Online (Sandbox Code Playgroud) 我在我的本地机器上运行 SonarQuebe 6.2,我有 Spring Boot Java 8 项目和编写的单元测试,我想上传到 Sonar 进行静态分析和代码覆盖。
生成代码覆盖率 - 我有我的 JaCoCo HTML 报告,生成了 JUnit XML 测试文件,但我的声纳似乎错过了单元测试结果,甚至认为代码覆盖率已显示:
pom.xml:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>1.6.6</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>1.6.6</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.facebook4j</groupId>
<artifactId>facebook4j-core</artifactId>
<version>2.4.8</version>
</dependency>
<dependency>
<groupId>net.sf.dozer</groupId>
<artifactId>dozer</artifactId>
<version>5.5.1</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-java8</artifactId>
</dependency>
<dependency> …Run Code Online (Sandbox Code Playgroud) 我如何inputStream.close()从pom.xml或Java代码中的jacoco代码覆盖率中排除?
public void run() {
InputStream inputStream = null;
try {
inputStream = fileSystem.newFileInputStream(file);
}
finally {
if(inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {}
}
}
}
Run Code Online (Sandbox Code Playgroud) 我们正在尝试使用JaCoCo报告针对预打包JAR文件的测试代码覆盖率。为此,我们使用java -jar附加参数启动JAR文件:
-javaagent:${project.basedir}/tools/jacocoagent.jar=output=tcpserver,port=${jacoco.port}
Run Code Online (Sandbox Code Playgroud)
JaCoCo的Maven插件配置为转储执行文件并报告结果:
-javaagent:${project.basedir}/tools/jacocoagent.jar=output=tcpserver,port=${jacoco.port}
Run Code Online (Sandbox Code Playgroud)
这样做的目的jacoco.exec是生成一个非零大小(〜350kB)的文件。
但是该报告没有显示任何内容。通过“会话”链接,我可以看到列出的JAR中的类,但是报告的主页显示了这一点:

根据日志,我们似乎正在执行代码。JaCoCo设置中缺少步骤还是应该起作用?
我的 pom 中有一个 jacoco 插件来获取 junit 测试覆盖率,并且我正在从不同的服务器转储另一个报告。如何合并这 2 个 jacoco 覆盖率报告(.exec 文件),无论 Maven 生命周期如何。
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.7.6.201602180812</version>
<executions>
<execution>
<goals>
<goal>prepare-agent</goal>
</goals>
<configuration>
<destFile>${project.build.directory}</destFile>
</configuration>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Sonarqube 7 获得每个测试功能的覆盖率。
我正在使用 jacoco-maven-plugin 并且我的测试正在使用 JUnit 5 运行。
我成功地在 Sonarqube 仪表板上获得了全球覆盖,但我想通过能够查看哪些测试覆盖了我的课程的哪些行来更深入。
我在这里尝试了给定的配置,但没有成功:我在日志中收到以下消息“没有关于每个测试的覆盖率的信息”。我看到这可以通过添加一个 listener 来获得org.sonar.java.jacoco.JUnitListener,但它是一个 JUnit 4 监听器,所以我想它因此不起作用。
我如何才能使每个测试功能的 Coverage 与 JUnit 5 一起使用?
我正在使用Maven插件通过Maven插件生成代码覆盖率,如下所示:
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>${jacoco.version}</version>
<executions>
<execution>
<id>pre-unit-test</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>post-unit-test</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
但这不包括项目中kotlin代码的任何代码覆盖率。我只介绍Java代码。
该项目的结构为:
/projectName
/src
/main
/java
/kotlin
pom.xml
Run Code Online (Sandbox Code Playgroud)
另外,在pom中,首先编译kotlin源(使用kotlin-maven-plugin),然后再编译Java源。
如何为Java和Kotlin代码生成覆盖率?
我正在尝试发布由 Jacoco 插件生成的覆盖率报告 - jacoco.exec。但是我得到了下面提到的声纳和 Jacoco 配置的异常。
SonarCube 版本6.7.7
[ERROR] Coverage report 'jacoco.exec' could not be read/imported. Error: {}
java.lang.IllegalStateException: Failed to parse JaCoCo XML report: jacoco.exec
at org.sonar.plugins.jacoco.XmlReportParser.parse(XmlReportParser.java:96)
at org.sonar.plugins.jacoco.JacocoSensor.importReport(JacocoSensor.java:73)
at org.sonar.plugins.jacoco.JacocoSensor.importReports(JacocoSensor.java:64)
at org.sonar.plugins.jacoco.JacocoSensor.execute(JacocoSensor.java:48)
at org.sonar.scanner.sensor.SensorWrapper.analyse(SensorWrapper.java:53)
at org.sonar.scanner.phases.SensorsExecutor.executeSensor(SensorsExecutor.java:88)
at org.sonar.scanner.phases.SensorsExecutor.execute(SensorsExecutor.java:82)
at org.sonar.scanner.phases.SensorsExecutor.execute(SensorsExecutor.java:68)
at org.sonar.scanner.phases.AbstractPhaseExecutor.execute(AbstractPhaseExecutor.java:88)
at org.sonar.scanner.scan.ModuleScanContainer.doAfterStart(ModuleScanContainer.java:177)
at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:135)
at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:121)
at org.sonar.scanner.scan.ProjectScanContainer.scan(ProjectScanContainer.java:291)
at org.sonar.scanner.scan.ProjectScanContainer.scanRecursively(ProjectScanContainer.java:286)
at org.sonar.scanner.scan.ProjectScanContainer.doAfterStart(ProjectScanContainer.java:264)
at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:135)
at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:121)
at org.sonar.scanner.task.ScanTask.execute(ScanTask.java:48)
at org.sonar.scanner.task.TaskContainer.doAfterStart(TaskContainer.java:84)
at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:135)
at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:121)
at org.sonar.scanner.bootstrap.GlobalContainer.executeTask(GlobalContainer.java:121)
at org.sonar.batch.bootstrapper.Batch.doExecuteTask(Batch.java:116)
at org.sonar.batch.bootstrapper.Batch.execute(Batch.java:71)
at org.sonarsource.scanner.api.internal.batch.BatchIsolatedLauncher.execute(BatchIsolatedLauncher.java:46)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native …Run Code Online (Sandbox Code Playgroud)