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

SBT don't run any Specs2 test in custom test configuration

我有一个多项目,它们之间共享一些设置和自定义配置。这些设置是应该 运行 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) 的工作示例,我无处可找到有关如何组合它们的信息。

为了让一切都按我的意愿工作,我必须设置一些东西。最终解决方案如下所示:

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 时,它会自动传播到扩展它的所有内容,因此我在派生配置中有两个相互冲突的参数。使用 := 我摆脱了不需要的参数,事情又开始了。

None 我在文档中发现的那些怪癖,解决方案是将我发现的几个问题和大量尝试的解决方案放在一起的效果。