我有一个 Play Framework 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
中设置集成测试- 在另一个问题 What would be the minimal setup of IntegrationTest configuration in sbt 0.13.x? 中有描述-- 归结为 build.sbt
中的以下条目:
Defaults.itSettings
lazy val root = project.in(file(".")).configs(IntegrationTest)
由于 Play 项目定义如下:
lazy val root = (project in file(".")).enablePlugins(PlayScala)
你应该添加
configs
你就完成了。lazy val root = project in file(".") enablePlugins(PlayScala) configs(IntegrationTest)
做
reload
或重新启动 sbt/activator session 并执行 it:test
.[it-play] $ it:test
[info] Updating {file:/Users/jacek/sandbox/it-play/}root...
[info] Resolving jline#jline;2.11 ...
[info] Done updating.
[success] Total time: 1 s, completed Sep 13, 2014 7:12:27 PM
至于集成测试应该在 Play 项目中的位置,简短的回答是 do
show it:sourceDirectory
在 shell 中,即 src/it
与 scala
, java
和 resources
下面的目录包含各自的来源。在
it
中添加测试框架库配置,即在 build.sbt
应该有类似的东西 - 注意 it
配置:"org.specs2" %% "specs2" % "2.4.2" % "it"
做
reload
sbt session 或重新启动它,然后 it:test
应该与 Specs2 测试一起用于 src/it/scala
下的所有测试.要缩小应执行的测试范围,请添加过滤器 - 确保它位于
Defaults.itSettings
行之后因为顺序很重要,一个可以覆盖另一个:val funTestFilter: String => Boolean = { name =>
(name endsWith "ItTest") || (name endsWith "IntegrationTest")
}
testOptions in IntegrationTest += Tests.Filter(funTestFilter)
做
reload
或者重启 sbt 并执行 it:test
.它应该工作。做 show it:testOptions
确保您的设置正确加载:[it-play] $ show it:testOptions
[info] List(Filter(<function1>))
整个
build.sbt
对我有用的如下 - 它是由 activator new it-play play-scala
创建的:name := """it-play"""
version := "1.0-SNAPSHOT"
lazy val root = project in file(".") enablePlugins(PlayScala) configs(IntegrationTest)
scalaVersion := "2.11.1"
libraryDependencies ++= Seq(
jdbc,
anorm,
cache,
ws,
"org.specs2" %% "specs2" % "2.4.2" % "it"
)
Defaults.itSettings
val funTestFilter: String => Boolean = { name =>
(name endsWith "ItTest") || (name endsWith "IntegrationTest")
}
testOptions in IntegrationTest += Tests.Filter(funTestFilter)
关于scala - 为什么在使用 "sbt it:test"时没有执行 Play/Scala 项目中的集成测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25818138/