2013-05-07 13 views

答えて

9

その後、各スペック

class GlobalSpecExtension implements IGlobalExtension { 

    @Override 
    void visitSpec(SpecInfo specInfo) { 
    specInfo.addListener(new ExampleListener()) 
    } 
} 
のために実行される IGlobalExtensionの実装を使用して各仕様に追加

class ExampleListener extends AbstractRunListener { 

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

をリスナクラスを作成します。

IGlobalExtension実装のフルネームで、最終的ににファイルorg.spockframework.runtime.extension.IGlobalExtensionを作成します(通常Mavenを使用している場合はsrc/test/resourcesになります)。

com.example.tests.GlobalSpecExtension 
+0

servicesディレクトリにパッケージ名を含むファイルを作成することの合理的な背景は何ですか? – eddyrokr

3

これを実現する最善の方法は、AbstractRunListenerを実装して登録する(グローバルまたはアノテーション駆動の)Spock拡張を書き込むことです。たとえば、OptimizeRunOrderExtensionを参照してください。グローバルエクステンションを登録する方法については、IGlobalExtension記述子を参照してください。

APIがまだ変更される可能性があるため、拡張機能に関するドキュメントはあまりありません。それを安全に再生したい場合(そしていくつかの制限があります)、代わりにJUnit Ruleを実装することができます。

両方の場合に発生する可能性がある1つの問題は、現在の仕様インスタンスへのアクセスを提供しないことです。これが必要な場合は、AbstractRunListener(失敗の通知を受ける)とIMethodInterceptor(スペックインスタンスを取得する)の両方を使用する必要があります。どちらも同じ拡張子で登録されています。 (このハード、それが現在何だすべきではない。)

+0

こんにちは!壊れたドライバインスタンスを無効にしたり再作成したりするために、これらの2つを組み合わせるにはどうしたらいいですか?クラウドテストで、 'WebDriverException:Session [...]のようなものがTIMEOUTによって終了した場合、リスナーでエラーを傍受してログに記録できますが、' driver'やドライバファクトリにはアクセスできません私はそれを無効にすることができます。何か案は? – kriegaex

3

私は、このようにそれを行うことができた:各テストケース「成功」は、セットアップ()メソッドでfalseに設定されている

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

前に。 各テストケースの最後に "(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() 
    } 
} 
関連する問題