15

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

sbt clean coverage it:test coverageReport

此命令运行集成测试、检测它并生成报告。

Build.sbt 有以下内容:

coverageMinimum in IntegrationTest := 21.0
coverageFailOnMinimum in IntegrationTest := true

输出如下所示:

[info] Statement coverage.: 20.16%
[info] Branch coverage....: 12.00%
[info] Coverage reports completed
[info] All done. Coverage was [20.16%]

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

如果我将 build.sbt 更改为以下,它可以工作:

coverageMinimum := 21.0
coverageFailOnMinimum := true

想知道我在为集成测试指定限制时缺少什么

版本信息:

sbt:0.13.17

sbt 覆盖率:1.5.1

4

1 回答 1

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

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

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

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)

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

似乎问题是(除了我不了解范围的确切工作原理之外)checkCoverage即使coverageMinimum在设置coverageMinimum in IntegrationTest.

于 2018-09-15T00:55:38.753 回答