标签: jacoco-maven-plugin

声纳上的多模块 Maven 项目代码覆盖问题

我有一个与 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 文件?

请帮忙。这对我来说真的是一个障碍。感谢您的所有投入。

code-coverage maven jacoco sonarqube jacoco-maven-plugin

5
推荐指数
1
解决办法
4902
查看次数

排除的类别仍计入总覆盖范围结果

我们最近已升级到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这些被排除的类在覆盖范围内应该被完全忽略。

maven jenkins jacoco sonarqube jacoco-maven-plugin

5
推荐指数
0
解决办法
574
查看次数

Jacoco-“原因:java.lang.ClassNotFoundException:org.jacoco.agent.rt.internal_6da5971.Offline”

尝试使用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)

maven maven-surefire-plugin jacoco jacoco-maven-plugin

5
推荐指数
2
解决办法
1万
查看次数

即使生成了代码覆盖率,声纳也不会获取单元测试结果

我在我的本地机器上运行 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)

maven jacoco sonarqube jacoco-maven-plugin

5
推荐指数
1
解决办法
2万
查看次数

如何从jacoco代码覆盖率中排除一行?

我如何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)

java jacoco jacoco-maven-plugin

5
推荐指数
2
解决办法
1190
查看次数

如何为JAR文件生成JaCoCo报告?

我们正在尝试使用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报告

根据日志,我们似乎正在执行代码。JaCoCo设置中缺少步骤还是应该起作用?

java code-coverage jacoco jacoco-maven-plugin

5
推荐指数
1
解决办法
1051
查看次数

如何合并 2 个 jacoco 覆盖率报告(.exec 文件),无论 Maven 生命周期如何

我的 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)

merge code-coverage maven jacoco jacoco-maven-plugin

5
推荐指数
1
解决办法
7213
查看次数

Sonar + Jacoco + Junit 5:没有关于每次测试覆盖率的信息

我正在尝试使用 Sonarqube 7 获得每个测试功能的覆盖率。

我正在使用 jacoco-maven-plugin 并且我的测试正在使用 JUnit 5 运行。

我成功地在 Sonarqube 仪表板上获得了全球覆盖,但我想通过能够查看哪些测试覆盖了我的课程的哪些行来更深入。

我在这里尝试了给定的配置但没有成功:我在日志中收到以下消息“没有关于每个测试覆盖率的信息”。我看到这可以通过添加一个 listener 来获得org.sonar.java.jacoco.JUnitListener,但它是一个 JUnit 4 监听器,所以我想它因此不起作用。

我如何才能使每个测试功能的 Coverage 与 JUnit 5 一起使用?

java test-coverage sonarqube jacoco-maven-plugin junit5

5
推荐指数
1
解决办法
2151
查看次数

使用Maven一起进行代码覆盖Kotlin和Java-Jacoco

我正在使用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代码生成覆盖率?

java maven jacoco kotlin jacoco-maven-plugin

5
推荐指数
1
解决办法
654
查看次数

Java.lang.IllegalStateException:无法解析 JaCoCo XML 报告:jacoco.exec

我正在尝试发布由 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)

java jacoco sonarqube jacoco-maven-plugin jacoco-plugin

5
推荐指数
1
解决办法
4167
查看次数