Scala 3项目sbt-scoverage覆盖率报告存在未覆盖标记异常
Scala 3.2.2 + sbt-scoverage v2.0.0 覆盖率误判问题解决办法
问题根源
Scala 3编译器对for推导式这类语法做了优化,会生成一些合成代码,而v2.0.0版本的scoverage插件对Scala 3的字节码分析逻辑没跟上,导致部分内部语句被误标成未覆盖,尤其是Try类型的for推导式最容易出现这类问题。
解决步骤
1. 升级scoverage插件版本(最优先方案)
v2.0.0对Scala 3的支持不完善,直接升级到v2.2.0+(当前稳定版为v2.2.1),新版本专门修复了Scala 3语法的覆盖率追踪bug。修改project/plugins.sbt中的依赖:
addSbtPlugin("org.scoverage" % "sbt-scoverage" % "2.2.1")
2. 手动展开for推导式(临时 workaround)
如果暂时无法升级插件,把for推导式改成flatMap/map的链式调用,绕开编译器生成的合成代码干扰:
原代码示例:
for { summaries <- s3.list() summary <- summaries } yield processSummary(summary)
修改后:
s3.list().flatMap { summaries => summaries.map(processSummary) }
3. 补全测试用例的分支覆盖
别只覆盖Try的成功和失败主分支,还要覆盖for推导式内部的子场景:
- 成功场景需包含
summaries为空和非空的情况 - 失败场景需触发
s3.list()返回不同类型的Failure
4. 彻底清理缓存后重新生成报告
旧缓存可能导致统计异常,执行更彻底的命令:
sbt clean coverage clean test coverageReport
(额外添加的clean确保测试类完全重新编译)
验证方式
生成报告后,打开target/scala-3.2.2/scoverage-report/index.html,重点检查之前误判的for推导式部分,确认是否已正确标记为覆盖。
内容的提问来源于stack exchange,提问作者Ahmad.Masood
相关产品推荐
相关产品推荐

