test pom example testing spock

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