2014-09-10 93 views
2

问题是如果我做test in Test <<= (taskA, taskB) { (A, B) => A doFinally Btest in Test := (taskB dependsOn taskA).valuetaskAforked,那么执行不会继续到taskB并且get无限期地卡住。这是由doFinally/dependsOn造成的,因为它们可能使它成为单线程顺序执行。但我找不到任何其他方式来订购这两项任务,让它们顺序运行。如何在SBT中运行测试套件之前启动服务器?

到目前为止,我已经这么远得到:上产生一个线程,甚至是守护一个任务startServer

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 
     } 
    ) 

的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 
} 

我想我会去尝试sbt-sequential或fork一个新的过程。

回答

1

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

我用这种方式启动嵌入式卡桑德拉服务器集成测试

对我来说,它与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

我也这样做,我只需要启动该服务器从通过任务SBT从各种其他原因......它只是需要被分叉的一种方式,但SBT的叉子是行不通的,左轮手枪没有... – lisak 2014-09-10 16:06:17

+0

也是在这种特殊情况下,你不能做你的建议,因为'js'项目被编译为javascript并且在phantomJS上运行,并且jvm项目具有Java依赖项。因为我需要测试scalaJS项目,所以我不能依赖具有Java依赖性的JVM项目,该项目不会编译为javascript :-)这有点麻烦 – lisak 2014-09-10 22:04:57

1

对于没有这些设置某种原因fork新进程:

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 
    ) 
相关问题