2017-05-15 10 views
0

SpockとGebに基づいた機能テストがあります。これらのテストの実行前後にいくつかのアクションを実行したいと思います。そこで私はグローバルエクステンションを作成し、そのエクステンションのstart()メソッドとstop()メソッドに必要な機能を追加しました。しかし、問題はスポックのドキュメント(http://spockframework.org/spock/docs/1.1/all_in_one.html#_global_extensions)は述べているのに/停止方法は、各スポック仕様前/後に呼び出されること開始です:Spock拡張のstartメソッドが複数回呼び出されました

スタートを(これはスポックの実行の非常に開始時に一度と呼ばれる)

stop()これはSpock実行の最後に一度だけ呼び出されます

これらのメソッドの動作について何か間違っているか、Spockのマニュアルが正しくありませんか?

+0

はあなたがテストを実行している方法についての詳細な情報を与えることができるオプションに影響を与えます。 (Maven/Gradle/...) –

+0

私は 'mvn clean test'コマンドを使ってテストを実行します。私はSpockレポートライブラリをグローバルな拡張機能として実装しているので、各仕様の前/後にstart/stopメソッドを呼び出すように設計されていると思います。しかし、おそらく、私が必要とするものを達成するための他の方法、すなわちすべてのテスト仕様を開始する直前および終了した後に、いくつかのアクションを1回起動しますか? – MantasG

答えて

0

@MantasG SpockはJUnitランナーを実装しており、実行方法を制御していません。グローバルエクステンションはRunContextで管理され、ThreadLocalに保存されます。 surefireが複数のスレッドを使用してテストを実行する場合、それぞれ独自のグローバル拡張機能リストを持つRunContextという複数のインスタンスが作成されます。 EmbeddedSpecRunnerを使用している場合は、新しい分離コンテキストも作成されます。

このコンテキストは、スレッドが終了するまで残っています。テスト実行が完了したら という文脈を削除する方が正確ですが、 でもJUnit Runner SPIは十分なフックを提供していません。その によると、ほとんどの環境では、テスト実行ごとに新しいJVMがforkされるため、この は実際にはあまり問題にならないはずです。

  1. あなたがJUnitRunListenerを使用してtestRunStarted/testRunFinishedフックを使用することができます。あなたは他の方法がある何をしたいのかに応じて、

。注意してください。

  • 本当に1回だけ実行したい場合は、確実なものの代わりにフェイルセーフを使用し、前後の目標を使用することができます。
  • start/stopコールごとに静的フィールドとカウンタを使用して何かをハックし、カウンタが0の場合は開始アクションを実行し、カウンタが0になったら停止アクションを実行できます。もちろん、スレッドセーフです。また、確実な
  • forking multiple JVMsをサポートしており、これはまた、1と3

    +0

    Leonardありがとう、あなたの答えは非常に包括的です。すべての提案されたオプションは私が必要とするものを達成するために使用することができましたが、私のケースでは、Surefireの設定で ' false'私は 'reuseForks = true'に切り替えた後、すべてが動作するようになりました。今私はSpock拡張を使って必要なものを実装することさえできます。 – MantasG

    関連する問題