scala - 为什么在使用 "sbt it:test"时没有执行 Play/Scala 项目中的集成测试?

标签 scala sbt playframework-2.3

我有一个 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/itscala , javaresources下面的目录包含各自的来源。

    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/

    相关文章:

    sql - 如何创建 UDF 来查找数组列中的索引

    java - Play Framework 2.3.7 : Static assets location not working in production

    scala - case y::ys 是什么意思?

    scala - 在 Scala 中将 lambda 与泛型类型结合使用

    scala - IntelliJ 无法解析 build.sbt 中的符号

    playframework-2.0 - SBT。解决 play sbt-plugin 的依赖关系

    scala - 将参数传递给通过 sbt 执行的 scala 测试

    java - 如何在 play (2.3) 框架内从 Java Controller 代码中的 String 变量构造 Html 对象

    akka - 避免 akka 终止 webapp JVM 进程

    scala - 如何创建 scala.concurrent.ExecutionContext