我有一个带有一堆测试(使用ScalaTest运行的(的Play框架,我正在尝试通过以下方式组织它们:
- 单元测试
- 集成测试读取
- 集成测试编写
我保留了所有单元测试未标记,并创建了以下标记:
/* 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
来运行它们。