Skip to content

Commit 6e10469

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 6f2b217 commit 6e10469

File tree

5 files changed

+93
-0
lines changed

5 files changed

+93
-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

+77
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;
@@ -36,6 +38,8 @@
3638
import scoverage.domain.Coverage;
3739
import scoverage.domain.CoverageMetrics;
3840
import scoverage.domain.DoubleFormat;
41+
import scoverage.domain.MeasuredFile;
42+
import scoverage.domain.MeasuredPackage;
3943
import scoverage.reporter.IOUtils;
4044
import scoverage.serialize.Serializer;
4145

@@ -96,6 +100,54 @@ public class SCoverageCheckMojo
96100
@Parameter( property = "scoverage.minimumCoverageBranchTotal", defaultValue = "0" )
97101
private Double minimumCoverageBranchTotal;
98102

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

189241
boolean ok = checkCoverage( getLog(), "Total", coverage,
190242
minimumCoverage, minimumCoverageBranchTotal, true );
243+
ok = checkCoverage( getLog(), "Package:", coverage.packages(), MeasuredPackage::name,
244+
minimumCoverageStmtPerPackage, minimumCoverageBranchPerPackage ) && ok;
245+
ok = checkCoverage( getLog(), "File:", coverage.files(), MeasuredFile::filename,
246+
minimumCoverageStmtPerFile, minimumCoverageBranchPerFile ) && ok;
191247

192248
if ( !ok && failOnMinimumCoverage )
193249
{
@@ -205,6 +261,17 @@ private static boolean is100( Double d )
205261
return Math.abs( 100 - d ) <= 0.00001d;
206262
}
207263

264+
private static <T extends CoverageMetrics >
265+
boolean checkCoverage( Log logger, String metricPrefix,
266+
scala.collection.Iterable< T > metrics,
267+
Function< T, String > toName,
268+
double minStmt, double minBranch )
269+
{
270+
return minStmt <= 0 && minBranch <= 0 || checkAll(metrics, cov ->
271+
checkCoverage(logger, metricPrefix + toName.apply(cov), cov, minStmt, minBranch, false)
272+
);
273+
}
274+
208275
private static boolean checkCoverage( Log logger, String metric, CoverageMetrics metrics,
209276
double minStmt, double minBranch, boolean logSuccessInfo )
210277
{
@@ -261,4 +328,14 @@ private static void logSuccess( Log logger, String message, boolean logSuccessIn
261328
}
262329
}
263330

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

0 commit comments

Comments
 (0)