我有一个Play框架 2.3项目,希望按照以下方式分离单元测试和功能测试:
- 运行
sbt test
应该只运行单元测试并排除集成测试 - 运行
sbt it:test
应该只运行集成测试
Scala文档建议使用project/Build.scala
,但是我想要使用build.sbt
和project/Build.scala
的组合方式,所以我的配置看起来像这样(我也尝试将所有配置放入Build.scala
):
build.sbt
....
libraryDependencies ++= Seq(
"com.typesafe.play" %% "play-json" % "2.2.3",
"org.scalatest" %% "scalatest" % "2.1.5" % "it, test",
"org.mockito" % "mockito-all" % "1.9.5" % "it, test"
)
def funTestFilter(name: String): Boolean = ((name endsWith "ItTest") || (name endsWith "IntegrationTest"))
def unitTestFilter(name: String): Boolean = ((name endsWith "Test") && !funTestFilter(name))
testOptions in IntegrationTest := Seq(Tests.Filter(funTestFilter))
testOptions in Test := Seq(Tests.Filter(unitTestFilter))
项目/Build.scala
import sbt._
object Build extends Build {
lazy val root =
Project("root", file("."))
.configs( IntegrationTest )
.settings( Defaults.itSettings : _* )
}
在这种配置下,运行sbt test
将不包括我的集成测试(以IntegrationTest
结尾),但是运行sbt it:test
找不到任何测试。
文章建议将文件放在特定路径中,但我不知道Play项目的对应路径是什么。
使用标准的源代码层次结构:
src/it/scala for Scala sources
src/it/java for Java sources
src/it/resources for resources that should go on the integration test classpath
build.sbt
中更改设置,将我的集成测试移动到那里,方法是将sourceDirectory in IntegrationTest := baseDirectory.value / "it"
读取。然后它会找到通常的it/java
、it/scala
、it/resources
目录。 - mikebridgeUnitTest
也以ItTest
结尾,并且ItTest
解析为IntegrationTestTest
的事实;-) - conny