按 class 级别执行最低总 JUnit 覆盖率?
Enforce minimum total JUnit coverage by class level?
目前,我在模块级别强制执行最低 JUnit 总覆盖率。因此,如果总线路覆盖率低于某个值(在我的情况下为 80%),则构建失败。为此,我将 maven-surefire-plugin 与 maven-enforcer-plugin、JUnit 和 JMockit 一起使用。
pom 文件部分如下所示。
<build>
<plugins>
....
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.18.1</version>
<dependencies>
<dependency>
<groupId>org.apache.maven.surefire</groupId>
<artifactId>surefire-junit4</artifactId>
<version>2.18.1</version>
</dependency>
</dependencies>
<configuration>
<systemPropertyVariables>
<coverage-outputDir>${basedir}/target/coverageReport</coverage-outputDir>
<coverage-output>html,merge</coverage-output>
<coverage-check>80</coverage-check>
</systemPropertyVariables>
</configuration>
</plugin>
<plugin>
<artifactId>maven-enforcer-plugin</artifactId>
<executions>
<execution>
<id>coverage.check</id>
<goals>
<goal>enforce</goal>
</goals>
<phase>test</phase>
<configuration>
<rules>
<requireFilesDontExist>
<files>
<file>coverage.check.failed</file>
</files>
</requireFilesDontExist>
</rules>
</configuration>
</execution>
</executions>
</plugin>
....
</build>
<dependencies>
....
<dependency>
<groupId>org.jmockit</groupId>
<artifactId>jmockit</artifactId>
<version>1.17</version>
</dependency>
<dependency>
<groupId>org.jmockit</groupId>
<artifactId>jmockit-coverage</artifactId>
<version>1.17</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
....
</dependencies>
我的问题是,有些 classes 的覆盖率可能远低于 80%,只要总覆盖率不低于 80%,构建仍然会通过。
那么,有什么方法可以让我的保险达到 class 水平吗?
给你一个自以为是的 non-answer:不要那样做。不要让您的构建因错过覆盖率数字而失败!
以下是支持这一点的理由:您正在尝试使用技术手段解决社会问题。
您真正的问题是:您想要达到一定的代码质量,并且您认为通过在人们不遵守时对其进行惩罚来实现这一目标。那不会真正起作用。人们迟早会开始绕过这个想法。他们会寻找 "just make the build" 快乐的捷径;忽略您通过要求合理的代码覆盖率来 提高 代码质量的想法。或者某个经理来找你,指出新的 feature/fix 现在比当前的覆盖目标更重要。
然后呢?暂时禁用检查?允许更低的数字?
当然,测量单元测试的覆盖率是一件好事。您应该经常这样做,并使您的开发人员可以轻松访问此信息(例如将其放在某些仪表板上)。要求您的开发团队致力于某些目标也是公平的。但是 强迫 一些覆盖范围的数字让每个人都难以接受……是行不通的。
(好吧:如果你在高class环境中工作,每个开发人员不仅接受你的想法但完全支持你;那么事情可能会有所不同。但如果你生活在这样的环境中,那么高覆盖率会自然而然地到来;无需强制执行。
目前,我在模块级别强制执行最低 JUnit 总覆盖率。因此,如果总线路覆盖率低于某个值(在我的情况下为 80%),则构建失败。为此,我将 maven-surefire-plugin 与 maven-enforcer-plugin、JUnit 和 JMockit 一起使用。 pom 文件部分如下所示。
<build>
<plugins>
....
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.18.1</version>
<dependencies>
<dependency>
<groupId>org.apache.maven.surefire</groupId>
<artifactId>surefire-junit4</artifactId>
<version>2.18.1</version>
</dependency>
</dependencies>
<configuration>
<systemPropertyVariables>
<coverage-outputDir>${basedir}/target/coverageReport</coverage-outputDir>
<coverage-output>html,merge</coverage-output>
<coverage-check>80</coverage-check>
</systemPropertyVariables>
</configuration>
</plugin>
<plugin>
<artifactId>maven-enforcer-plugin</artifactId>
<executions>
<execution>
<id>coverage.check</id>
<goals>
<goal>enforce</goal>
</goals>
<phase>test</phase>
<configuration>
<rules>
<requireFilesDontExist>
<files>
<file>coverage.check.failed</file>
</files>
</requireFilesDontExist>
</rules>
</configuration>
</execution>
</executions>
</plugin>
....
</build>
<dependencies>
....
<dependency>
<groupId>org.jmockit</groupId>
<artifactId>jmockit</artifactId>
<version>1.17</version>
</dependency>
<dependency>
<groupId>org.jmockit</groupId>
<artifactId>jmockit-coverage</artifactId>
<version>1.17</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
....
</dependencies>
我的问题是,有些 classes 的覆盖率可能远低于 80%,只要总覆盖率不低于 80%,构建仍然会通过。
那么,有什么方法可以让我的保险达到 class 水平吗?
给你一个自以为是的 non-answer:不要那样做。不要让您的构建因错过覆盖率数字而失败!
以下是支持这一点的理由:您正在尝试使用技术手段解决社会问题。
您真正的问题是:您想要达到一定的代码质量,并且您认为通过在人们不遵守时对其进行惩罚来实现这一目标。那不会真正起作用。人们迟早会开始绕过这个想法。他们会寻找 "just make the build" 快乐的捷径;忽略您通过要求合理的代码覆盖率来 提高 代码质量的想法。或者某个经理来找你,指出新的 feature/fix 现在比当前的覆盖目标更重要。 然后呢?暂时禁用检查?允许更低的数字?
当然,测量单元测试的覆盖率是一件好事。您应该经常这样做,并使您的开发人员可以轻松访问此信息(例如将其放在某些仪表板上)。要求您的开发团队致力于某些目标也是公平的。但是 强迫 一些覆盖范围的数字让每个人都难以接受……是行不通的。
(好吧:如果你在高class环境中工作,每个开发人员不仅接受你的想法但完全支持你;那么事情可能会有所不同。但如果你生活在这样的环境中,那么高覆盖率会自然而然地到来;无需强制执行。