我有一个带有一堆测试的 Play 框架(使用 ScalaTest 运行),我尝试通过以下方式组织它们:
我没有标记所有单元测试,并创建了以下标签:
/* TestTags.scala */
object IntegrationReadTest extends Tag("IntegrationReadTest")
object IntegrationWriteTest extends Tag("IntegrationWriteTest")
这样我就可以像这样标记我的集成测试:
/* SomeSpecs.scala */
"foo" taggedAs IntegrationReadTest in {
// External APIs are read from
}
"bar" taggedAs IntegrationWriteTest in {
// External APIs are written to
}
大多数时候,当我开发和运行测试时,我不想想要运行集成测试,所以我修改了我的
build.sbt
以在运行时忽略它们sbt test
:
/* build.sbt */
testOptions in Test += Tests.Argument("-l", "IntegrationReadTest")
testOptions in Test += Tests.Argument("-l", "IntegrationWriteTest")
这一切都运行良好,但我无法弄清楚如何运行所有测试(包括集成测试)。我尝试了
sbt test
和 sbt "test:testOnly"
的多种组合,但不知道如何取消忽略集成测试。
默认情况下,您的测试在测试上下文中运行。这意味着sbt测试真的在做
sbt Test/test
。由于您正在设置 testOptions in Test
,因此默认情况下适用。
从此,您可以创建一个新的上下文
All
,将这些测试放回其中。
/* build.sbt */
lazy val All = config("all") extend(Test) describedAs("run all the tests")
configs(All)
inConfig(All)(Defaults.testSettings)
testOptions in All -= Tests.Argument("-l", "IntegrationReadTest")
testOptions in All -= Tests.Argument("-l", "IntegrationWriteTest")
然后你可以运行
sbt All/test
来运行它们。