如何专门针对集成测试强制执行scala代码覆盖?

adi*_*ikh 15 scala code-coverage sbt scoverage

我正在使用以下sbt命令运行集成测试

sbt clean cover it:test coverageReport

此命令运行集成测试,检测它并生成报告.

Build.sbt有以下内容:

coverageMinimum in IntegrationTest := 21.0
coverageFailOnMinimum in IntegrationTest := true
Run Code Online (Sandbox Code Playgroud)

输出如下:

[info] Statement coverage.: 20.16%
[info] Branch coverage....: 12.00%
[info] Coverage reports completed
[info] All done. Coverage was [20.16%]
Run Code Online (Sandbox Code Playgroud)

输出结果具有20.16%的代码覆盖率,但build.sbt中的限制未强制执行限制.

如果我将build.sbt更改为以下它的工作原理:

coverageMinimum := 21.0
coverageFailOnMinimum := true
Run Code Online (Sandbox Code Playgroud)

想要知道我为指定专门针对集成测试的限制而遗漏了什么

版本信息:

sbt:0.13.17

sbt-scoverage:1.5.1

Mar*_*lic 5

以下两种解决方法似乎适用于我的机器(sbt-scoverage 1.5.1、sbt 1.1.1、scala 2.12.5)

解决方法 1 -inConfig用于限定配置的范围:

inConfig(IntegrationTest)(ScoverageSbtPlugin.projectSettings),
inConfig(IntegrationTest)(Seq(coverageMinimum := 21, coverageFailOnMinimum := true))
Run Code Online (Sandbox Code Playgroud)

现在执行sbt clean coverage it:test it:coverageReportthrows Coverage minimum was not reached

解决方法 2 - 修改coverageMinimum自定义命令中的设置

def itTestWithMinCoverage = Command.command("itTestWithMinCoverage") { state =>
  val extracted = Project extract state
  val stateWithCoverage = extracted.append(Seq(coverageEnabled := true, coverageMinimum := 21.0, coverageFailOnMinimum := true), state)
  val (s1, _) = Project.extract(stateWithCoverage).runTask(test in IntegrationTest, stateWithCoverage)
  val (s2, _) = Project.extract(s1).runTask(coverageReport in IntegrationTest, s1)
  s2
}

commands ++= Seq(itTestWithMinCoverage)
Run Code Online (Sandbox Code Playgroud)

现在执行sbt itTestWithMinCoveragethrows Coverage minimum was not reached。注意执行后itTestWithMinCoveragestate被丢弃所以coverageMinimum应该回到默认值,因此不会影响到单元测试。

看来问题是(除了我缺乏了解如何作用域正好工作)checkCoverage拿起的默认值coverageMinimum即使设置coverageMinimum in IntegrationTest