是否可以在不运行“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,但保留之前运行时指定的前缀?
是否可以在不使用类变量的情况下在运行时在实例上创建 pyqtSignals?