2014-09-10 46 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 
    ) 
相關問題