【发布时间】:2017-09-02 21:25:48
【问题描述】:
如果可以利用 sbt 增量编译并避免每次运行测试时都必须重新编译整个项目,那就太好了,这正是你执行clean 时发生的情况。但以下顺序:
sbt> coverage
sbt> test
sbt> coverageReport
不会重新生成覆盖率报告,但这个会:
sbt> clean
sbt> coverage
sbt> test
sbt> coverageReport
例如,以下序列将始终生成相同的覆盖率报告(即第一次生成的报告):
sbt> coverage
sbt> test
sbt> coverageReport
在这里我更改了我的一个测试文件并再次运行:
sbt> coverage
sbt> test
sbt> coverageReport
【问题讨论】:
-
项目是否开源,让我们看看?我从来没有意识到这种行为。我通常只对 CI 进行报道,而且我总是很干净,因为我对此有点偏执:)
-
根据我的经验,这正是覆盖的问题 - 在覆盖检测期间,它只会注意到部分代码以某种方式受到影响。如果你清理它,它将测量整个代码的覆盖率。如果你在那之后重复测量,它只会测量......我猜是增量编译触及的部分。
-
@pedrorijo91 我们将测试覆盖率保持在 100%,因此我想确保在提交之前不会破坏构建。该项目不是开源的,但您可以在任何项目中复制该行为
-
SBT 编译是增量的,Scoverage 使用序列来识别它所检测的语句。这个序列不存储在任何地方,它在每次编译时都会被重置。对于增量编译,不同的语句将重用相同的第一个序列号(1、2、3、...),这会导致覆盖数据不一致。也许可以在后续构建中存储和重用序列,但没有人尝试过。