2013-05-07 8 views

Antwort

9

erstellen Listener-Klasse

class ExampleListener extends AbstractRunListener { 

    def void error(ErrorInfo error) { 
    println "Actual on error logic" 
    } 
} 

dann fügen Sie es jede Spezifikation mit Implementierung von IGlobalExtension, die für jeden Spec

class GlobalSpecExtension implements IGlobalExtension { 

    @Override 
    void visitSpec(SpecInfo specInfo) { 
    specInfo.addListener(new ExampleListener()) 
    } 
} 
ausgeführt wird

und schließlich erstellen Sie die Datei mit dem Namen org.spockframework.runtime.extension.IGlobalExtension in Ihrem META-INF/services directory (in der Regel wird es unter src/test/resources, wenn Sie Maven verwenden) mit dem vollständigen Namen Ihrer IGlobalExtension Implementierung z

com.example.tests.GlobalSpecExtension 
+0

Was ist der Grund für die Erstellung einer Datei mit dem Namen des Pakets im Verzeichnis services? – eddyrokr

3

Der beste Weg, dies zu erreichen, ist eine (globale oder Annotation-getriebene) Spock-Erweiterung zu schreiben, die eine AbstractRunListener implementiert und registriert. Ein Beispiel finden Sie unter OptimizeRunOrderExtension. Informationen zum Registrieren einer globalen Erweiterung finden Sie unter dem Deskriptor IGlobalExtension.

Es gibt nicht viel Dokumentation zu Erweiterungen, da die APIs noch Änderungen unterliegen können. Wenn Sie auf Nummer sicher gehen wollen (und mit einigen Einschränkungen leben können), können Sie stattdessen eine JUnit Rule implementieren.

Ein Problem, das in beiden Fällen auftreten kann, ist, dass sie keinen Zugriff auf die aktuelle Spec-Instanz bieten. Wenn Sie dies benötigen, müssen Sie möglicherweise sowohl AbstractRunListener (um über den Fehler benachrichtigt zu werden) als auch IMethodInterceptor (um die Spec-Instanz zu erhalten) verwenden, die beide von derselben Erweiterung registriert wurden. (Sollte dies nicht hart sein, aber das ist, was zur Zeit da ist.)

+0

Hallo Peter! Wie würde ich diese beiden kombinieren, um eine beschädigte Treiberinstanz ungültig zu machen und möglicherweise neu zu erstellen? In Cloud-Tests, wenn ich etwas wie 'WebDriverException: Session [...] wegen TIMEOUT beendet bekomme', kann ich den Fehler im Listener abfangen und protokollieren, habe aber keinen Zugriff auf' Treiber' oder eine Treiberfabrik den Cache von was ich für ungültig erklären kann. Irgendwelche Ideen? – kriegaex

3

Ich habe es geschafft, es auf diese Weise zu tun: ist

class ExampleTest extends GebSpec{ 

    static boolean success = false 

    def setup(){ 
     success = false 
    } 

    def cleanup(){ 
     assert success == true, someAction() 
    } 

    def someAction(){ 
    } 

    def "TestCase"(){ 
     expect: 
     /*What you expect here*/ 

     (success = true) != null 
    } 
} 

Vor jedem Testfall "Erfolg" durch das Setup() -Methode auf false gesetzt. Am Ende jedes Testfalls fügen Sie die Anweisung "(success = true)! = Null" hinzu. Daher gilt "Erfolg" nur, wenn der Testfall bestanden ist. Nach jedem Testfall überprüft die cleanup() - Methode, ob "success" wahr ist. Wenn es nicht die Methode ist, wird someAction() aufgerufen.

0

Ich kann die Antwort von user3074543 nicht aufwerten oder kommentieren, aber es ist einfacher als das Erstellen einer Erweiterung. Ich will einfach. Also habe ich user * ein wenig gekürzt (ich meine nicht die 1-Zeilen-Methode). Sie können die Logik vereinfachen, indem Sie Fehler statt Erfolg aufzeichnen und die Eingabe mit einem Helfer done() reduzieren.

class Test extends spock.lang.Specification { 
    def fail 
    def setup(){ fail = true } 
    def done(){ !(fail = false) } 
    def cleanup(){ fail && doStuffWhenFail() } 
    def 'test things'(){ 
     expect: 
     stuff 
     done() 
    } 
} 
Verwandte Themen