Skip to content

Commit 3d9c712

Browse files
committed
Coverage minima: add more fine-grained control
Along with existing overall coverage, add parameters for statement and branch minima at the package and file level.
1 parent 64377d5 commit 3d9c712

File tree

5 files changed

+94
-0
lines changed

5 files changed

+94
-0
lines changed

README.md

+4
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,10 @@ Read [SBT SCoverage Plugin documentation](https://github.com/scoverage/sbt-scove
337337
<configuration>
338338
<minimumCoverage>95</minimumCoverage>
339339
<minimumCoverageBranchTotal>90</minimumCoverageBranchTotal>
340+
<minimumCoverageStmtPerPackage>90</minimumCoverageStmtPerPackage>
341+
<minimumCoverageBranchPerPackage>85</minimumCoverageBranchPerPackage>
342+
<minimumCoverageStmtPerFile>85</minimumCoverageStmtPerFile>
343+
<minimumCoverageBranchPerFile>80</minimumCoverageBranchPerFile>
340344
<failOnMinimumCoverage>true</failOnMinimumCoverage>
341345
</configuration>
342346
<executions>

src/it/test_coverage_minima/module03/pom.xml

+4
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@
2222
<aggregate>true</aggregate>
2323
<minimumCoverage>100</minimumCoverage>
2424
<minimumCoverageBranchTotal>100</minimumCoverageBranchTotal>
25+
<minimumCoverageStmtPerPackage>100</minimumCoverageStmtPerPackage>
26+
<minimumCoverageBranchPerPackage>100</minimumCoverageBranchPerPackage>
27+
<minimumCoverageStmtPerFile>100</minimumCoverageStmtPerFile>
28+
<minimumCoverageBranchPerFile>100</minimumCoverageBranchPerFile>
2529
</configuration>
2630
<executions>
2731
<execution>

src/it/test_coverage_minima/pom.xml

+4
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,10 @@
4949
<aggregate>true</aggregate> <!-- for aggregated report -->
5050
<minimumCoverage>95</minimumCoverage>
5151
<minimumCoverageBranchTotal>90</minimumCoverageBranchTotal>
52+
<minimumCoverageStmtPerPackage>90</minimumCoverageStmtPerPackage>
53+
<minimumCoverageBranchPerPackage>85</minimumCoverageBranchPerPackage>
54+
<minimumCoverageStmtPerFile>85</minimumCoverageStmtPerFile>
55+
<minimumCoverageBranchPerFile>80</minimumCoverageBranchPerFile>
5256
<failOnMinimumCoverage>false</failOnMinimumCoverage>
5357
</configuration>
5458
<executions>

src/it/test_coverage_minima/validate.groovy

+4
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ try {
2323
"""
2424
|[ERROR] Coverage is below minimum [50.00% < 95.00%]: Statement:Total
2525
|[INFO] Coverage is 100%: Branch:Total!
26+
|[ERROR] Coverage is below minimum [0.00% < 90.00%]: Statement:Package:pkg02
27+
|[ERROR] Coverage is below minimum [0.00% < 85.00%]: Branch:Package:pkg02
28+
|[ERROR] Coverage is below minimum [0.00% < 85.00%]: Statement:File:HelloService1.scala
29+
|[ERROR] Coverage is below minimum [0.00% < 80.00%]: Branch:File:HelloService1.scala
2630
|""".stripMargin()
2731
)
2832
checkModule(logText, "module03",

src/main/java/org/scoverage/plugin/SCoverageCheckMojo.java

+78
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
import java.io.File;
2121
import java.util.Arrays;
2222
import java.util.List;
23+
import java.util.function.Function;
24+
import java.util.function.Predicate;
2325

2426
import org.apache.maven.plugin.AbstractMojo;
2527
import org.apache.maven.plugin.MojoFailureException;
@@ -96,6 +98,54 @@ public class SCoverageCheckMojo
9698
@Parameter( property = "scoverage.minimumCoverageBranchTotal", defaultValue = "0" )
9799
private Double minimumCoverageBranchTotal;
98100

101+
/**
102+
* Required minimum per-package statement coverage.
103+
* <br>
104+
* <br>
105+
* See <a href="https://github.com/scoverage/sbt-scoverage#minimum-coverage">https://github.com/scoverage/sbt-scoverage#minimum-coverage</a> for additional documentation.
106+
* <br>
107+
*
108+
* @since 2.0.1
109+
*/
110+
@Parameter( property = "scoverage.minimumCoverageStmtPerPackage", defaultValue = "0" )
111+
private Double minimumCoverageStmtPerPackage;
112+
113+
/**
114+
* Required minimum per-package branch coverage.
115+
* <br>
116+
* <br>
117+
* See <a href="https://github.com/scoverage/sbt-scoverage#minimum-coverage">https://github.com/scoverage/sbt-scoverage#minimum-coverage</a> for additional documentation.
118+
* <br>
119+
*
120+
* @since 2.0.1
121+
*/
122+
@Parameter( property = "scoverage.minimumCoverageBranchPerPackage", defaultValue = "0" )
123+
private Double minimumCoverageBranchPerPackage;
124+
125+
/**
126+
* Required minimum per-file statement coverage.
127+
* <br>
128+
* <br>
129+
* See <a href="https://github.com/scoverage/sbt-scoverage#minimum-coverage">https://github.com/scoverage/sbt-scoverage#minimum-coverage</a> for additional documentation.
130+
* <br>
131+
*
132+
* @since 2.0.1
133+
*/
134+
@Parameter( property = "scoverage.minimumCoverageStmtPerFile", defaultValue = "0" )
135+
private Double minimumCoverageStmtPerFile;
136+
137+
/**
138+
* Required minimum per-file branch coverage.
139+
* <br>
140+
* <br>
141+
* See <a href="https://github.com/scoverage/sbt-scoverage#minimum-coverage">https://github.com/scoverage/sbt-scoverage#minimum-coverage</a> for additional documentation.
142+
* <br>
143+
*
144+
* @since 2.0.1
145+
*/
146+
@Parameter( property = "scoverage.minimumCoverageBranchPerFile", defaultValue = "0" )
147+
private Double minimumCoverageBranchPerFile;
148+
99149
/**
100150
* Fail the build if minimum coverage was not reached.
101151
* <br>
@@ -188,6 +238,10 @@ public void execute() throws MojoFailureException
188238

189239
boolean ok = checkCoverage( getLog(), "Total", coverage,
190240
minimumCoverage, minimumCoverageBranchTotal, true );
241+
ok = checkCoverage( getLog(), "Package:", coverage.packages(), x -> x.name(),
242+
minimumCoverageStmtPerPackage, minimumCoverageBranchPerPackage ) && ok;
243+
ok = checkCoverage( getLog(), "File:", coverage.files(), x -> x.filename(),
244+
minimumCoverageStmtPerFile, minimumCoverageBranchPerFile ) && ok;
191245

192246
if ( !ok && failOnMinimumCoverage )
193247
{
@@ -205,6 +259,17 @@ private static boolean is100( Double d )
205259
return Math.abs( 100 - d ) <= 0.00001d;
206260
}
207261

262+
private static <T extends CoverageMetrics >
263+
boolean checkCoverage( Log logger, String metricPrefix,
264+
scala.collection.Iterable< T > metrics,
265+
Function< T, String > toName,
266+
double minStmt, double minBranch )
267+
{
268+
return minStmt <= 0 && minBranch <= 0 || checkAll(metrics, cov ->
269+
checkCoverage(logger, metricPrefix + toName.apply(cov), cov, minStmt, minBranch, false)
270+
);
271+
}
272+
208273
private static boolean checkCoverage( Log logger, String metric, CoverageMetrics metrics,
209274
double minStmt, double minBranch, boolean logSuccessInfo )
210275
{
@@ -261,4 +326,17 @@ private static void logSuccess( Log logger, String message, boolean logSuccessIn
261326
}
262327
}
263328

329+
private static <T> boolean checkAll( scala.collection.Iterable<T> iterable, Predicate<T> predicate )
330+
{
331+
boolean ok = true;
332+
for ( T elem : CollectionConverters.asJava( iterable ) )
333+
{
334+
if ( !predicate.test( elem ) )
335+
{
336+
ok = false;
337+
}
338+
}
339+
return ok;
340+
}
341+
264342
}

0 commit comments

Comments
 (0)