2012-06-22 10 views
93

Ich weiß, dass ein einzelner Test kann durch Laufen, in sbt ran,ScalaTest in sbt: Gibt es eine Möglichkeit, einen einzelnen Test ohne Tags auszuführen?

test-only *class -- -n Tag 

Gibt es eine Möglichkeit sbt/scalatest zu sagen, einen einzigen Test ohne Umbauten zu laufen? Zum Beispiel:

test-only *class -- -X 2 

es würde "den zweiten Test in der Klasse führen. Was auch immer es ist". Wir haben eine Reihe von Tests, und niemand hat sich die Mühe gemacht, sie zu markieren. Gibt es also eine Möglichkeit, einen einzelnen Test ohne ein Tag zu testen?

+1

Ihr Thema sagt „Scalatest-sbt“. Wenn sbt angehängt wird, denken die Leute normalerweise an ein Plugin. Aber, nur um zu verdeutlichen, Sie sprechen über die Verwendung von [ScalaTest] (http://www.scalatest.org/) aus einer modernen Version von sbt wie sbt 0.12, nicht [josshcough/scalatest-sbt] (https: // github.com/joshcough/scalatest-sbt) ein Plugin für sbt 0.5.2-p3 vor 4 Jahren geschrieben. Richtig? –

+0

Korrigieren. Das ist eine alte Frage und ich habe seitdem herausgefunden, dass es nicht möglich ist (soweit ich weiß). Ich habe es nicht geschlossen, für den Fall, dass es jemandem tatsächlich gelungen ist, einen Weg zu finden, aber ich brauche das nicht mehr zu beantworten. – Nacht

+0

Es gibt einen Thread dazu (mit Beteiligung von Bill Venners und Mark Harrah) unter https://groups.google.com/forum/#!topic/scalatest-users/1oRMkudFAXM, aber noch keine Lösung. –

Antwort

120

Dies wird jetzt unterstützt (seit ScalaTest 2.1.3) mit:

testOnly *MySuite -- -z foo 

nur laufen die Tests, deren Name die Teilzeichenfolge "foo" enthält.

Verwenden Sie -t anstelle von -z für exakte Übereinstimmung und nicht als Teilzeichenfolge.

+2

Funktioniert für mich, wenn ich 'testOnly * MySuite', nicht' test-only * MySuite' verwende. – cevaris

+2

Behoben, danke @cevaris. sbt 0.13 wurde von Bindestrichstil auf Kamelstil umgestellt. –

+0

@SethTisue Wären Sie in der Lage, ein Arbeitsbeispiel zu veröffentlichen, das '-t' für die exakte Übereinstimmung verwendet? Ich kann es nicht zur Arbeit bringen. – rmin

39

Ich sehe keine Möglichkeit, einen einzelnen unmarkierten Test innerhalb einer Testklasse auszuführen, aber ich stelle meinen Workflow zur Verfügung, da er für jeden nützlich zu sein scheint, der auf diese Frage stößt.

Aus einer sbt Sitzung:

test:test-only *YourTestClass 

(Der Stern ist ein Platzhalter, könnten Sie den vollständigen Pfad com.example.specs.YourTestClass angeben.)

Alle Tests innerhalb dieser Testklasse ausgeführt werden. Vermutlich sind Sie am meisten betroffen mit vorgeschriebenen Prüfungen nicht, so irgendwelche Fehler Implementierungen korrigieren und dann laufen:

test:test-quick 

... die Tests nur ausführen, die fehlgeschlagen. (Die Wiederholung des zuletzt ausgeführten Befehls test:test-only entspricht in diesem Fall test:test-quick. Wenn Sie jedoch Ihre Testmethoden in geeignete Testklassen aufteilen, können Sie einen Platzhalter verwenden, um test:test-quick einen effizienteren Weg zur Wiederholung fehlgeschlagener Tests zu bieten.)

Beachten Sie, dass die Nomenklatur für den Test in ScalaTest eine Testklasse und keine spezifische Testmethode ist. Daher werden alle nicht markierten Methoden ausgeführt.

Wenn Sie zu viele Testmethoden in einer Testklasse haben, zerlegen Sie sie in separate Klassen oder markieren Sie sie entsprechend. (Dies könnte ein Signal sein, dass die Klasse im Test unter Verletzung von single responsibility principle ist und ein Refactoring verwenden könnte.)

+4

für diejenigen, die vor "Keine Tests wurden ausgeführt" stehen: '* YourTestClass' muss Klassenname sein. Kein Dateiname – MKatleast3

+0

@ MKatleast3 Ich könnte dich 100 Mal updaten. – dangonfast

30

Ich wollte ein konkretes Beispiel hinzufügen, um die anderen Antworten

Sie den Namen der Klasse angeben müssen begleiten, die Sie testen wollen, also, wenn Sie das folgende Projekt haben (dies ist ein Play-Projekt):

Play Project

Sie können nur die Login Tests testen, indem Sie den folgenden Befehl von der SBT-Konsole ausgeführt wird:

test:testOnly *LoginServiceSpec 

Wenn Sie den Befehl von außerhalb des SBT-Konsole ausgeführt wird, würden Sie wie folgt vor:

sbt "test:testOnly *LoginServiceSpec" 
+11

Upvote, da anscheinend die Anführungszeichen notwendig sind: '' 'sbt 'test: testOnly * LoginServiceSpec" '' ' –