2017-07-28 52 views
0

正如我们在Play中已知的那样,每个测试(单元和功能)都位于测试文件夹中。我们怎样才能标记我们的功能测试和单元测试,使得我们只能在一次运行中运行功能测试,而在另一次运行中只能运行单元测试?如何仅运行函数/单元测试

而且我想在不为每种类型(即测试/单元/ ...和测试/功能/ ...)提供软件包的情况下实现这一目标。这个解决方案的问题是让我们说你有一个app/auth文件夹(所以一个auth包)。您的单元测试将在package unit/auth中,并且无法看到任何包私有方法/字段/类。

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

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

回答

1

测试中播放基于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仍然会运行所有的测试,包括你的自定义过滤器

+1

正是我一直在寻找。谢谢! – Jeep87c

0

这是我使用@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

相关问题