Skip to content

Commit 272f34e

Browse files
authored
Migrate from scalatest to munit. (#388)
This is an opinionated change, but I'm a firm believer in munit. There were some test issues previously that were pretty hard to debug due to the nasty diffs that scalatest gives you compared to munit. Plus when doing the migration I actually found some mistakes in the tests that were false positives which switching from === to `assertEquals` unveiled. It's a pretty straightforward migration.
1 parent cc32369 commit 272f34e

15 files changed

+647
-670
lines changed

build.sbt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import sbtcrossproject.CrossProject
22
import sbtcrossproject.CrossType
33

4-
val scalatestVersion = "3.2.10"
4+
val munitVersion = "0.7.29"
55
val scalametaVersion = "4.4.28"
66
val defaultScala213 = "2.13.6"
77
val bin212 =
@@ -102,7 +102,7 @@ lazy val runtime = CrossProject(
102102
name := "scalac-scoverage-runtime",
103103
crossTarget := target.value / s"scala-${scalaVersion.value}",
104104
libraryDependencies ++= Seq(
105-
"org.scalatest" %%% "scalatest" % scalatestVersion % Test
105+
"org.scalameta" %% "munit" % munitVersion % Test
106106
),
107107
sharedSettings
108108
)
@@ -125,7 +125,7 @@ lazy val plugin =
125125
crossVersion := CrossVersion.full,
126126
libraryDependencies ++= Seq(
127127
"org.scala-lang.modules" %% "scala-xml" % "2.0.0",
128-
"org.scalatest" %% "scalatest" % scalatestVersion % Test,
128+
"org.scalameta" %% "munit" % munitVersion % Test,
129129
"org.scala-lang" % "scala-compiler" % scalaVersion.value % Provided
130130
),
131131
sharedSettings

scalac-scoverage-plugin/src/test/scala/scoverage/CoberturaXmlWriterTest.scala

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,13 @@ import scala.xml.Elem
99
import scala.xml.XML
1010
import scala.xml.factory.XMLLoader
1111

12-
import org.scalatest.BeforeAndAfter
13-
import org.scalatest.OneInstancePerTest
14-
import org.scalatest.funsuite.AnyFunSuite
12+
import munit.FunSuite
1513
import org.xml.sax.ErrorHandler
1614
import org.xml.sax.SAXParseException
1715
import scoverage.report.CoberturaXmlWriter
1816

1917
/** @author Stephen Samuel */
20-
class CoberturaXmlWriterTest
21-
extends AnyFunSuite
22-
with BeforeAndAfter
23-
with OneInstancePerTest {
18+
class CoberturaXmlWriterTest extends FunSuite {
2419

2520
def tempDir(): File = {
2621
val dir = new File(IOUtils.getTempDirectory, UUID.randomUUID.toString)
@@ -227,16 +222,16 @@ class CoberturaXmlWriterTest
227222
builder.setErrorHandler(new ErrorHandler() {
228223
@Override
229224
def error(e: SAXParseException): Unit = {
230-
fail(e)
225+
fail(e.getMessage(), e.getCause())
231226
}
232227
@Override
233228
def fatalError(e: SAXParseException): Unit = {
234-
fail(e)
229+
fail(e.getMessage(), e.getCause())
235230
}
236231

237232
@Override
238233
def warning(e: SAXParseException): Unit = {
239-
fail(e)
234+
fail(e.getMessage(), e.getCause())
240235
}
241236
})
242237
builder.parse(fileIn(dir))
@@ -329,8 +324,12 @@ class CoberturaXmlWriterTest
329324

330325
val xml = customXML.loadFile(fileIn(dir))
331326

332-
assert((xml \\ "coverage" \ "@line-rate").text === "0.33", "line-rate")
333-
assert((xml \\ "coverage" \ "@branch-rate").text === "0.50", "branch-rate")
327+
assertEquals((xml \\ "coverage" \ "@line-rate").text, "0.33", "line-rate")
328+
assertEquals(
329+
(xml \\ "coverage" \ "@branch-rate").text,
330+
"0.50",
331+
"branch-rate"
332+
)
334333

335334
}
336335
}

scalac-scoverage-plugin/src/test/scala/scoverage/CoverageAggregatorTest.scala

Lines changed: 64 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -4,84 +4,83 @@ import java.io.File
44
import java.io.FileWriter
55
import java.util.UUID
66

7-
import org.scalatest.freespec.AnyFreeSpec
8-
import org.scalatest.matchers.should.Matchers
7+
import munit.FunSuite
98
import scoverage.report.CoverageAggregator
109

11-
class CoverageAggregatorTest extends AnyFreeSpec with Matchers {
10+
class CoverageAggregatorTest extends FunSuite {
1211

1312
// Let current directory be our source root
1413
private val sourceRoot = new File(".").getCanonicalPath()
1514
private def canonicalPath(fileName: String) =
1615
new File(sourceRoot, fileName).getCanonicalPath()
1716

18-
"coverage aggregator" - {
19-
"should merge coverage objects with same id" in {
17+
test("should merge coverage objects with same id") {
2018

21-
val source = canonicalPath("com/scoverage/class.scala")
22-
val location = Location(
23-
"com.scoverage.foo",
24-
"ServiceState",
25-
"com.scoverage.foo.Service.ServiceState",
26-
ClassType.Trait,
27-
"methlab",
28-
source
29-
)
19+
val source = canonicalPath("com/scoverage/class.scala")
20+
val location = Location(
21+
"com.scoverage.foo",
22+
"ServiceState",
23+
"com.scoverage.foo.Service.ServiceState",
24+
ClassType.Trait,
25+
"methlab",
26+
source
27+
)
3028

31-
val cov1Stmt1 = Statement(location, 1, 155, 176, 4, "", "", "", true, 1)
32-
val cov1Stmt2 = Statement(location, 2, 200, 300, 5, "", "", "", false, 1)
33-
val coverage1 = Coverage()
34-
coverage1.add(cov1Stmt1.copy(count = 0))
35-
coverage1.add(cov1Stmt2.copy(count = 0))
36-
val dir1 = new File(IOUtils.getTempPath, UUID.randomUUID.toString)
37-
dir1.mkdir()
38-
Serializer.serialize(
39-
coverage1,
40-
Serializer.coverageFile(dir1),
41-
new File(sourceRoot)
42-
)
43-
val measurementsFile1 =
44-
new File(dir1, s"${Constants.MeasurementsPrefix}1")
45-
val measurementsFile1Writer = new FileWriter(measurementsFile1)
46-
measurementsFile1Writer.write("1\n2\n")
47-
measurementsFile1Writer.close()
29+
val cov1Stmt1 = Statement(location, 1, 155, 176, 4, "", "", "", true, 1)
30+
val cov1Stmt2 = Statement(location, 2, 200, 300, 5, "", "", "", false, 1)
31+
val coverage1 = Coverage()
32+
coverage1.add(cov1Stmt1.copy(count = 0))
33+
coverage1.add(cov1Stmt2.copy(count = 0))
34+
val dir1 = new File(IOUtils.getTempPath, UUID.randomUUID.toString)
35+
dir1.mkdir()
36+
Serializer.serialize(
37+
coverage1,
38+
Serializer.coverageFile(dir1),
39+
new File(sourceRoot)
40+
)
41+
val measurementsFile1 =
42+
new File(dir1, s"${Constants.MeasurementsPrefix}1")
43+
val measurementsFile1Writer = new FileWriter(measurementsFile1)
44+
measurementsFile1Writer.write("1\n2\n")
45+
measurementsFile1Writer.close()
4846

49-
val cov2Stmt1 = Statement(location, 1, 95, 105, 19, "", "", "", false, 0)
50-
val coverage2 = Coverage()
51-
coverage2.add(cov2Stmt1)
52-
val dir2 = new File(IOUtils.getTempPath, UUID.randomUUID.toString)
53-
dir2.mkdir()
54-
Serializer.serialize(
55-
coverage2,
56-
Serializer.coverageFile(dir2),
57-
new File(sourceRoot)
58-
)
47+
val cov2Stmt1 = Statement(location, 1, 95, 105, 19, "", "", "", false, 0)
48+
val coverage2 = Coverage()
49+
coverage2.add(cov2Stmt1)
50+
val dir2 = new File(IOUtils.getTempPath, UUID.randomUUID.toString)
51+
dir2.mkdir()
52+
Serializer.serialize(
53+
coverage2,
54+
Serializer.coverageFile(dir2),
55+
new File(sourceRoot)
56+
)
57+
58+
val cov3Stmt1 =
59+
Statement(location, 2, 14, 1515, 544, "", "", "", false, 1)
60+
val coverage3 = Coverage()
61+
coverage3.add(cov3Stmt1.copy(count = 0))
62+
val dir3 = new File(IOUtils.getTempPath, UUID.randomUUID.toString)
63+
dir3.mkdir()
64+
Serializer.serialize(
65+
coverage3,
66+
Serializer.coverageFile(dir3),
67+
new File(sourceRoot)
68+
)
69+
val measurementsFile3 =
70+
new File(dir3, s"${Constants.MeasurementsPrefix}1")
71+
val measurementsFile3Writer = new FileWriter(measurementsFile3)
72+
measurementsFile3Writer.write("2\n")
73+
measurementsFile3Writer.close()
5974

60-
val cov3Stmt1 =
61-
Statement(location, 2, 14, 1515, 544, "", "", "", false, 1)
62-
val coverage3 = Coverage()
63-
coverage3.add(cov3Stmt1.copy(count = 0))
64-
val dir3 = new File(IOUtils.getTempPath, UUID.randomUUID.toString)
65-
dir3.mkdir()
66-
Serializer.serialize(
67-
coverage3,
68-
Serializer.coverageFile(dir3),
75+
val aggregated =
76+
CoverageAggregator.aggregatedCoverage(
77+
Seq(dir1, dir2, dir3),
6978
new File(sourceRoot)
7079
)
71-
val measurementsFile3 =
72-
new File(dir3, s"${Constants.MeasurementsPrefix}1")
73-
val measurementsFile3Writer = new FileWriter(measurementsFile3)
74-
measurementsFile3Writer.write("2\n")
75-
measurementsFile3Writer.close()
76-
77-
val aggregated =
78-
CoverageAggregator.aggregatedCoverage(
79-
Seq(dir1, dir2, dir3),
80-
new File(sourceRoot)
81-
)
82-
aggregated.statements.toSet.size shouldBe 4
83-
aggregated.statements.map(_.copy(id = 0)).toSet shouldBe
84-
Set(cov1Stmt1, cov1Stmt2, cov2Stmt1, cov3Stmt1).map(_.copy(id = 0))
85-
}
80+
assertEquals(aggregated.statements.toSet.size, 4)
81+
assertEquals(
82+
aggregated.statements.map(_.copy(id = 0)).toSet,
83+
Set(cov1Stmt1, cov1Stmt2, cov2Stmt1, cov3Stmt1).map(_.copy(id = 0))
84+
)
8685
}
8786
}
Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,32 @@
11
package scoverage
22

3-
import org.scalatest.freespec.AnyFreeSpec
4-
import org.scalatest.matchers.should.Matchers
3+
import munit.FunSuite
54

6-
class CoverageMetricsTest extends AnyFreeSpec with Matchers {
5+
class CoverageMetricsTest extends FunSuite {
76

8-
"no branches with at least one invoked statement should have 100% branch coverage" in {
7+
test(
8+
"no branches with at least one invoked statement should have 100% branch coverage"
9+
) {
910
val metrics = new CoverageMetrics {
1011
override def statements: Iterable[Statement] =
1112
Seq(Statement(null, 0, 0, 0, 0, null, null, null, false, 1))
1213

1314
override def ignoredStatements: Iterable[Statement] = Seq()
1415
}
15-
metrics.branchCount shouldBe 0
16-
metrics.branchCoverage shouldBe 1.0 +- 0.0001
16+
assertEquals(metrics.branchCount, 0)
17+
assertEqualsDouble(metrics.branchCoverage, 1.0, 0.0001)
1718
}
1819

19-
"no branches with no invoked statements should have 0% branch coverage" in {
20+
test(
21+
"no branches with no invoked statements should have 0% branch coverage"
22+
) {
2023
val metrics = new CoverageMetrics {
2124
override def statements: Iterable[Statement] =
2225
Seq(Statement(null, 0, 0, 0, 0, null, null, null, false, 0))
2326

2427
override def ignoredStatements: Iterable[Statement] = Seq()
2528
}
26-
metrics.branchCount shouldBe 0
27-
metrics.branchCoverage shouldBe 0
29+
assertEquals(metrics.branchCount, 0)
30+
assertEquals(metrics.branchCoverage, 0.0)
2831
}
2932
}

scalac-scoverage-plugin/src/test/scala/scoverage/CoverageTest.scala

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,13 @@
11
package scoverage
22

3-
import org.scalatest.BeforeAndAfter
4-
import org.scalatest.OneInstancePerTest
5-
import org.scalatest.funsuite.AnyFunSuite
3+
import munit.FunSuite
64

75
/** @author Stephen Samuel */
8-
class CoverageTest
9-
extends AnyFunSuite
10-
with BeforeAndAfter
11-
with OneInstancePerTest {
6+
class CoverageTest extends FunSuite {
127

138
test("coverage for no statements is 1") {
149
val coverage = Coverage()
15-
assert(1.0 === coverage.statementCoverage)
10+
assertEquals(1.0, coverage.statementCoverage)
1611
}
1712

1813
test("coverage for no invoked statements is 0") {
@@ -31,7 +26,7 @@ class CoverageTest
3126
0
3227
)
3328
)
34-
assert(0 === coverage.statementCoverage)
29+
assertEquals(0.0, coverage.statementCoverage)
3530
}
3631

3732
test("coverage for invoked statements") {
@@ -92,6 +87,6 @@ class CoverageTest
9287
0
9388
)
9489
)
95-
assert(0.25 === coverage.statementCoverage)
90+
assertEquals(0.25, coverage.statementCoverage)
9691
}
9792
}

0 commit comments

Comments
 (0)