如何仅运行功能/单元测试



正如我们在Play中已经知道的那样,每个测试(单元和功能(都位于测试文件夹中。我们如何标记功能和单元测试,以便我们可以在一次运行中只运行功能测试,而在另一次运行中只运行单元测试?

我想在没有每种类型(意味着测试/单元/...和测试/功能/...此解决方案的问题是假设您有一个 app/auth 文件夹(因此是一个身份验证包(。您的单元测试将位于包单元/身份验证中,并且无法看到任何包私有方法/字段/类。

正确的方法是什么?Play期望我们如何实现这一目标?

IMO,最好的方法是有两个测试文件夹,一个用于单元,一个用于功能。但恐怕这会破坏sbt test和相关任务。

Play 中的测试基于 sbt

您可以使用测试筛选器配置build.sbt

testOptions in Test := Seq(Tests.Filter(name => name contains "IntegrationTest"))

因此,像这样的东西将允许您运行sbt custom:test并且它只会运行那些通过TestsFilter谓词的测试。

lazy val CustomIntTest = config("custom") extend Test
lazy val root = (project in file(".")).enablePlugins(PlayScala)
.configs(CustomIntTest)
.settings(inConfig(CustomIntTest)(Defaults.testTasks):_*)
.settings(
testOptions in CustomIntTest := Seq(Tests.Filter(name => name.contains("Identifier")))
)

例如MyCoolIdentifierTest会跑,但MyCoolTestMyCoolidentifierTest不会。很酷的一件事是sbt test仍然可以运行所有测试,包括您的自定义过滤器

这是我使用@tgk答案的最终build.sbt配置。

lazy val AcceptanceTestConfig = config("acceptance") extend Test
lazy val UnitTestConfig = config("unit") extend Test
lazy val root = (project in file(".")).enablePlugins(PlayScala)
.configs(AcceptanceTestConfig)
.settings(inConfig(AcceptanceTestConfig)(Defaults.testTasks):_*)
.settings(
testOptions in AcceptanceTestConfig := Seq(Tests.Filter(name => name.contains("Acceptance")))
)
.configs(UnitTestConfig)
.settings(inConfig(UnitTestConfig)(Defaults.testTasks):_*)
.settings(
testOptions in UnitTestConfig := Seq(Tests.Filter(name => !name.contains("Acceptance")))
)

让我们sbt acceptance:testsbt unit:test奔跑

最新更新