2017-03-26 2 views
0

Ich versuche, sbt so zu konfigurieren, dass am Anfang von myProject/test eine Setup-Task zu Beginn und eine Teardown-Task ausgeführt wird.Ausführen von Setup-/Teardown-Tasks während der Stb-Test-Task

Mein build.sbt ist hier:

name := "ch-2" 

version := "1.0" 

libraryDependencies += "org.specs2" % "specs2_2.10" % "1.14" % "test" 

lazy val common = (
    Project("common", file("common")). 
    settings() 
) 

lazy val subPro = (
    Project("sub", file("subA")).settings(
).dependsOn(common) 
    settings(libraryDependencies += "org.specs2" % "specs2_2.10" % "1.14" % "test") 
) 

val startS = taskKey[Unit]("Start") 
val stopS = taskKey[Unit]("Stop") 
startS := { println("Running start")} 
stopS := { println("Running stop")} 

testOptions in Test in subPro += Tests.Setup {() => startS.value } 
testOptions in Test in subPro += Tests.Cleanup {() => stopS.value } 

Die tatsächliche Blindtestklasse ist hier:

import org.specs2.mutable.Specification 
/** 
    * Created by jk on 26.3.2017. 
    */ 
object FooSpec extends Specification { 
    "The TEST method" should { 
    "blaa blaa 1" in { 
     println("test 1 running...") 
     true 
    } 
    "blaa blaa 2" in { 
     println("test 2 running...") 
     true 
    } 
    } 
} 

Wenn ich die Tests für die Projektunter laufen, bekomme ich folgende Ausgabe:

> sub/test 
Running stop 
Running start 
[info] Updating {file:/home/jk/workspace/sbt-in-action/ch2/}sub... 
[info] Resolving org.fusesource.jansi#jansi;1.4 ... 
[info] Done updating. 
[info] Compiling 1 Scala source to /home/jk/workspace/sbt-in-action/ch2/subA/target/scala-2.10/test-classes... 
test 1 running... 
test 2 running... 
[info] FooSpec 
[info] 
[info] The TEST method should 
[info] + blaa blaa 1 
[info] + blaa blaa 2 
[info] 
[info] 
[info] Total for specification FooSpec 
[info] Finished in 18 ms 
[info] 2 examples, 0 failure, 0 error 
[info] 
[info] Passed: Total 2, Failed 0, Errors 0, Passed 2 
[success] Total time: 3 s, completed Mar 26, 2017 7:09:34 PM 

Warum Stop-Task ausgeführt wird, noch bevor Kompilierung abgeschlossen ist und wie es behoben wird, damit es nach allen Testfällen ausgeführt wird laufen (trotz des Ergebnisses der Testfälle)?

Auch die Startaufgabe sollte nach erfolgreicher Kompilierung aber vor dem ersten Testfall laufen. Wie behebt man diese?

+0

Gibt es einen Grund, warum FooSpec ein Objekt und keine Klasse ist? – Chrs

+0

Ich habe es einfach von einem Beispiel kopiert (wo es aus irgendeinem Grund ein Objekt war), um den Beispielcode zu erhalten. – user4955663

Antwort

0

Wie wäre es stattdessen damit?

def startS(): Unit = { println("Running start")} 
def stopS(): Unit = { println("Running stop")} 

testOptions in Test in subPro += Tests.Setup {() => startS() } 
testOptions in Test in subPro += Tests.Cleanup {() => stopS() } 
+0

Außerdem denke ich, dass die Diskussion hier erklärt, warum es nicht so funktioniert, wie Sie es erwarten würden, wenn Sie Aufgaben verwenden: http://www.scala-sbt.org/0.13/docs/Custom-Settings.html#Execution+ Semantik + von + Aufgaben – Chrs

+0

Danke für den Link. Es erklärt dieses Problem zumindest teilweise ("Aufrufwertmethode auf Aufgaben wird nicht streng ausgewertet"). – user4955663

Verwandte Themen