2015-09-08 13 views
7

Ich bin mit ein paar Tests mit ScalaTest, die vorhanden sein auf Verbindungen zu Testserver verlassen. Ich meine eigene Spec zur Zeit ähnlich wie diese erstellt:Wie programmiere ich ScalaTest programmatisch ignorieren/überspringen?

abstract class ServerDependingSpec extends FlatSpec with Matchers { 

    def serverIsAvailable: Boolean = { 
    // Check if the server is available 
    } 
} 

Ist es möglich, zu ignorieren (aber nicht scheitern) Tests, wenn diese Methode false zurückkehrt?

Zur Zeit mache ich es in einem "hackish" Art und Weise:

"Something" should "do something" in { 
    if(serverIsAvailable) { 
    // my test code 
    } 
} 

aber ich möchte so etwas wie

whenServerAvailable "Something" should "do something" in { 
    // test code 
} 

oder

"Something" should "do something" whenServerAvailable { 
    // test code 
} 

Ich glaube, sollte ich meine benutzerdefinierten Tags definieren , aber ich kann nur auf den Quellcode von in oder ignore verweisen und ich verstehe nicht, wie ich sh Ich würde meine benutzerdefinierten Implementierungen anschließen.

Wie soll ich das erreichen?

Antwort

8

können Sie Schlagwörter verwenden diese zu erreichen:

Dokumentation, wie Tags verwenden: http://www.scalatest.org/user_guide/tagging_your_tests

Hinzufügen und getaggt Test Entfernen mit Kommandozeilen-Parameter: http://www.scalatest.org/user_guide/using_the_runner#specifyingTagsToIncludeAndExclude

Beispielcode:

import org.scalatest.Tag 

object ServerIsAvailable extends Tag("biz.neumann.ServerIsAvailable") 

"Something" should "do something" taggedAs(ServerIsAvailable) in { 
    // your test here 
} 

Ausführen der Tests

Das Ausführen der Tests ist ein wenig knifflig. Es funktioniert nur für testOnly und testQuick nicht test. Im Beispiel testOnly ist die Abkürzung für testOnly *

sbt "testOnly -- -l biz.neumann.ServerAvailable" 
+0

Ich fand dies auch, aber die Dokumentation bezieht sich nur, wie es in der Befehlszeile zu tun. Allerdings verwende ich "sbt test" auf Jenkins, und ich möchte den Test programmatisch überspringen, wenn der Server nicht verfügbar ist. – rabejens

+0

so sollte das Programm reagieren, wenn der Server verfügbar ist oder möchten Sie Jenkins konfigurieren zu schließen, wenn der Server verfügbar ist und dann haben jenkins entsprechend anpassen, die Tests laufen zu lassen? –

+0

Oh, jetzt verstehe ich.Momentan starte und starte ich den Testserver programmatisch (es wird mit Docker auf einem Testserver per SSH ausgeführt), aber Jenkins dafür zu verwenden, ist die sauberere Lösung. – rabejens

11

ich cancel verwenden würde:

"Something" should "do something" in { 
    if(!serverIsAvailable) { 
    cancel 
    } 

    // my test code 
} 

Oder vereinfachen es noch weiter durch assume mit:

"Something" should "do something" in { 
    assume(serverIsAvailable) 

    // my test code 
} 
+1

Angenommen, ist auch dafür vorgesehen: 'nehme an (server.isAvailable)' –

+0

Schön, ich habe die Lösung angepasst, um ein vollständiges Beispiel zu zeigen. –

+0

sollte ohne sein! Ich habe versucht, es zu bearbeiten, aber Änderungen müssen mindestens 6 Zeichen sein. –

2

Hier ist ein Trick, um einen Test zu überspringen, der auf einem Con basiert dition:

object WhenServerAvailable extends Tag(if (serverIsAvailable) "" else classOf[Ignore].getName) 

"Something" should "do something" taggedAs WhenServerAvailable in { ... } 
Verwandte Themen