私は、JUnit 4.8.2を使用して一連のSeleniumテスト(実際にはWebDriverがサポートするSeleniumテスト)を推進しています。私は、テストがアサーションに失敗すると自動的にブラウザのスクリーンショットを取るテストをしたいと思います。すべてのテストはSeleniumBaseTestCase
から継承し、大部分はさらにSeleniumBastTestCaseWithCompany
(これは@Before
と@After
のメソッドを使用してセレンを介して共通のテストデータを作成し、クリーンアップします)から継承します。テストが失敗した後で、@Afterメソッドの前にJUnit 4.8でコードを実行するにはどうしたらいいですか?
私は、スクリーンショットを撮るためにTestWatchman
のfailed
メソッドをオーバーライドし、SeleniumBaseTestCase
に@Rule
ようTestWatchman
のサブクラスを追加しようとしました。問題は、TestWatchman
のfailed
メソッドが呼び出される前に、テストデータをクリーンアップするメソッド@After
が実行されているため、スクリーンショットはすべて、クリーンアップの最後のステップであり、失敗したテストではありません。それに少しを探し
は、それが思わTestWatchman
を残し、@After
メソッドを呼び出しますTestWatchman
のapply
方法だけ渡さStatement
呼び出す年代は法を評価する(のみ公開されたメソッド)、(または任意の他のRule
)ノーチャンステストの実行と@After
メソッドの間にコードを挿入することができます。
私はまた、カスタム@AfterFailure
でアノテート方法は(そのスクリーンショットは、このような@AfterFailure
方法で撮影することができます)@After
メソッドの前に実行されるように作成されたStatement
Sを変更するカスタムRunner
を作成するアプローチを見て、これきましたBlockJUnit4ClassRunner
のwithAfters
メソッドをオーバーライドすることに依存しています。これは非推奨で、プライベートになるため、documentationに従って、代わりにルールを使用することを提案しています。
@Rule lifecycleについての別の答えが見つかりました。このようなことはJUnit 4.8では簡単ではないかもしれませんが、JUnit 4.10では可能かもしれません。それが正しければ十分です、私はちょうどその最初の確認をしたいと思います。
私が欲しいものを達成することができる、エレガントで将来的な方法についての考えは、非常に高く評価されます。
JUnitをアップグレードする方法があると思います.4.8.2で特に満足できる解決策はありません。 私は 'SeleniumBaseTestCase'でスクリーンショットを取得するために保護されたTestWatcherを持っており、それを唯一のルールとしてRuleChainを持っています。次に、 'SeleniumBaseTestCaseWithCompany'で私は会社を作成/削除するExternalResourceを持っています。そして、スーパークラスのRuleChainをシャドウし、スクリーンショットと作成/削除ルールの両方を注文します。ありがとう、うまく動作するようです。 – Rowan
ちょうどメモ。 4.11では、メソッドに@Ruleを指定できるので、フィールドをシャドウするのではなく、そのメソッドをオーバーライドすることができます。しかし、4.11はまだリリースされていない。 –
ああ、知っておきたい - 変数をシャドーイングするのは私が不安だった唯一のビットだった... – Rowan