gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 00:04:28 25 4
gpt4 key购买 nike

我有一个 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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com