当前位置: 首页 > 知识库问答 >
问题:

为单元和集成测试生成声纳覆盖报告

景温书
2023-03-14

我已经看了一段时间关于stackoverflow的不同文章和答案,但我还没有找到适合我的情况的有效解决方案。我对jacoco、maven和sonar如何一起创建报告的理解肯定有问题,所以我要寻求帮助。

我有一个多模块maven项目,其结构如下(稍微简化了一下):

root-folder/
├── module1/
│   ├── module1_1/
│   ├── module2_2/
├── module2/
│   ├── module2_1/
│   └── module2_2/
├── module3/
│   ├── module3_1/
│       ├── module3_1_1/
│   └── module3_2/
│   └── module3_3/
│   └── module3_4/
├── parent/
├── itest/
│   ├── itest_helper1/
│   └── itest_helper2/
│   └── actual_tests/
├── module4/

请允许我扩展一下。父模块只是一个带有整个依赖项及其版本的pom。这个pom被用作level1的每一个其他模块的父模块(直接位于根下面)。例如,模块3_1_1具有父模块3_1/pom,其又具有父模块/pom。我还有一个特性模块,我排除了它,因为它用于向其他项目公开模块,这在我的情况下没有用。

大多数模块,但不是所有模块,都有使用junit框架的单元测试。集成测试在一个单独的模块中,该模块有几个helper子模块和一个带有实际ITests类的子模块。我的itests覆盖了整个项目的代码,所以它们测试所有其他模块的代码

我的根pom也有一些内部框架作为父框架,基本上是一个osgi容器、web服务和处理第三方依赖关系。

 <!-- properties section-->
  <properties>
        <jacoco.version>0.7.2.201409121644</jacoco.version>
        <sonar.language>java</sonar.language>
        <sonar.sourceEncoding>UTF-8</sonar.sourceEncoding>
        <sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
        <jacoco.outputDir>${project.build.directory}</jacoco.outputDir>
        <jacoco.out.ut.file>jacoco-ut.exec</jacoco.out.ut.file>
        <sonar.jacoco.reportPath>${jacoco.outputDir}/${jacoco.out.ut.file}</sonar.jacoco.reportPath>
        <jacoco.out.it.file>jacoco-it.exec</jacoco.out.it.file>
        <sonar.jacoco.itReportPath>${jacoco.outputDir}/${jacoco.out.it.file}</sonar.jacoco.itReportPath>
    </properties>

<!-- plugins section-->
<profiles>
        <profile>
            <id>coverage</id>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-surefire-plugin</artifactId>
                        <configuration>
                            <argLine>${jacoco.agent.ut.arg}</argLine>
                            <!-- test failure ignore -->
                            <testFailureIgnore>true</testFailureIgnore>
                            <includes>
                                <include>**/*Test*</include>
                            </includes>
                        </configuration>
                    </plugin>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-failsafe-plugin</artifactId>
                        <configuration>
                            <argLine>-Xmx1024m -XX:MaxPermSize=256m ${jacoco.agent.it.arg}
                            </argLine>
                            <!-- Let's put failsafe reports with surefire to have access to tests
                                failures/success reports in sonar -->
                            <reportsDirectory>${project.build.directory}/surefire-reports
                            </reportsDirectory>
                            <includes>
                                <include>**/*IT*</include>
                            </includes>
                        </configuration>
                    </plugin>
                    <plugin>
                        <groupId>org.jacoco</groupId>
                        <artifactId>jacoco-maven-plugin</artifactId>
                        <version>${jacoco.version}</version>
                        <executions>
                            <!-- Prepares a variable, jacoco.agent.ut.arg, that contains the info
                                to be passed to the JVM hosting the code being tested. -->
                            <execution>
                                <id>prepare-ut-agent</id>
                                <phase>process-test-classes</phase>
                                <goals>
                                    <goal>prepare-agent</goal>
                                </goals>
                                <configuration>
                                    <destFile>${sonar.jacoco.reportPath}</destFile>
                                    <propertyName>jacoco.agent.ut.arg</propertyName>
                                    <append>true</append>
                                </configuration>
                            </execution>
                            <!-- Prepares a variable, jacoco.agent.it.arg, that contains the info
                                to be passed to the JVM hosting the code being tested. -->
                            <execution>
                                <id>prepare-it-agent</id>
                                <phase>pre-integration-test</phase>
                                <goals>
                                    <goal>prepare-agent</goal>
                                </goals>
                                <configuration>
                                    <destFile>${sonar.jacoco.itReportPath}</destFile>
                                    <propertyName>jacoco.agent.it.arg</propertyName>
                                    <append>true</append>
                                </configuration>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>
        <!-- Integraton tests -->
        <profile>
            <id>run-its</id>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-failsafe-plugin</artifactId>
                        <executions>
                            <execution>
                                <id>integration-test</id>
                                <phase>integration-test</phase>
                                <goals>
                                    <goal>integration-test</goal>
                                </goals>
                            </execution>
                            <execution>
                                <id>verify</id>
                                <phase>verify</phase>
                                <goals>
                                    <goal>verify</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>

我运行我的项目与MVN-pcoverage,run-its clean install sonar:sonar。我的单元测试似乎还可以,复盖率和成功率都很高。老实说,我只对集成测试感兴趣,但是单元测试很容易设置,所以我也添加了它们。对于我的集成测试报告,它实际上报告了我的itest模块的覆盖率,这是唯一不应该报告的模块。我想让我的itests报告我整个项目的报道。

这是从声纳运行在我的itest模块上的jacoco部分:

    [WARNING] You are not using the latest JaCoCo binary format version, please     consider upgrading to latest JaCoCo version.
[INFO] Analysing  D:\Home\project\root\itest\testcase\target\jacoco-it.exec
[WARNING] You are not using the latest JaCoCo binary format version, please consider upgrading to latest JaCoCo version.
[INFO] Analysing D:\Home\project\root\itest\testcase\target\sonar\jacoco-overall.exec
[INFO] No information about coverage per test.

另外,由于我的插件配置是在根pom中,它试图分析我所有模块的报告(包括那些没有单元测试的模块),并在sonar运行日志中抛出一个错误,但我认为这不是一个问题。任何帮助都是非常感谢的,请询问更多的细节,如果你需要他们。谢了。

共有1个答案

史磊
2023-03-14

使用以下配置文件作为起点,运行mvn sonar:sonar与-dsonar.jacoco.itReportPath和-dsonar.jacoco.reportPath指向报表路径。

     <profile>
        <id>coverage</id>
        <properties>
            <jacoco.includes>com.trmsys.*</jacoco.includes>
            <jacoco.agent.jar>${project.build.directory}/org.jacoco.agent-${jacoco-maven-plugin.version}-runtime.jar
            </jacoco.agent.jar>
            <sonar.core.codeCoveragePlugin>jacoco</sonar.core.codeCoveragePlugin>
            <sonar.jacoco.reportPath>${session.executionRootDirectory}/target/jacoco.exec</sonar.jacoco.reportPath>
            <sonar.jacoco.itReportPath>${session.executionRootDirectory}/target/jacoco-it.exec</sonar.jacoco.itReportPath>
        </properties>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.jacoco</groupId>
                    <artifactId>jacoco-maven-plugin</artifactId>
                    <executions>
                        <execution>
                            <id>prepare-agent</id>
                            <goals>
                                <goal>prepare-agent</goal>
                            </goals>
                            <configuration>
                                <destFile>${sonar.jacoco.reportPath}</destFile>
                                <propertyName>jacoco.agent.arg</propertyName>
                                <includes>
                                    <include>${jacoco.includes}</include>
                                </includes>
                                <append>true</append>
                            </configuration>
                        </execution>
                        <execution>
                            <id>prepare-agent-integration</id>
                            <goals>
                                <goal>prepare-agent-integration</goal>
                            </goals>
                            <phase>initialize</phase>
                            <configuration>
                                <destFile>${sonar.jacoco.itReportPath}</destFile>
                                <propertyName>jacoco.agent.it.arg</propertyName>
                                <includes>
                                    <include>${jacoco.includes}</include>
                                </includes>
                                <append>true</append>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
            <pluginManagement>
                <plugins>
                    <!-- links jacoco agent to surefire for unit tests -->
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-surefire-plugin</artifactId>
                        <configuration>
                            <argLine>${jacoco.agent.arg}</argLine>
                        </configuration>
                    </plugin>
                    <!-- links jacoco agent to failsafe for integration tests -->
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-failsafe-plugin</artifactId>
                        <configuration>
                            <argLine>${jacoco.agent.it.arg}</argLine>
                        </configuration>
                    </plugin>
                </plugins>
            </pluginManagement>
        </build>
    </profile>
 类似资料:
  • xccov工具仅为覆盖的代码行生成单元测试覆盖率报告。如果你举个例子。swift文件有20行,10行由单元测试覆盖,覆盖率为50%。 Karma(用于Angular 2开发)不仅为所涵盖的代码行创建报告,还为语句、分支和函数创建报告。 是否可以配置xccov,或者在iOS开发中是否有类似的工具来实现这一点?谢谢

  • 有人知道是否有可能(以及如何)在Postman集成测试执行中生成代码覆盖率吗? 我们有基于Postman的集成测试,并通过Windows shell命令在Jenkins上执行。令人沮丧的是,我们不知道如何生成代码覆盖报告并将其发布到SonarQube中。 提前万分感谢!

  • 我使用plugin scala为我的scala项目生成测试覆盖率报告。但是,我无法组合单元测试和集成测试的测试报告。 以下是我运行的命令 在上面的例子中,我只得到集成测试的覆盖率报告。 问题 如何生成一个报告来汇总单元测试和集成测试的结果 提前谢谢。

  • 我正在为一个项目编写集成测试,在这个项目中,我正在进行HTTP调用,并测试它们是否成功。 因为我没有导入任何模块,也没有直接调用函数coverage.py报告为0%。 我想知道如何为此类集成HTTP请求测试生成覆盖率报告?

  • 我需要在azure build pipeline中生成Asp.net单元测试的代码覆盖率报告的指导。我的项目是基于。Net框架4.6。 我能够使用“visual studio test”任务运行所有单元测试。 我尝试了"报告生成器"任务,但它需要cobertura或Jacoco etc xml文件,这些文件无法在构建管道中生成。 期望 -我想获得已运行单元测试的代码覆盖率报告,该报告将显示完整的信

  • 我一直在尝试在JBoss服务器中实现JaCoCo离线代码覆盖,使用仪表化的EAR进行部署和jacococagent.jar,以便跟踪针对所述JBoss运行的外部集成测试的代码覆盖。 我一直在关注这样的指南: http://www.eclemma.org/jacoco/trunk/doc/offline.html http://automationrhapsody.com/code-coverage