pme*_*pme 7 scala code-coverage sbt scoverage
我用过滤器拆分了单元测试和集成测试:
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)),
...
Run Code Online (Sandbox Code Playgroud)
所以我可以做这样的事情:
sbt clean coverage test dockerComposeUp it:test dockerComposeStop coverageReport
可悲的是,这杀死了我所有的险种,只有生成BuildInfo的险种了。
仅使用sbt clean coverage test coverageReport或sbt clean coverage it:test coverageReport按预期工作。
整个项目可以在这里找到:https : //github.com/pme123/play-binding-form
覆盖版本: 1.5.1
小智 9
SBT支持增量编译,但是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,至少在启用coverage的情况下,必须防止每次编译时都重新生成文件。我是这样修改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"
)
Run Code Online (Sandbox Code Playgroud)
buildInfoOptionsBuildTime打开覆盖范围时不包含该选项。
它看起来不大,但可以。您可能会找到更好的方法。
您可以使用自己的构建时间,而不必根据阶段使用不同的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
)
Run Code Online (Sandbox Code Playgroud)
这样可以解决此问题。我在我的一个项目中有此配置,因为我想更好地控制日期的格式化方式,而且没有相同的问题
| 归档时间: |
|
| 查看次数: |
353 次 |
| 最近记录: |