2013-05-07 111 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() 
    } 
} 
相關問題