SBT不在自定义测试配置中运行任何Specs2测试

时间:2015-09-23 09:19:33

标签: unit-testing sbt specs2

我有一个多项目,其中包含一些设置和自定义配置。这些设置是应该按标签运行Specs2测试的配置。但是,当我运行这些新配置时,它们根本没有运行任何测试。

import sbt.TestFrameworks.Specs2
import sbt.Tests.Argument
import sbt._
import sbt.Keys._

trait Settings extends Dependencies {

  lazy val FunctionalTest = config("functional") extend(Test)

  val commonConfigs = Seq(FunctionalTest)

  val commonSettings =
    inConfig(FunctionalTest)(Defaults.testSettings) ++
    Seq(
      libraryDependencies ++= mainDeps,
      libraryDependencies ++= testDeps map (_ % "test"),

      testOptions in Test += Argument(Specs2, "exclude", TestTag.FunctionalTest),
      testOptions in FunctionalTest += Argument(Specs2, "include", TestTag.FunctionalTest)
    )
}

在定义functional:test这样的任务后,它不会运行任何测试,而test任务将在未使用TestTag.FunctionalTest标记的所有子项目中运行所有测试。

删除testOptions in FunctionalTest += Argument(Specs2, "include", TestTag.FunctionalTest)不会更改结果,但删除inConfig(FunctionalTest)(Defaults.testSettings) ++使functional:test的行为与test完全相同(运行除TestTag.FunctionaTest以外的所有内容)。

如何让test运行除TestTag.FunctionalTest标记测试(现在是)和functional:test之外的所有内容,只运行标记测试?我查看了SBT和Spec2文档,但是他们只有通过名称(SBT)过滤测试或使用命令行参数过滤它们(Specs2)的工作示例,我找不到有关如何组合它们的信息。

1 个答案:

答案 0 :(得分:1)

为了让一切按照我的意愿运作,我必须设置几件事。最终解决方案看起来像这样:

trait Settings extends Dependencies {

  lazy val FunctionalTest = config("functional") extend(Test)

  val commonConfigs = Seq(FunctionalTest)

  val functionalSettings =
    inConfig(FunctionalTest)(Defaults.testTasks) ++
    Seq(testOptions in FunctionalTest := Argument(Specs2, "include", TestTag.FunctionalTest))

  val commonSettings =
     ++
    Seq(
      libraryDependencies ++= mainDeps,
      libraryDependencies ++= testDeps map (_ % "test"),

      testOptions in Test += Argument(Specs2, "exclude", TestTag.FunctionalTest)
    )
}

用作:

project.
  configs(commonConfigs).
  settings(functionalSettings: _*).
  settings(commonSettings: _*)

为了让它按照我的意图运作,我必须修理的事情:

  1. 将设置分为几个步骤:

    当我通过连接它们并应用project.settings(allSettingsAtOnce: _*)来创建大量设置时,事情就会中断。将它们分开是实现functional:test工作的第一步。它还允许我应用修复#3,因为在创建一系列设置时testOptions := option不可用。

  2. Defaults.testSettings替换为Defaults.testTasks

    inConfig(FunctionalTest)(Defaults.testSettings)没有运行任何测试。任务在启动后立即成功,没有来自测试框架的任何报告。

  3. testOptions in FunctionalTest += option替换为testOptions in FunctionalTest := options

    使用+=,我最终同时获得了exclude functionalinclude functional个测试框架参数。我想当我将参数附加到Test时,它会自动传播到扩展它的所有内容,因此我在派生配置中有两个冲突的参数。使用:=我摆脱了不必要的争论,事情再次发挥作用。

  4. 我发现在文档中描述的这些怪癖都没有,解决方案是将我发现的几个问题的解决方案放在一起并进行大量尝试的效果。