Spock测试失败时执行一些操作

时间:2013-05-07 13:14:17

标签: testing spock

我想在Spock测试失败时执行一些操作。具体来说,截取屏幕截图。可能吗?怎么做?

4 个答案:

答案 0 :(得分:9)

创建一个监听器类

class ExampleListener extends AbstractRunListener {

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

然后使用为每个Spec执行的IGlobalExtension的实现将其添加到每个规范

class GlobalSpecExtension implements IGlobalExtension {

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

最后在您的org.spockframework.runtime.extension.IGlobalExtension中创建一个名为META-INF/services directory的文件(如果您使用Maven,通常会在src/test/resources下),并使用您的IGlobalExtension实现的全名,例如

com.example.tests.GlobalSpecExtension

答案 1 :(得分:3)

实现这一目标的最佳方法是编写一个(全局或注释驱动的)Spock扩展,它实现并注册AbstractRunListener。有关示例,请参阅OptimizeRunOrderExtension。有关如何注册全局扩展,请参阅IGlobalExtension描述符。

关于扩展的文档不多,因为API仍有可能发生变化。如果你想安全地玩(并且可以有一些限制),你可以实现JUnit Rule

在这两种情况下,您可能遇到的一个问题是它们不提供对当前规范实例的访问。如果需要,可能必须同时使用AbstractRunListener(通知失败)和IMethodInterceptor(获取规范实例),两者都由同一扩展名注册。 (不应该这么难,但这就是目前的情况。)

答案 2 :(得分:3)

我设法这样做了:

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

在每个测试用例之前,setup()方法将“success”设置为false。 在每个测试用例的末尾添加“(success = true)!= null”语句。因此,如果测试用例已经过去,“成功”将是正确的。 在每个测试用例之后,cleanup()方法将验证“success”是否为真。如果不是方法,则会调用someAction()。

答案 3 :(得分:0)

我无法对user3074543的回答进行投票或评论,但它比创建扩展程序更简单。我想要轻松。所以我缩短了用户一点(我不是指1行方法)。您可以通过记录失败而不是成功来简化逻辑,并使用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()
    }
}
相关问题