【发布时间】:2014-05-04 15:13:03
【问题描述】:
我有一个 SBT 项目,它具有完整的构建定义和用于测试的自定义配置。
我添加了一个带有自己配置的插件,如果可能的话,我希望能够使用这两种配置来执行任务。
如果不可能,我想将插件中的配置拉入我的自定义配置中。
具体情况
我的自定义配置是unit,用于将某些测试分类为单元测试,我想使用sbt-scoverage 添加覆盖范围。
我的完整构建定义包括:
lazy val UnitTest = config("unit") extend(Test)
def unitTestFilter(name: String) = name endsWith "UnitSpec"
lazy val myProject = Project(id="MyProject")
.configs( UnitTest )
.settings( inConfig(UnitTest)(Defaults.testTasks) : _*)
.settings(
testOptions in UnitTest := Seq(Tests.Filter(unitTestFilter)),
parallelExecution in UnitTest := true
)
为了执行单元测试,我运行sbt unit:test。
我将如何 A) 在构建定义中将 sbt-scoverage 添加到 unit 配置,或 B) 在 SBT 运行中同时包含 scoverage 和 unit 配置,例如sbt "unit,scoverage:test"?
edit根据提供的 2 个答案,我正在接近我想要的。我现在遇到的问题是测试过滤器,并将其应用于配置。我已经更新了上面的原始代码 sn-p 以包含我使用的基于文件名的过滤器 - 请参阅项目部分中的 testOptions 以及我如何使用 unitTestFilter。为了增加覆盖率,我为覆盖率测试添加了新配置,所以现在有UnitTest、ComponentTest、CoverageUnitTest 和CoverageComponentTest。我现在遇到的问题是我无法让测试选项/文件名过滤器传播到覆盖配置。
方法 1:创建扩展 scoverageTest 的配置
lazy val CoverageUnitTest = config("coverUnit") extend (scoverageTest)
def unitTestFilter(name: String) = name endsWith "UnitSpec"
lazy val myProject = Project(id="MyProject")
.configs( UnitTest, CoverageUnitTest )
.settings(
testOptions in CoverageUnitTest := Seq(Tests.Filter(unitTestFilter)),
parallelExecution in CoverageUnitTest := true
)
在上述方法中,不应用设置。如果我运行coverUnit:test,它会同时执行组件和单元规范。我也尝试过使用testOptions in scoverageTest,它适用于过滤器,但问题是我的项目中有2个配置,即CoverageUnitTest和CoverageComponentTest,如果我使用in scoverageTest,那么只有1个过滤器适用于这两个任务(即coverUnit:test 和coverComponent:test 都执行单元测试或组件测试,基于顺序)。
方法2:扩展测试并在instrumentation中添加
lazy val CoverageUnitTest = config("coverUnit") extend (Test)
def unitTestFilter(name: String) = name endsWith "UnitSpec"
lazy val myProject = Project(id="MyProject")
.configs( UnitTest, CoverageUnitTest )
.settings( inConfig(CoverageUnitTest)(ScoverageSbtPlugin.instrumentSettings) : _* )
.settings(
testOptions in CoverageUnitTest := Seq(Tests.Filter(unitTestFilter)),
parallelExecution in CoverageUnitTest := true
)
同样,此方法不会使用 unitTestFilter 过滤测试。
通过查看 ScoverageSbtPlugin 源代码,看来我可能需要以某种方式覆盖它: inConfig(scoverageTest)(Defaults.testSettings) ++,这是正确的方法吗?
编辑 #2 这是一种解决方法,使用方法 1,将“CoverageUnitTest”替换为“scoverageTest”:
lazy val dynamicTestFilter(name:String):Boolean = name endsWith scala.util.Properties.envOrElse("TEST_TYPE","UnitSpec")
使用TEST_TYPE=ComponentSpec sbt coverComponent:test运行
【问题讨论】:
-
虽然我回复了,但我仍然不确定。 “将 sbt-scoverage 添加到构建定义中的单元配置”是什么意思??您将如何验证您的构建配置是否满足要求?
-
基本上想运行
unit:test并从中获得覆盖率报告。我不介意创建一个新配置,例如unitcoverage,这将允许我运行sbt unitscoverage:test来运行我的单元测试和覆盖率报告。
标签: unit-testing sbt scoverage