使用sbt coverage时,如何排除指定测试类不影响覆盖率报告?
如何在sbt覆盖率报告中排除特定测试类
针对你遇到的非功能性测试类干扰覆盖率统计的问题,有两种实用方案可以解决,无需拆分项目:
方案1:自定义测试配置隔离非功能性测试
通过在build.sbt中新增独立的测试配置,将非功能性测试类归类到该配置下,让默认的覆盖率任务仅扫描正式测试:
// 定义非功能性测试配置 lazy val NonFunctionalTest = config("nonfunc") extend Test lazy val root = (project in file(".")) .configs(NonFunctionalTest) .settings( // 给新配置套用默认测试设置 inConfig(NonFunctionalTest)(Defaults.testSettings), // 指定非功能性测试类的存放路径(比如src/nonfunc/scala) scalaSource in NonFunctionalTest := baseDirectory.value / "src" / "nonfunc" / "scala", // 让默认test任务仅执行Test配置下的测试 test := (test in Test).value, // 绑定coverage相关任务到Test配置,忽略非功能性测试 coverage := coverage.in(Test).value, coverageReport := coverageReport.in(Test).value )
之后运行sbt clean coverage test coverageReport只会统计Test配置下的测试,非功能性测试类不会被执行,自然不会干扰覆盖率结果。如需运行非功能性测试,可执行sbt nonfunc:test。
方案2:用测试标签筛选排除特定类
如果不想移动测试文件,可通过ScalaTest的标签功能标记非功能性测试,再在构建配置中排除这类标签的测试:
- 定义标签并标记测试类:
import org.scalatest.Tag // 定义非功能性测试标签 object NonFunctional extends Tag("nonfunctional") // 给目标测试类添加标签 class DoubleSpec extends AnyFunSpec with Matchers { override def tags = Set(NonFunctional) // 测试内容... }
- 在
build.sbt中配置测试筛选规则:
// 排除带有nonfunctional标签的测试 testOptions in Test += Tests.Argument(TestFrameworks.ScalaTest, "-l", "nonfunctional")
这样执行test任务时会自动跳过带标签的测试类,覆盖率报告也不会包含这类测试的执行数据,就能准确反映正式测试的覆盖情况。
内容的提问来源于stack exchange,提问作者codevineyard
相关产品推荐
相关产品推荐

