10

Spock テストが失敗したときに何らかのアクションを実行したいと考えています。具体的には、スクリーンショットを撮ります。出来ますか?どうやってするの?

4

4 に答える 4

10

リスナー クラスを作成する

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

最後に、実装の完全な名前を使用org.spockframework.runtime.extension.IGlobalExtensionして、META-INF/services directory(通常はsrc/test/resourcesMaven を使用している場合は下にあります) という名前のファイルを作成します。IGlobalExtension

com.example.tests.GlobalSpecExtension
于 2013-05-07T14:20:49.000 に答える
3

これを実現する最善の方法は、AbstractRunListener. 例については、OptimizeRunOrderExtensionを参照してください。グローバル拡張機能を登録する方法については、IGlobalExtension記述子を参照してください。

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

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

于 2013-05-07T14:08:02.370 に答える
0

user3074543 の回答に賛成票を投じたりコメントしたりすることはできませんが、拡張機能を作成するよりも簡単です。簡単に欲しい。そこで、user* を少し短くしました (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()
    }
}
于 2015-02-13T01:31:59.683 に答える