scoverage:结合测试和 it:test 的覆盖率
scoverage: Combine Coverage from test and it:test
我用过滤器拆分了我的单元测试和集成测试:
lazy val FunTest = config("it") extend Test
def funTestFilter(name: String): Boolean = name endsWith "Spec"
def unitTestFilter(name: String): Boolean = name endsWith "Test"
...
testOptions in Test := Seq(Tests.Filter(unitTestFilter)),
testOptions in FunTest := Seq(Tests.Filter(funTestFilter)),
...
所以我可以做类似的事情:
sbt clean coverage test dockerComposeUp it:test dockerComposeStop coverageReport
遗憾的是,这杀死了我所有的 Coverage,只有生成的 BuildInfo
有 Coverage。
仅使用 sbt clean coverage test coverageReport
或 sbt clean coverage it:test coverageReport
即可正常工作。
整个项目可以在这里找到:https://github.com/pme123/play-binding-form
覆盖版本:1.5.1
SBT支持增量编译,Scoverage不支持。 Scoverage 在编译开始之前清除检测信息,并且每次都从头开始检测过程。在启用 Scoverage 的情况下编译所有 类 的子集将导致错误的覆盖率报告。
在这种情况下,sbt-buldinfo
插件在 server
模块中启用。注册source generator,在每次编译前执行,生成server/target/scala_2.12/src_managed/main/sbt-buildinfo/BuildInfo.scala
文件
SBT BuildInfo 插件足够智能,仅在其内容更改时才重新生成此文件,但由于 BuildInfoOption.BuildTime
包含在 buildInfoOptions
设置中,
该文件在每次编译前重新生成。
在编译过程中,编译器每次都会找到一个修改过的文件(BuildInfo.scala
),然后开始对这个文件进行增量编译。 Scoverage 清除其以前的检测信息并仅保存有关 BuildInfo.scala
文件的信息。
在像 sbt clean coverage test dockerComposeUp it:test dockerComposeStop coverageReport
这样的执行情况下,第一个编译过程是 test
任务的一部分,第二个是 it:test
任务的一部分。这就是为什么当它们分开使用时没有问题。
Docker与我们的问题无关
要解决此问题,您必须防止在每次编译时 BuildInfo.scala
重新生成文件,至少在启用覆盖时。
我通过以这种方式修改 project/Settings.scala
文件来做到这一点:
private lazy val buildInfoSettings = Seq(
buildInfoKeys := Seq[BuildInfoKey](name, version, scalaVersion, sbtVersion),
buildInfoOptions ++= { if (coverageEnabled.value) Seq() else Seq(BuildInfoOption.BuildTime) }, // <-- this line was changed
buildInfoOptions += BuildInfoOption.ToJson,
buildInfoPackage := "pme123.adapters.version"
)
buildInfoOptions
不包括 BuildTime
覆盖率打开时的选项。
它看起来不优雅,但很管用。您可能会找到更好的方法。
您可以使用自己的构建时间,而不是根据阶段使用不同的构建信息对象,这可能会导致编译错误。
lazy val buildTime: SettingKey[String] = SettingKey[String]("buildTime", "time of build")
ThisBuild / buildTime := ZonedDateTime.now(ZoneOffset.UTC).toString
buildInfoKeys :=
Seq[BuildInfoKey](
name,
version,
scalaVersion,
sbtVersion,
buildTime
)
这应该可以解决这个问题。
我在我的一个项目中有这个配置,因为我想更好地控制日期的格式化方式,我没有遇到同样的问题
我用过滤器拆分了我的单元测试和集成测试:
lazy val FunTest = config("it") extend Test
def funTestFilter(name: String): Boolean = name endsWith "Spec"
def unitTestFilter(name: String): Boolean = name endsWith "Test"
...
testOptions in Test := Seq(Tests.Filter(unitTestFilter)),
testOptions in FunTest := Seq(Tests.Filter(funTestFilter)),
...
所以我可以做类似的事情:
sbt clean coverage test dockerComposeUp it:test dockerComposeStop coverageReport
遗憾的是,这杀死了我所有的 Coverage,只有生成的 BuildInfo
有 Coverage。
仅使用 sbt clean coverage test coverageReport
或 sbt clean coverage it:test coverageReport
即可正常工作。
整个项目可以在这里找到:https://github.com/pme123/play-binding-form
覆盖版本:1.5.1
SBT支持增量编译,Scoverage不支持。 Scoverage 在编译开始之前清除检测信息,并且每次都从头开始检测过程。在启用 Scoverage 的情况下编译所有 类 的子集将导致错误的覆盖率报告。
在这种情况下,sbt-buldinfo
插件在 server
模块中启用。注册source generator,在每次编译前执行,生成server/target/scala_2.12/src_managed/main/sbt-buildinfo/BuildInfo.scala
文件
SBT BuildInfo 插件足够智能,仅在其内容更改时才重新生成此文件,但由于 BuildInfoOption.BuildTime
包含在 buildInfoOptions
设置中,
该文件在每次编译前重新生成。
在编译过程中,编译器每次都会找到一个修改过的文件(BuildInfo.scala
),然后开始对这个文件进行增量编译。 Scoverage 清除其以前的检测信息并仅保存有关 BuildInfo.scala
文件的信息。
在像 sbt clean coverage test dockerComposeUp it:test dockerComposeStop coverageReport
这样的执行情况下,第一个编译过程是 test
任务的一部分,第二个是 it:test
任务的一部分。这就是为什么当它们分开使用时没有问题。
Docker与我们的问题无关
要解决此问题,您必须防止在每次编译时 BuildInfo.scala
重新生成文件,至少在启用覆盖时。
我通过以这种方式修改 project/Settings.scala
文件来做到这一点:
private lazy val buildInfoSettings = Seq(
buildInfoKeys := Seq[BuildInfoKey](name, version, scalaVersion, sbtVersion),
buildInfoOptions ++= { if (coverageEnabled.value) Seq() else Seq(BuildInfoOption.BuildTime) }, // <-- this line was changed
buildInfoOptions += BuildInfoOption.ToJson,
buildInfoPackage := "pme123.adapters.version"
)
buildInfoOptions
不包括 BuildTime
覆盖率打开时的选项。
它看起来不优雅,但很管用。您可能会找到更好的方法。
您可以使用自己的构建时间,而不是根据阶段使用不同的构建信息对象,这可能会导致编译错误。
lazy val buildTime: SettingKey[String] = SettingKey[String]("buildTime", "time of build")
ThisBuild / buildTime := ZonedDateTime.now(ZoneOffset.UTC).toString
buildInfoKeys :=
Seq[BuildInfoKey](
name,
version,
scalaVersion,
sbtVersion,
buildTime
)
这应该可以解决这个问题。 我在我的一个项目中有这个配置,因为我想更好地控制日期的格式化方式,我没有遇到同样的问题