Mi piacerebbe eseguire qualche azione quando il test di Spock fallisce. Specificamente, fai uno screenshot. È possibile? Come farlo?Esegui qualche azione quando il test di Spock fallisce
risposta
creare una classe ascoltatore
class ExampleListener extends AbstractRunListener {
def void error(ErrorInfo error) {
println "Actual on error logic"
}
}
poi aggiunto a ogni specifica utilizzando implementazione di IGlobalExtension
che viene eseguito per ogni Spec
class GlobalSpecExtension implements IGlobalExtension {
@Override
void visitSpec(SpecInfo specInfo) {
specInfo.addListener(new ExampleListener())
}
}
e infine creare il file org.spockframework.runtime.extension.IGlobalExtension
nel META-INF/services directory
(in genere sarà sotto src/test/resources
se si utilizza Maven) con il nome completo dell'implementazione IGlobalExtension
ad es.
com.example.tests.GlobalSpecExtension
Il modo migliore per ottenere ciò è scrivere un'estensione Spock (globale o basata su annotazioni) che implementa e registri un AbstractRunListener
. Per un esempio, vedere OptimizeRunOrderExtension. Per informazioni su come registrare un'estensione globale, vedere il descrittore IGlobalExtension.
Non c'è molta documentazione sulle estensioni perché le API sono ancora soggette a modifiche. Se vuoi giocare sul sicuro (e puoi vivere con alcune restrizioni), puoi invece implementare uno JUnit Rule.
Un problema che si può verificare in entrambi i casi è che non forniscono accesso all'istanza spec attuale. Se necessario, potrebbe essere necessario utilizzare sia uno AbstractRunListener
(da notificare l'errore) sia uno IMethodInterceptor
(per ottenere l'istanza specifica), entrambi registrati dalla stessa estensione. (Non dovrebbe essere così difficile, ma questo è ciò che è attualmente lì.)
Ciao Peter! Come dovrei andare a combinare questi due al fine di invalidare e forse ricreare un'istanza del driver rotto? Nei test cloud se ricevo qualcosa come "WebDriverException: Session [...] terminata a causa di TIMEOUT", posso intercettare e registrare l'errore nel listener, ma non ho accesso a 'driver' o a un produttore di driver la cache di che posso invalidare. Qualche idea? – kriegaex
sono riuscito a fare in questo modo:
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
}
}
Prima di ogni test case "successo" è impostata su false dal metodo setup(). Alla fine di ogni caso di test si aggiunge l'istruzione "(success = true)! = Null". Quindi il "successo" sarà vero solo se il test case è passato. Dopo ogni test il metodo cleanup() verificherà se "successo" è vero. Se non è il metodo, verrà chiamato someAction().
Non riesco a votare o commentare la risposta di user3074543, ma è più semplice della creazione di un'estensione. Voglio facile Quindi ho accorciato un po 'l'utente * (non intendo i metodi a 1 riga). È possibile rendere la logica più semplice registrando l'errore anziché il successo e ridurre la digitazione con un aiutante 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()
}
}
Qual è la ragione dietro la creazione di un file con il nome del pacchetto nella directory dei servizi? – eddyrokr