Scala SBT:如何修改它:使用调用原始测试任务的任务进行测试?

Scala SBT:如何修改它:使用调用原始测试任务的任务进行测试?,scala,sbt,Scala,Sbt,在下面的my Build.scala文件片段中,itTestWithService任务在运行集成测试前后启动测试服务器 我想将此itTestWithService任务附加到it:test键。但是怎么做呢 lazy val mohs = Project(id = "mohs", base = file(".")) .settings ( // I'd like the following but it creates a cycle that fails at

在下面的my Build.scala文件片段中,
itTestWithService
任务在运行集成测试前后启动测试服务器

我想将此
itTestWithService
任务附加到it:test键。但是怎么做呢

  lazy val mohs =
    Project(id = "mohs", base = file("."))
     .settings (
        // I'd like the following but it creates a cycle that fails at runtime:
        // test in IntegrationTest <<= testWithService   
        itTestWithService <<= testWithService
      )

  val itTestWithService = taskKey[Unit]("run integration test with background server")

  /** run integration tests against a test server.  (the server is started before the tests and stopped after the tests) */
  lazy val testWithService = Def.task {
    val log = streams.value.log
    val launched = (start in testService).value
    launched match {
      case Success(_) =>
        testAndStop.value
      case Failure(e) =>
        val stack = e.getStackTrace().mkString("\n")
        log.error(s"failed to start test server: $e \n ${stack}")
    }
  }

  /** run integration tests and then stop the test server */
  lazy val testAndStop = Def.taskDyn {
    val _ = (test in IntegrationTest).value
    stop in testService
  }
lazy val mohs=
项目(id=“mohs”,base=文件(“.”)
.设置(
//我想要以下内容,但它会创建一个在运行时失败的循环:

//集成测试中的测试您可以在build.scala中添加自定义测试标记。以下是我的一个项目中的示例代码。请记住,您不必将其绑定到它:test。您可以随意命名它

lazy val AcceptanceTest = config("acc") extend(Test)

  lazy val Kernel = Project(
    id = "kernel",
    base = file("."),
    settings = defaultSettings ++ AkkaKernelPlugin.distSettings ++ Seq(
        libraryDependencies ++= Dependencies.Kernel,
        distJvmOptions in Dist := "-Xms256M -Xmx2048M",
        outputDirectory in Dist := file("target/dist"),
        distMainClass in Dist := "akka.kernel.Main system.SystemKernel"
      )
  ).configs(AcceptanceTest)
   .settings(inConfig(AcceptanceTest)(Defaults.testTasks): _*)
   .settings(testOptions in AcceptanceTest := Seq(Tests.Argument("-n",
     "AcceptanceTest"), Tests.Argument("-oD")))
请注意顶部的lazy val和.configs部分

在这种设置下,当我键入acc:test时,它会运行带有AcceptanceTestTag的所有测试。您可以将服务器作为测试套件调用的一部分启动。甚至可以通过需要服务器和不需要服务器来标记测试,以便在套件变大和运行时间变长时将它们分开

编辑:添加以响应评论

要标记测试,请创建如下标记

import org.scalatest.Tag
object AcceptanceTest extends Tag("AcceptanceTest")
然后把它放在你的测试中

it("should allow any actor to subscribe to any channel", AcceptanceTest) {
这将响应上面相同的构建设置。当我调用acc:test时,只有带有该标记的测试才会运行

对于你的问题,我想到的是我在相同情况下使用的解决方案。现在,你正在build.scala中进行工作。我不确定是否有可能做到你在那里所说的……但我做的是相同的事情,但有点不同。我有一个特点,我将其融入到所有需要一个流浪服务器的测试中。我标记tes将其用作漂泊测试的ts

它的工作原理就像一个单例。如果一个或多个测试需要它,它就会启动。但它只会启动一个测试,所有测试都会使用它

你也可以尝试做同样的事情,但要克服它:在配置文件中进行测试。在上面的例子中,用“it”代替“acc”。如果这不是你想要的,可能需要看看是否有其他人出现

因此,基本上当我调用它时:test它访问运行所有带有IntegrationTest标记的测试(以及带有VagrantTest和一些其他标记的测试)。因此,所有运行时间较长的服务器测试都不会运行太多(需要太长时间)。

在一篇相关文章中,Josh针对我询问的特定案例提出了一种方法(覆盖它:使用调用原始测试任务的任务进行测试)

这种方法的工作原理是重新实现测试任务。我不知道是否有更通用的方法可以访问任务的原始版本。(更通用的方法会比这个更好!)

以下是如何重新实现it:测试任务:

  /** run integration tests (just like it:test does, but explicitly so we can overwrite the it:test key */
  lazy val itTestTask: Initialize[Task[Unit]] = Def.taskDyn {
    for {
      results <- (executeTests in IntegrationTest)
    } yield { Tests.showResults(streams.value.log, results, "test missing?") }
  }
现在,插入我们内置在it:test键中的复合任务不会创建循环:

  lazy val mohs =
    Project(id = "mohs", base = file("."))
      .settings (
        test in IntegrationTest <<= testWithServiceTask,
      )
lazy val mohs=
项目(id=“mohs”,base=文件(“.”)
.设置(

在IntegrationTest中测试啊,谢谢你的回答。你如何标记你的测试?听起来很有趣。我知道我可以使用一个新键或不同范围的键。原始问题在同一配置中使用一个新键,而你的示例在不同范围中使用一个键。但这里的问题是是否可以使用同一配置范围(it)中的同一个键(测试)。我认为如果我的用户能够重用他们从其他构建中了解的关于如何运行集成测试的知识,而不必记住此测试的新内容,那将是一件好事。忘了提一下,每个测试都可以有多个标记。
  lazy val mohs =
    Project(id = "mohs", base = file("."))
      .settings (
        test in IntegrationTest <<= testWithServiceTask,
      )