2012-10-25 12 views
12

Ich habe ein Play! 2 für Scala-Anwendung, und ich verwende Specs2 für Tests. Ich kann alle Tests mit dem Befehl test oder einer bestimmten Spezifikation mit test-only MyParticularSpec ausführen.Spielen! Framework: anpassen, welche Tests ausgeführt werden

Was würde Ich mag einige besondere Spezifikationen zu tun ist, markieren oder sogar einzelne Methoden innerhalb einer Spezifikation, um Dinge wie:

  • alle Tests ausführen, die nicht Integration sind (das heißt, die tun Zugriff auf externe Ressourcen nicht)
  • alle Tests ausgeführt wird, die nicht auf externe Ressourcen im Schreibmodus zugreifen kann (aber immer noch die Lesetests)
  • laufen alle Tests laufen aber eine gegebene

und so weiter.

Ich denke, so etwas sollte möglich sein, vielleicht durch Hinzufügen von Anmerkungen, aber ich bin mir nicht sicher, wie ich es machen soll.

Gibt es einen Mechanismus, um selektiv einige Tests durchzuführen und nicht andere?

EDIT Ich habe mich erhört, als test-only verwenden. Trotzdem funktioniert die Befehlszeilenoption für die Task test nicht. Im Anschluss an den sbt guide habe ich versucht, eine zusätzliche sbt-Konfiguration zu erstellen, wie

object ApplicationBuild extends Build { 
    // more settings 
    lazy val UnitTest = config("unit") extend(Test) 
    lazy val specs = "org.scala-tools.testing" %% "specs" % "1.6.9" % "unit" 

    val main = PlayProject(appName, appVersion, appDependencies, mainLang = SCALA) 
    .configs(UnitTest) 
    .settings(inConfig(UnitTest)(Defaults.testTasks) : _*) 
    .settings(
     testOptions in UnitTest += Tests.Argument("exclude integration"), 
     libraryDependencies += specs 
    ) 
} 

Dies funktioniert, wenn ich Argumente ohne Optionen übergeben, zum Beispiel wenn ich Test.Argument("plan") setzen. Aber ich konnte nicht herausfinden, wie man ein komplexeres Argument weitergibt. Ich habe versucht

Tests.Argument("exclude integration") 
Tests.Argument("exclude=integration") 
Tests.Argument("-exclude integration") 
Tests.Argument("-exclude=integration") 
Tests.Argument("exclude", "integration") 
Tests.Argument("exclude \"integration\"") 

und wahrscheinlich mehr. Noch immer keine Ahnung, was die richtige Syntax ist.

Kann jemand Argumente mit Optionen zu specs2 von sbt übergeben?

Antwort

4

Wenn Sie mehrere Argum übergeben möchten ents Sie können mehrere Strings hinzufügen eine Test.Argument

testOptions in Test += Tests.Argument("include", "unit") 

Es gibt Beispiele in der specs2 Benutzerhandbuch here und in der Play-Dokumentation there.

+0

Vielen Dank! Was in der Dokumentation nicht gut erklärt wird, ist, dass wir hier ein einzelnes Argument (ausschließen) mit einigen Optionen haben (was auszuschließen ist), und es ist nicht klar, dass man es wie separate Argumente weitergeben sollte. Eigentlich hatte ich das versucht ('Tests.Argument (" exclude "," integration ")) aber id hat nicht funktioniert. Ich habe jetzt herausgefunden, dass das Problem nicht diese Deklaration war, sondern die Tatsache, dass ich das Tag am Anfang der Spezifikation deklarierte ("etwas" sollte {tag ("integration") ...) und nicht auf der einzelne fragment. Ich werde versuchen herauszufinden, was damit nicht funktioniert. – Andrea

+0

Ich habe dieses Problem auch mit dem 'section'-Aufruf behoben, so dass jetzt alles funktioniert. Danke nochmal! :-) – Andrea

+0

Gut. Ich habe die Dokumentation für die nächste Version von specs2 geändert: http://etorreborre.github.com/specs2/guide-SNAPSHOT/guide/org.specs2.guide.Runners.html#with+sbt+%3E+0.9.x – Eric

7

Zuerst folgende the specs2 guide ein Tags zu den Spezifikationen müssen hinzufügen, wie diese

class MySpec extends Specification with Tags { 
    "My spec" should { 
    "exclude this test" in { 
     true 
    } tag ("foo") 

    "include this one" in { 
     true 
    } 
    } 
} 

Die Argumente Befehlszeile enthalten sind here dokumentiert

Dann kann man wahlweise ein- oder Test ausschließen mit

test-only MySpec -- exclude foo 
test-only MySpec -- include foo 
4

Sie können auch ohne Änderung Ihrer Build verwenden

test-only * -- exclude integration 

Getestet im Play-2.1-RC3

0

ich auf diese Frage kam, während, um herauszufinden, wie man mit Spielen etwas ähnliches für ScalaTest zu tun . SBT hat eine detaillierte Dokumentation, wie man additional test configurations konfiguriert, aber diese könnten ein wenig zwicken für Play.

Abgesehen von der subtil verschiedenen Projektkonfiguration habe ich festgestellt, dass ich einige der Testeinstellungen aus PlaySettings kritisieren wollte. Im Folgenden wird ein Intellij-Projekt mit Integrationstestquellen im Verzeichnis "/it" ausgeführt und generiert. Ich kann immer noch Berichterstattung und Lifecycle-Haken fehlt,

object BuildSettings { 
    def testSettings = { 
    // required for ScalaTest. See http://stackoverflow.com/questions/10362388/using-scalatest-in-a-playframework-project 
    testOptions in Test := Nil 
    } 

    def itSettings = { 
    // variously cribbed from https://github.com/playframework/Play20/blob/master/framework/src/sbt-plugin/src/main/scala/PlaySettings.scala 
    sourceDirectory in IntegrationTest <<= baseDirectory/"it" 
    scalaSource in Test <<= baseDirectory/"it" 
    libraryDependencies += "play" %% "play-test" % play.core.PlayVersion.current % "it" 
    } 
} 

object ApplicationBuild extends Build { 
    val main = play.Project(
    appName, 
    appVersion, 
    Dependencies.dependencies) 
    .configs(IntegrationTest) 
    .settings(Dependencies.resolutionRepos) 
    .settings(BuildSettings.testSettings) 
    .settings(Defaults.itSettings : _*) 
    .settings(BuildSettings.itSettings) 
} 
2

Ich verwende Play2.2, und es gibt zwei Möglichkeiten, je nach zu tun, ob Sie in der Spielkonsole sind.

  1. der Konsolentyp: test-only full.namespace.to.TestSpec
  2. Vom Terminal-Typ: test-only "full.namespace.to.TestSpec"
Verwandte Themen