Skip to content

Commit 43dead7

Browse files
committed
Aggregate raw coverage data instead of scoverage XML reports
1 parent ba5b6df commit 43dead7

File tree

11 files changed

+130
-6
lines changed

11 files changed

+130
-6
lines changed

README.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,14 @@ turn it back off when you're done running reports, use the `coverageOff` command
5454

5555
Sample project with scoverage in both sbt and maven - [the scoverage samples project](https://github.com/scoverage/sbt-scoverage-samples).
5656

57+
## Notes on upgrading to version 1.6.0
58+
59+
* `coverageAggregate` aggregates raw coverage data, not coverage xml reports for modules.
60+
There is no requirement to generate individual coverage reports for modules (`coverageReport`)
61+
before generating aggregated report (`coverageAggregate`).
62+
63+
If only aggregated report is required, not executing `coverageReport` can reduce the build time significantly.
64+
5765
## Notes on upgrading to version 1.3.0
5866

5967
* The object containing the keys has changed from nested to top level so you might need to adjust the import. It's also an auto plugin now, so you might not need the import at all.

build.sbt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ resolvers ++= {
1010
if (isSnapshot.value) Seq(Resolver.sonatypeRepo("snapshots")) else Nil
1111
}
1212

13-
libraryDependencies += "org.scoverage" %% "scalac-scoverage-plugin" % "1.4.0-M5"
13+
libraryDependencies += "org.scoverage" %% "scalac-scoverage-plugin" % "1.4.0-SNAPSHOT"
1414

1515
publishMavenStyle := true
1616

src/main/scala/scoverage/ScoverageKeys.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ object ScoverageKeys {
1515
lazy val coverageOutputXML = settingKey[Boolean]("enables xml report generation")
1616
lazy val coverageOutputHTML = settingKey[Boolean]("enables html report generation")
1717
lazy val coverageOutputDebug = settingKey[Boolean]("turn on the debug report")
18+
@deprecated("", "1.6.0")
1819
lazy val coverageCleanSubprojectFiles = settingKey[Boolean]("removes subproject data after an aggregation")
1920
lazy val coverageOutputTeamCity = settingKey[Boolean]("turn on teamcity reporting")
2021
lazy val coverageScalacPluginVersion = settingKey[String]("version of scalac-scoverage-plugin to use")

src/main/scala/scoverage/ScoverageSbtPlugin.scala

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,15 @@ package scoverage
33
import sbt.Keys._
44
import sbt._
55
import sbt.plugins.JvmPlugin
6-
import scoverage.report.{CoverageAggregator, CoberturaXmlWriter, ScoverageHtmlWriter, ScoverageXmlWriter}
6+
import scoverage.report.{CoberturaXmlWriter, CoverageAggregator, ScoverageHtmlWriter, ScoverageXmlWriter}
77

88
object ScoverageSbtPlugin extends AutoPlugin {
99

1010
val OrgScoverage = "org.scoverage"
1111
val ScalacRuntimeArtifact = "scalac-scoverage-runtime"
1212
val ScalacPluginArtifact = "scalac-scoverage-plugin"
1313
// this should match the version defined in build.sbt
14-
val DefaultScoverageVersion = "1.4.0-M5"
14+
val DefaultScoverageVersion = "1.4.0-SNAPSHOT"
1515
val autoImport = ScoverageKeys
1616
lazy val ScoveragePluginConfig = config("scoveragePlugin").hide
1717

@@ -132,9 +132,8 @@ object ScoverageSbtPlugin extends AutoPlugin {
132132
val log = streams.value.log
133133
log.info(s"Aggregating coverage from subprojects...")
134134

135-
val xmlReportFiles = crossTarget.all(aggregateFilter).value map (_ / "scoverage-report" / Constants
136-
.XMLReportFilename) filter (_.isFile())
137-
CoverageAggregator.aggregate(xmlReportFiles, coverageCleanSubprojectFiles.value) match {
135+
val dataDirs = crossTarget.all(aggregateFilter).value map (_ / Constants.DataDir) filter (_.isDirectory)
136+
CoverageAggregator.aggregate(dataDirs) match {
138137
case Some(cov) =>
139138
writeReports(
140139
crossTarget.value,
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/*
2+
The projects test aggregation of coverage reports from two sub-projects.
3+
The sub-projects are in the directories partA and partB.
4+
*/
5+
6+
lazy val commonSettings = Seq(
7+
organization := "org.scoverage",
8+
version := "0.1.0",
9+
scalaVersion := "2.10.4"
10+
)
11+
12+
lazy val specs2Lib = "org.specs2" %% "specs2" % "2.3.13" % "test"
13+
14+
def module(name: String) = {
15+
val id = s"part$name"
16+
Project(id = id, base = file(id))
17+
.settings(commonSettings: _*)
18+
.settings(
19+
Keys.name := name,
20+
libraryDependencies += specs2Lib
21+
)
22+
}
23+
24+
lazy val partA = module("A")
25+
lazy val partB = module("B")
26+
27+
lazy val root = (project in file("."))
28+
.settings(commonSettings:_*)
29+
.settings(
30+
name := "root",
31+
test := { }
32+
).aggregate(
33+
partA,
34+
partB
35+
)
36+
37+
resolvers in ThisBuild ++= {
38+
if (sys.props.get("plugin.version").map(_.endsWith("-SNAPSHOT")).getOrElse(false)) Seq(Resolver.sonatypeRepo("snapshots"))
39+
else Seq.empty
40+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package org.scoverage.issue53.part.a
2+
3+
/**
4+
* Created by Mikhail Kokho on 7/10/2015.
5+
*/
6+
object AdderScala {
7+
8+
def add(x: Int, y: Int) = x + y
9+
10+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import org.specs2.mutable._
2+
import org.scoverage.issue53.part.a.AdderScala
3+
4+
/**
5+
* Created by Mikhail Kokho on 7/10/2015.
6+
*/
7+
class AdderTestSuite extends Specification {
8+
"Adder" should {
9+
"sum two numbers" in {
10+
AdderScala.add(1, 2) mustEqual 3
11+
}
12+
}
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
2+
package org.scoverage.issue53.part.b
3+
4+
/**
5+
* Created by Mikhail Kokho on 7/10/2015.
6+
*/
7+
object SubtractorScala {
8+
9+
def minus(x: Int, y: Int) = x - y
10+
11+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import org.specs2.mutable._
2+
import org.scoverage.issue53.part.b.SubtractorScala
3+
4+
/**
5+
* Created by Mikhail Kokho on 7/10/2015.
6+
*/
7+
class SubtractorTestSuite extends Specification {
8+
"Subtractor" should {
9+
"subtract two numbers" in {
10+
SubtractorScala.minus(2, 1) mustEqual 1
11+
}
12+
}
13+
}
14+
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
val pluginVersion = sys.props.getOrElse(
2+
"plugin.version",
3+
throw new RuntimeException(
4+
"""|The system property 'plugin.version' is not defined.
5+
|Specify this property using the scriptedLaunchOpts -D.""".stripMargin))
6+
7+
addSbtPlugin("org.scoverage" % "sbt-scoverage" % pluginVersion)
8+
9+
resolvers ++= {
10+
if (pluginVersion.endsWith("-SNAPSHOT"))
11+
Seq(Resolver.sonatypeRepo("snapshots"))
12+
else
13+
Seq.empty
14+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
# run scoverage using the coverage task
2+
> clean
3+
> coverage
4+
> test
5+
# There should be scoverage-data directories for modules
6+
$ exists partA/target/scala-2.10/scoverage-data
7+
$ exists partB/target/scala-2.10/scoverage-data
8+
# Generate aggregated reports without generating per-module reports first
9+
> coverageAggregate
10+
# There shouldn't be scoverage-report directories for modules
11+
-$ exists partA/target/scala-2.10/scoverage-report
12+
-$ exists partB/target/scala-2.10/scoverage-report
13+
# There should be a root scoverage-report directory
14+
$ exists target/scala-2.10/scoverage-report

0 commit comments

Comments
 (0)