2013-05-07 22 views

Odpowiedz

9

Utwórz klasę słuchacza

class ExampleListener extends AbstractRunListener { 

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

następnie dodać go do każdej specyfikacji stosując realizację od IGlobalExtension, który jest wykonywany dla każdego Spec

class GlobalSpecExtension implements IGlobalExtension { 

    @Override 
    void visitSpec(SpecInfo specInfo) { 
    specInfo.addListener(new ExampleListener()) 
    } 
} 

i na koniec utwórz plik o nazwie org.spockframework.runtime.extension.IGlobalExtension w twoim META-INF/services directory (zazwyczaj będzie pod src/test/resources, jeśli używasz Mavena) z pełną nazwą twojej implementacji IGlobalExtension np.

com.example.tests.GlobalSpecExtension 
+0

Co jest racjonalnego tworzenia pliku o nazwie pakietu w katalogu usług? – eddyrokr

3

Najlepszym sposobem na osiągnięcie tego jest napisanie rozszerzenia Spock, które obsługuje i rejestruje numer AbstractRunListener. Na przykład zobacz OptimizeRunOrderExtension. Aby dowiedzieć się, jak zarejestrować rozszerzenie globalne, zobacz deskryptor IGlobalExtension.

Nie ma zbyt dużej dokumentacji dotyczącej rozszerzeń, ponieważ interfejsy API wciąż mogą ulec zmianie. Jeśli chcesz grać bezpiecznie (i możesz żyć z pewnymi ograniczeniami), możesz zamiast tego zaimplementować JUnit Rule.

Jednym z problemów, które możesz napotkać w obu przypadkach, jest to, że nie zapewniają dostępu do bieżącej instancji spec. Jeśli potrzebujesz tego, być może będziesz musiał użyć zarówno AbstractRunListener (aby otrzymać powiadomienie o błędzie), jak i IMethodInterceptor (aby uzyskać dostęp do instancji spec), obu zarejestrowanych przez to samo rozszerzenie. (Nie powinno być to trudne, ale to, co aktualnie istnieje.)

+0

Witaj, Peter! W jaki sposób chciałbym połączyć te dwa, aby unieważnić, a może odtworzyć uszkodzoną instancję sterownika? W testach w chmurze, gdy otrzymam komunikat typu "WebDriverException: sesja [...] została zakończona z powodu TIMEOUT", mogę przechwycić i zarejestrować błąd w odbiorniku, ale nie mam dostępu do 'sterownika' lub fabryki sterowników które mogę unieważnić. Jakieś pomysły? – kriegaex

3

udało mi się zrobić to w ten sposób:

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 
    } 
} 

Przed każdym przypadku test "sukces" jest ustawiona na false setup() metody. Na końcu każdego przypadku testowego dodajemy instrukcję "(success = true)! = Null". Dlatego "sukces" będzie prawdą tylko wtedy, gdy test zakończył się pomyślnie. Po każdym przypadku testowym metoda cleanup() sprawdzi, czy "sukces" jest prawdziwy. Jeśli nie jest to metoda, wywoływana jest metoda someAction().

0

Nie mogę przegłosować ani skomentować odpowiedzi user3074543, ale jest to prostsze niż tworzenie rozszerzenia. Chcę łatwe. Więc trochę skróciłem użytkownika * (nie mam na myśli metod 1-liniowych). Możesz uprościć logikę, rejestrując niepowodzenie zamiast sukcesu i zmniejszyć pisanie za pomocą helpera done().

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() 
    } 
} 
Powiązane problemy