2013-05-07 117 views

回答

9

创建一个监听器类

class ExampleListener extends AbstractRunListener { 

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

然后将其添加到使用的IGlobalExtension实现,为每个规格

class GlobalSpecExtension implements IGlobalExtension { 

    @Override 
    void visitSpec(SpecInfo specInfo) { 
    specInfo.addListener(new ExampleListener()) 
    } 
} 
执行每个规格

并最终在您的META-INF/services directory中创建一个名为org.spockframework.runtime.extension.IGlobalExtension的文件(如果您使用的是Maven,通常它将在src/test/resources之下),其全名为IGlobalExtension

com.example.tests.GlobalSpecExtension 
+0

使用services目录中的软件包名称创建文件的理由是什么? – eddyrokr 2017-02-24 08:55:34

3

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

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

这两种情况都可能遇到的一个问题是,它们不提供对当前规范实例的访问权限。如果您需要此功能,则可能必须同时使用AbstractRunListener(通知失败)和IMethodInterceptor(获取规范实例),这两者都由相同的分机注册。 (应该不是这个很难,但是这什么目前还。)

+0

嗨,彼得!我将如何结合这两个为了无效,也许重新创建一个破损的驱动程序实例?在云测试中,如果我收到类似'WebDriverException:Session [TIMEOUT]'的终止会话,我可以拦截并记录侦听器中的错误,但无法访问'driver'或驱动程序工厂缓存我可以使其无效。有任何想法吗? – kriegaex 2016-06-03 11:42:15

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

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

0

我无法对user3074543的答案进行upvote或评论,但它比创建扩展更简单。我想要简单。所以我缩短了用户*的一些(我不是指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() 
    } 
} 
相关问题