Scala 3 结合 sbt-sonar 单元测试覆盖率统计异常求助
Scala 3 + sbt-sonar + sbt coverage 覆盖率不匹配(关联for推导式)
我在使用sbt-sonar 2.2.0搭配Scala 3.3.1开发时遇到了覆盖率统计异常的问题:代码中包含for推导式和模式匹配,且已为这些逻辑编写了测试用例——调试时确认所有代码行都被覆盖,IntelliJ的覆盖率检测结果为100%,带真实数据运行测试也验证了代码确实被执行,但Sonar中显示的覆盖率却与实际不符。由于代码涉密,无法提供具体示例,想问问有没有人遇到过和for推导式相关的这类问题?
更新(2023年12月)
问题尚未解决,但已明确触发场景:仅在sbt coverage、Sonar与Scala 3三者组合使用时,才会出现覆盖率不匹配的问题。具体触发条件包括:
- 存在跨多行的语句
- 代码中包含
flatMap调用 - for推导式定义在方法内部(而非紧跟方法声明直接定义)
- 存在
match模式匹配语句
另外发现一个额外现象:Sonar中显示的行号比源代码少2行。
该问题曾在Scala贡献者论坛被讨论,Scala创始人Martin Odersky也参与了相关讨论。
临时解决方案
- 避免使用上述触发条件中的语句写法
- 将Sonar未识别的代码行封装为独立方法,封装后Sonar可正常识别这部分代码的覆盖率
内容的提问来源于stack exchange,提问作者André Luís Oliveira
相关产品推荐
相关产品推荐

