是否可以在不运行“sbt clean”的情况下运行 Scala SBT Scoverage

Posted

技术标签:

【中文标题】是否可以在不运行“sbt clean”的情况下运行 Scala SBT Scoverage【英文标题】:Is it possible to run Scala SBT Scoverage without running 'sbt clean' 【发布时间】: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、...),这会导致覆盖数据不一致。也许可以在后续构建中存储和重用序列,但没有人尝试过。 【参考方案1】:

我将复制发布在这个问题上的 cmets:

马特乌斯·库布佐克:

根据我的经验,这正是覆盖的问题 - 在覆盖检测期间,它只会注意到部分代码以某种方式受到影响。如果你清理它,它将测量整个代码的覆盖率。如果你在那之后重复测量,它只会测量......我猜是增量编译所触及的部分。

Grzegorz Slowikowski:

SBT 编译是增量的,Scoverage 使用序列来识别它所检测的语句。这个序列不存储在任何地方,它在每次编译时都会被重置。对于增量编译,不同的语句将重用相同的第一个序列号(1、2、3、...),这会导致覆盖数据不一致。也许可以在后续构建中存储和重用序列,但没有人尝试过。

【讨论】:

以上是关于是否可以在不运行“sbt clean”的情况下运行 Scala SBT Scoverage的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在不调用“节点”的情况下运行 Node.js 脚本?

是否可以在不指定 --prefix 的情况下重新运行 configure,但保留之前运行时指定的前缀?

是否可以在不保存的情况下运行python脚本? [关闭]

是否可以在不使用类变量的情况下在运行时在实例上创建 pyqtSignals?

是否可以在不运行 DbVisualizer + SQLite 中的原始 sql 的情况下更改列

是否可以在不做任何更改的情况下在 Android 手机中运行 JavaFX 桌面应用程序? [复制]