testing - example - spock pom
Ejecute alguna acción cuando falle la prueba de Spock (4)
Me gustaría ejecutar alguna acción cuando falle la prueba de Spock. Específicamente, toma una captura de pantalla. ¿Es posible? ¿Cómo hacerlo?
He logrado hacerlo de esta manera:
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
}
}
Antes de cada caso de prueba, "éxito" se establece en falso por el método setup (). Al final de cada caso de prueba, agrega la instrucción "(success = true)! = Null". Por lo tanto, el "éxito" solo será verdadero si el caso de prueba ha pasado. Después de cada caso de prueba, el método de limpieza () verificará si el "éxito" es verdadero. Si no es el método se llamará someAction ().
La mejor forma de lograr esto es escribir una extensión Spock (global o impulsada por anotaciones) que implemente y registre un AbstractRunListener
. Para un ejemplo, vea OptimizeRunOrderExtension . Para saber cómo registrar una extensión global, consulte el descriptor IGlobalExtension .
No hay mucha documentación sobre extensiones porque las API todavía están sujetas a cambios. Si quiere ir a lo seguro (y puede vivir con algunas restricciones), puede implementar una regla JUnit en su lugar.
Un problema que puede encontrar en ambos casos es que no proporcionan acceso a la instancia de la especificación actual. Si necesita esto, puede que tenga que usar un AbstractRunListener
(para notificar el error) y un IMethodInterceptor
(para obtener la instancia de la especificación), ambos registrados por la misma extensión. (No debería ser tan difícil, pero eso es lo que hay actualmente).
No puedo votar ni comentar sobre la respuesta del usuario3074543, pero es más simple que crear una extensión. Quiero fácil. Así que acorté el usuario * '''' poco (no me refiero a los métodos de 1 línea). Puede simplificar la lógica al registrar fallas en lugar de éxito y reducir el tipeo con un ayudante 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()
}
}
Crear una clase de oyente
class ExampleListener extends AbstractRunListener {
def void error(ErrorInfo error) {
println "Actual on error logic"
}
}
luego agréguelo a cada especificación mediante la implementación de IGlobalExtension
que se ejecuta para cada especificación
class GlobalSpecExtension implements IGlobalExtension {
@Override
void visitSpec(SpecInfo specInfo) {
specInfo.addListener(new ExampleListener())
}
}
y finalmente crea un archivo llamado org.spockframework.runtime.extension.IGlobalExtension
en tu META-INF/services directory
(normalmente estará bajo src/test/resources
si estás usando Maven) con el nombre completo de tu implementación de IGlobalExtension
, por ejemplo
com.example.tests.GlobalSpecExtension