Skip to content

Commit aa31181

Browse files
committed
Updating report task to be on par with sbt plugin
In sbt-scoverage plugin, report task is much more detailed. This commit updates gradle version of report task to be on par with it's sbt counterpart. Updated version of task brings 4 new configuration parameters: - coverageOutputCobertura - coverageOutputXML - coverageOutputHTML - coverageDebug All could be used to enable/disable different outputs. All but last one defaults to true. Readme is updated with this information. Code in `ScoverageWriter.java` is re-written from sbt-scoverage and converted to Java. It could be moved to scalac-scoverage-runtime to be used by all plugins. It's not inlined in `SingleReportApp.java` because it'll be used also in ScoverageAggregate task (in next PR). If there is no test data in project report task now only issues a warning and not crash (it's important for multi-project setups without test code/code to test in some sub-projects).
1 parent bc60746 commit aa31181

File tree

5 files changed

+142
-24
lines changed

5 files changed

+142
-24
lines changed

README.md

+26-9
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ A plugin to enable the use of Scoverage in a gradle Scala project.
66

77
This has now been deployed to maven central.
88

9+
Using gradle-scoverage
10+
======================
11+
912
Getting started
1013
---------------
1114
```groovy
@@ -34,10 +37,31 @@ This creates an additional task testCoverage which will run tests against instru
3437
Then launch command :
3538
`gradle testScoverage` or `gradle checkScoverage`
3639

40+
Available tasks
41+
---------------
42+
43+
* testScoverage - Executes all tests and creates Scoverage XML report with information about code coverage
44+
* reportScoverage - Generates reports (see below).
45+
* aggregateScoverage - Aggregates reports from multiple sub-projects (see below).
46+
* checkScoverage - See below.
47+
* compileScoverageScala - Instruments code without running tests.
48+
49+
ReportScoverage
50+
---------------
51+
52+
You can configure output generated by `gradle reportScoverage` using flags:
53+
54+
| Flag name | Default value | Description |
55+
| ------------------------|---------------|-------------------------------------------------|
56+
| coverageOutputCobertura | true | Enables/disables cobertura.xml file generation. |
57+
| coverageOutputXML | true | Enables/disables scoverage XML output. |
58+
| coverageOutputHTML | true | Enables/disables scoverage HTML output. |
59+
| coverageDebug | false | Enables/disables scoverage debug output. |
60+
3761
Aggregating Reports
3862
-------------------
3963

40-
There is now experimental support for aggregating coverage statistics across subprojects.
64+
There is now experimental support for aggregating coverage statistics across sub-projects.
4165

4266
The project hosting the aggregation task **must** be configured as the sub-projects are;
4367
i.e. with the scoverage plugin applied and the scoverage dependencies configured.
@@ -48,15 +72,8 @@ task aggregateScoverage(type: org.scoverage.ScoverageAggregate)
4872

4973
This will produce a report into _build_ / scoverage-aggregate
5074

51-
Available tasks
52-
---------
53-
* testScoverage - Executes all tests and creates Scoverage XML report with information about code coverage
54-
* reportScoverage - Generates HTML report.
55-
* checkScoverage - See below.
56-
* compileScoverageScala - Instruments code without running tests.
57-
5875
CheckScoverage
59-
---------
76+
--------------
6077

6178
By default, when you launch `gradle checkScoverage` build fail if only 75% of project is covered by tests.
6279

src/main/groovy/org/scoverage/ScoverageExtension.groovy

+6
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,12 @@ class ScoverageExtension {
4848

4949
FileCollection pluginClasspath
5050

51+
/** Options for enabling and disabling output */
52+
boolean coverageOutputCobertura = true
53+
boolean coverageOutputXML = true
54+
boolean coverageOutputHTML = true
55+
boolean coverageDebug = false
56+
5157
ScoverageExtension(Project project) {
5258

5359
project.plugins.apply(JavaPlugin.class);

src/main/groovy/org/scoverage/ScoverageReport.groovy

+9-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,15 @@ class ScoverageReport extends JavaExec {
1010
extension.reportDir.mkdirs()
1111
setClasspath(extension.pluginClasspath)
1212
setMain('org.scoverage.SingleReportApp')
13-
setArgs([extension.sources.absolutePath, extension.dataDir.absolutePath, extension.reportDir.absolutePath])
13+
setArgs([
14+
/* sourceDir = */ extension.sources.absolutePath,
15+
/* dataDir = */ extension.dataDir.absolutePath,
16+
/* reportDir = */ extension.reportDir.absolutePath,
17+
extension.coverageOutputCobertura,
18+
extension.coverageOutputXML,
19+
extension.coverageOutputHTML,
20+
extension.coverageDebug
21+
])
1422
super.exec()
1523
}
1624
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package org.scoverage;
2+
3+
import scoverage.Constants;
4+
import scoverage.Coverage;
5+
import scoverage.report.CoberturaXmlWriter;
6+
import scoverage.report.ScoverageHtmlWriter;
7+
import scoverage.report.ScoverageXmlWriter;
8+
9+
import java.io.File;
10+
11+
/**
12+
* Util for generating and saving coverage files.
13+
* <p/>
14+
* Copied from sbt-scoverage and converted to Java to avoid dependency to Scala.
15+
*/
16+
public class ScoverageWriter {
17+
18+
/**
19+
* Generates all reports from given data.
20+
*
21+
* @param sourceDir directory with project sources
22+
* @param reportDir directory for generate reports
23+
* @param coverage coverage data
24+
* @param coverageOutputCobertura switch for Cobertura output
25+
* @param coverageOutputXML switch for Scoverage XML output
26+
* @param coverageOutputHTML switch for Scoverage HTML output
27+
* @param coverageDebug switch for Scoverage Debug output
28+
*/
29+
public static void write(File sourceDir,
30+
File reportDir,
31+
Coverage coverage,
32+
Boolean coverageOutputCobertura,
33+
Boolean coverageOutputXML,
34+
Boolean coverageOutputHTML,
35+
Boolean coverageDebug) {
36+
37+
System.out.println("[scoverage] Generating scoverage reports...");
38+
39+
reportDir.mkdirs();
40+
41+
if (coverageOutputCobertura) {
42+
new CoberturaXmlWriter(sourceDir, reportDir).write(coverage);
43+
System.out.println("[scoverage] Written Cobertura XML report to " +
44+
reportDir.getAbsolutePath() +
45+
File.separator +
46+
"cobertura.xml");
47+
}
48+
49+
if (coverageOutputXML) {
50+
new ScoverageXmlWriter(sourceDir, reportDir, /* debug = */ false).write(coverage);
51+
System.out.println("[scoverage] Written XML report to " +
52+
reportDir.getAbsolutePath() +
53+
File.separator +
54+
Constants.XMLReportFilename());
55+
if (coverageDebug) {
56+
new ScoverageXmlWriter(sourceDir, reportDir, /* debug = */ true).write(coverage);
57+
System.out.println("[scoverage] Written XML report with debug information to " +
58+
reportDir.getAbsolutePath() +
59+
File.separator +
60+
Constants.XMLReportFilenameWithDebug());
61+
}
62+
}
63+
64+
if (coverageOutputHTML) {
65+
new ScoverageHtmlWriter(sourceDir, reportDir).write(coverage);
66+
System.out.println("[scoverage] Written HTML report to " +
67+
reportDir.getAbsolutePath() +
68+
File.separator +
69+
"index.html");
70+
}
71+
72+
System.out.println("[scoverage] Coverage reports completed");
73+
}
74+
}

src/main/groovy/org/scoverage/SingleReportApp.java

+27-14
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,6 @@
55
import scoverage.Coverage;
66
import scoverage.IOUtils;
77
import scoverage.Serializer;
8-
import scoverage.report.CoberturaXmlWriter;
9-
import scoverage.report.ScoverageHtmlWriter;
10-
import scoverage.report.ScoverageXmlWriter;
118

129
import java.io.File;
1310
import java.util.Arrays;
@@ -21,20 +18,36 @@ public static void main(String... args) {
2118
File sourceDir = new File(args[0]);
2219
File dataDir = new File(args[1]);
2320
File reportDir = new File(args[2]);
24-
reportDir.mkdirs();
21+
22+
Boolean coverageOutputCobertura = java.lang.Boolean.valueOf(args[3]);
23+
Boolean coverageOutputXML = java.lang.Boolean.valueOf(args[4]);
24+
Boolean coverageOutputHTML = java.lang.Boolean.valueOf(args[5]);
25+
Boolean coverageDebug = java.lang.Boolean.valueOf(args[6]);
2526

2627
File coverageFile = Serializer.coverageFile(dataDir);
27-
File[] array = IOUtils.findMeasurementFiles(dataDir);
28-
// TODO: patch scoverage core to use a consistent collection type?
29-
Seq<File> measurementFiles = scala.collection.JavaConversions.asScalaBuffer(Arrays.asList(array));
3028

31-
Coverage coverage = Serializer.deserialize(coverageFile);
29+
if (!coverageFile.exists()) {
30+
System.out.println("[scoverage] Could not find coverage file, skipping...");
31+
} else {
32+
File[] array = IOUtils.findMeasurementFiles(dataDir);
33+
// TODO: patch scoverage core to use a consistent collection type?
34+
Seq<File> measurementFiles = scala.collection.JavaConversions.asScalaBuffer(Arrays.asList(array));
35+
36+
Coverage coverage = Serializer.deserialize(coverageFile);
37+
38+
Set<Object> measurements = IOUtils.invoked(measurementFiles);
39+
coverage.apply(measurements);
40+
41+
ScoverageWriter.write(
42+
sourceDir,
43+
reportDir,
44+
coverage,
45+
coverageOutputCobertura,
46+
coverageOutputXML,
47+
coverageOutputHTML,
48+
coverageDebug);
49+
}
50+
}
3251

33-
Set<Object> measurements = IOUtils.invoked(measurementFiles);
34-
coverage.apply(measurements);
3552

36-
new ScoverageXmlWriter(sourceDir, reportDir, false).write(coverage);
37-
new ScoverageHtmlWriter(sourceDir, reportDir).write(coverage);
38-
new CoberturaXmlWriter(sourceDir, reportDir).write(coverage);
39-
}
4053
}

0 commit comments

Comments
 (0)