8

I splitted my Unit- and Integration-Tests with a Filter:

  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)),
  ...

So I can do something like that:

sbt clean coverage test dockerComposeUp it:test dockerComposeStop coverageReport

Sadly that kills all my Coverage, only the generated BuildInfo has a Coverage.

Using only sbt clean coverage test coverageReport or sbt clean coverage it:test coverageReport work as expected.

The whole project can be found here: https://github.com/pme123/play-binding-form

scoverage Version: 1.5.1

4

2 回答 2

11

SBT 支持增量编译,但 Scoverage 不支持。Scoverage 在编译开始前清除检测信息,每次都从头开始检测过程。在启用 Scoverage 的情况下编译所有类的子集将导致错误的覆盖率报告。

在这种情况下sbt-buldinfo,插件在server模块中启用。它注册源生成器,在每次编译之前执行并生成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"
  )

buildInfoOptionsBuildTime打开覆盖时不包括选项。

它看起来并不优雅,但它确实有效。您可能会找到更好的方法。

于 2019-01-31T08:32:29.687 回答
5

您可以使用自己的构建时间,而不是根据阶段使用不同的 buildinfo 对象,这可能会导致编译错误。

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
  )

这应该可以解决这个问题。我在我的一个项目中有这个配置,因为我想更好地控制日期的格式,我没有同样的问题

于 2019-02-27T14:39:42.740 回答