首页 > 解决方案 > 当单元测试覆盖率低于多模块项目中的预配置限制时,maven 构建失败

问题描述

当聚合的单元测试覆盖率低于 Maven 多模块项目中的预配置限制时,有人可以告诉我如何使构建失败?

例如,假设module1有 70% 的代码覆盖率,module2有 100% 的代码覆盖率,如果指定了 90% 的覆盖率,那么构建应该会失败,因为平均覆盖率为 85%。

我正在使用 jacoco 生成代码覆盖率以生成.exec包含覆盖率数据的聚合文件。但正如这里 jacoco:check所讨论的,仅在模块级别有效。

所以看起来像 jacoco 一个人无法完成我正在寻找的工作。有人可以让我知道我可以在聚合jacoco.exec文件上使用哪些其他工具来完成这项工作吗?

尝试的方法

正如我的@Karol 所建议的那样

我的项目结构如下

main
- module1
- module2

main.pom我添加了以下部分

<plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <version>0.7.5.201505241946</version>
              <executions>
                <execution>
                  <id>pre-unit-test</id>
                  <goals>
                      <goal>prepare-agent</goal>
                  </goals>
                  <configuration>
                    <destFile>${jacoco.ut.execution.data.file}</destFile>
                  </configuration>
                </execution>
                <execution>
                  <id>merge-execs</id>
                  <phase>pre-site</phase>
                  <inherited>false</inherited>
                  <goals>
                      <goal>merge</goal>
                  </goals>
                  <configuration>
                   <fileSets>
                     <fileSet>
                       <directory>${basedir}</directory>
                       <includes>
                         <include>**/target/*.exec</include>
                       </includes>
                     </fileSet>
                   </fileSets>
                    <destFile>${jacoco.ut.merged.exec}</destFile>
                  </configuration>
                </execution>
                  <execution>
                      <id>jacoco-check</id>
                      <phase>verify</phase>
                      <goals>
                          <goal>check</goal>
                      </goals>
                      <configuration>
                          <rules>
                              <rule>
                                  <element>BUNDLE</element>
                                  <limits>
                                      <limit>
                                          <counter>LINE</counter>
                                          <value>COVEREDRATIO</value>
                                          <minimum>0.80</minimum>
                                      </limit>
                                  </limits>
                              </rule>
                          </rules>
                          <dataFile>${jacoco.ut.merged.exec}</dataFile>
                      </configuration>
                  </execution>
             </executions>
         </plugin>

然后在这样做时,mvn pre-site我可以看到合并的 exec 文件正在创建,如下所示

[INFO] Loading execution data file /var/code/github/vnera/main/module1/target/jacoco.exec
[INFO] Loading execution data file /var/code/github/vnera/main/module2/target/jacoco.exec
[INFO] Writing merged execution data to /var/code/github/vnera/main/target/jacoco_vrni_main.exec

但是当我跑步时,mvn jacoco:check@jacoco-check我看到检查被以下消息跳过

[INFO] --- jacoco-maven-plugin:0.7.5.201505241946:check (jacoco-check) @ main ---
[INFO] Skipping JaCoCo execution due to missing classes directory:/var/code/github/vnera/main/target/classes

标签: javamavencode-coveragejacocojacoco-maven-plugin

解决方案


在构建中定义一个有jacoco:merge目标的步骤:

Mojo 用于将一组执行数据文件 (*.exec) 合并到一个文件中

然后通过使用目标属性jacoco:check指向这个合并的覆盖文件来应用它。<dataFile>


或者,您可以使用正确的 JaCoCo 多模块覆盖设置SonarQube并配置Quality Gates以确保最小的代码覆盖:

质量门是在您的组织中执行质量政策的最佳方式。它可以回答一个问题:我今天可以将我的项目交付生产吗?

为了回答这个问题,您需要根据衡量项目的衡量阈值定义一组布尔条件。例如:

  • 没有新的拦截器问题
  • 新代码的代码覆盖率超过 80%
  • 等等。

推荐阅读