如何默认禁用"Slow"标记的Scalatests,允许执行选项?

cla*_*lay 12 unit-testing scala sbt scalatest

我想默认禁用标记为"慢"的某些自动化测试,但允许用户使用简单的命令行启用它们的执行.我想这是一个非常常见的用例.

鉴于此测试套件:

import org.scalatest.FunSuite
import org.scalatest.tagobjects.Slow

class DemoTestSuite extends FunSuite {
  test("demo test tagged as slow", Slow) {
    assert(1 + 1 === 2)
  }

  test("demo untagged test") {
    assert(1 + 1 === 2)
  }
}
Run Code Online (Sandbox Code Playgroud)

默认情况下,sbt test将运行标记和未标记的测试.

如果我将以下内容添加到build.sbt:

testOptions in Test += Tests.Argument("-l", "org.scalatest.tags.Slow")
Run Code Online (Sandbox Code Playgroud)

然后,我得到了我想要的默认行为,其中未标记的测试运行,并且慢速标记的测试将不会运行.

但是,当我想运行它们时,我无法弄清楚将运行慢速测试的命令行选项.我做了几次搜索并尝试了几个例子.我有点惊讶,因为这似乎是一种非常常见的情况.

lau*_*lic 8

我有一个类似的问题:我希望默认情况下禁用测试,但在发布过程中运行.我通过创建自定义测试配置testOptions在不同范围设置来解决它.因此,根据您的情况调整此解决方案,它应该是这些内容(在您的build.sbt)中:

lazy val Slow = config("slow").extend(Test)
configs(Slow)
inConfig(Slow)(Defaults.testTasks)
Run Code Online (Sandbox Code Playgroud)

现在默认排除慢速测试:

testOptions in Test += Tests.Argument("-l", "org.scalatest.tags.Slow")
Run Code Online (Sandbox Code Playgroud)

但是在Slow范围内不要排除它们并仅运行它们:

testOptions in Slow -= Tests.Argument("-l", "org.scalatest.tags.Slow")
testOptions in Slow += Tests.Argument("-n", "org.scalatest.tags.Slow")
Run Code Online (Sandbox Code Playgroud)

现在,当你test在sbt中运行时,它将运行除慢速测试之外的所有内容,当你运行slow:test它时,它将运行慢速测试.