Chciałbym wykonać pewne działanie, gdy test Spocka nie powiedzie się. W szczególności zrób zrzut ekranu. Czy to możliwe? Jak to zrobić?Wykonaj pewną akcję, gdy test Spocka nie powiedzie się.
Odpowiedz
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
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.)
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
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().
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()
}
}
- 1. Test mokki nie powiedzie się z AssertionError
- 2. Wykonaj akcję w HttpModule
- 3. Uruchom debugger ruby, jeśli test rspec nie powiedzie się
- 4. Wykonaj akcję po lekkim opóźnieniu, gdy wpisujesz UITextField
- 5. Test Gradle nie powiedzie się z powodu błędu
- 6. Mocha.js: uruchamianie haka "po", nawet jeśli test nie powiedzie się
- 7. CasperJs + jenkins: gdy test się nie powiedzie, jak odzyskać wszystkie informacje z tego testu
- 8. Gdy uwierzytelnianie ServiceStack nie powiedzie się, nie przekierowuj?
- 9. Wykonaj funkcję, gdy zmiana mapy zmienia się
- 10. Co zrobić, gdy poprawka do importu Mercurial nie powiedzie się?
- 11. Jak wydrukować więcej, gdy asercja się nie powiedzie?
- 12. WCF basicHttpBinding: Cofnij, gdy odpowiedź na klienta się nie powiedzie
- 13. Jak wydrukować wiadomość, gdy potwierdzenie nie powiedzie się w Dart?
- 14. Wykonaj test jednostkowy przed sprawdzeniem
- 15. Twitter Bootstrap - Wykonaj akcję na zakładce "pokazany" event
- 16. Wykonaj javascript, gdy kontrola użytkownika stanie się widoczna
- 17. Program pakujący Capistrano: instalacja nie powiedzie się
- 18. Zatrzymanie JUnit pakiet szczególności jeśli test nie powiedzie
- 19. Jak mogę spowodować, że MSTest.exe zwróci 0, nawet jeśli test się nie powiedzie?
- 20. Wykonaj akcję na przycisku zatrzymania przeglądarki kliknij przycisk
- 21. iOS: Wykonaj akcję po czasie, gdy użytkownik wchodzi w interakcję/przewija
- 22. clr.AddReferenceToFile() nie powiedzie się w IronPython 2.7
- 23. InetAddress.getByName nie powiedzie się za serwerem proxy
- 24. Convert.ToBoolean nie powiedzie się z „0” wartości
- 25. Czy document.createElement ("") nigdy się nie powiedzie?
- 26. dir_util.copy_tree nie powiedzie się po shutil.rmtree
- 27. Instalacja Xamarin na Androidzie nie powiedzie się
- 28. Jak uruchomić pojedyncze wdrożenie, gdy kompilacje Travis się powiedzie?
- 29. Wnioskowanie typu z orurowaniem lub kompozycją nie udaje się, gdy normalne wywołanie funkcji się powiedzie
- 30. Co stanie się, gdy funkcja rollback() nie powiedzie się dla transakcji w MySQL?
Co jest racjonalnego tworzenia pliku o nazwie pakietu w katalogu usług? – eddyrokr