如何在SBT中运行测试套件之前启动服务器?

时间:2014-09-10 13:30:45

标签: scala sbt

问题是如果test in Test <<= (taskA, taskB) { (A, B) => A doFinally Btest in Test := (taskB dependsOn taskA).valuetaskA forkedtaskB,则sbt执行不会继续doFinally/dependsOn并获取& #39;无限期地被卡住了。它是由lazy val startServer = taskKey[Unit]("Start PingPong Server before running Scala-JS tests") lazy val jvm = project.in(file("jvm")) fork in (Test, runMain) := true startServer := { (runMain in Test).toTask(" com.example.PingPong").value } ) lazy val js = project.in(file("js")) test in Test <<= (startServer in Project("jvm", file("jvm")), test in(Test, fastOptStage)) { (startServer, test) => startServer doFinally test } ) 引起的,因为它们可能使它成为单线程顺序执行。但我无法找到任何其他方式来订购这两项任务,使它们按顺序运行。

到目前为止,我已经走到了这一步:

startServer

sbt执行在生成线程的任务fork in startServer := true上停止,甚至是守护进程。我试过dependsOn,但没有帮助。

我也试过了test in Test := { (test in(Test, fastOptStage)).dependsOn(startServer in Project("jvm", file("jvm"))).value } ,但它也阻止了:

PingPong

如果我没有在主类doFinally中启动服务器,它的行为符合预期。此外,如果我这样做,它可以工作,但它有一个随机的执行顺序,我不知道如何在没有test in Test := { (startServer in Project("jvm", file("jvm"))).value (test in(Test, fastOptStage)).value } 的情况下强制执行它。

{{1}}

我想我必须尝试sbt-sequential或分叉新流程。

2 个答案:

答案 0 :(得分:1)

我可以建议更简单的解决方法,而不是处理SBT。使用静态方法创建类以启动服务器(它将检查服务器是否尚未启动),并在每个测试中显式启动此服务器。您需要设置&#34; fork in Test:= true&#34;,在单独的JVM中运行服务器并在测试完成后关闭它。

我使用这种方法启动嵌入式Cassandra服务器进行集成测试

就我的情况而言,它是使用Java的静态方法,您可以使用Scala和伴随对象执行相同的操作。

  override def beforeAll() {
    log.info(s"Start Embedded Cassandra Server")
    EmbeddedCassandraServerHelper.startEmbeddedCassandra("/timeseries.yaml")
  }

public static void startEmbeddedCassandra(String yamlFile, String tmpDir) throws TTransportException, IOException, ConfigurationException {
        if (cassandraDaemon != null) {
            /* nothing to do Cassandra is already started */
            return;
        }

     // ... Start new server
}

答案 1 :(得分:1)

由于某些原因,这些设置都不会产生新的过程:

fork := true
fork in runMain := true
fork in Test := true
fork in (Test, runMain) := true

这就是顺序dependsOn/doFinally阻塞的原因,因为进程没有分叉...

我尝试使用revolver完全相同,但它确实有效。我向所有试图在sbt中分叉进程的人推荐左轮手枪,因为至少从这种体验中不能依赖sbt的fork

lazy val startServer = taskKey[Unit]("Start PingPong Server before running JS tests")

lazy val jvm =
     project.in(file("jvm"))
        mainClass in Revolver.reStart := Option("com.example.PingPong"),
        startServer := {
          (Revolver.reStart in Test).toTask("").value
        }
      )

lazy val js =
    project.in(file("js"))
       test in Test := (test in(Test, fastOptStage)).dependsOn(startServer in Project("jvm", file("jvm"))).value
     )