テストが失敗した場合にスクリーンショットを撮りたいです。すべてのテストメソッドをtry/catchブロックでラップするのではなく、このロジックを@AfterMethod
アノテーションが付けられたメソッドに追加したいと思います。
現在のテストが失敗した場合、@AfterMethod
アノテーションが付けられたメソッドでどのように検出できますか?
@AfterMethod
アノテーションが付けられたメソッドにITestResult
パラメーターがある場合、TestNGはテストの結果を自動的に挿入します。 (出典: TestNGドキュメント、セクション5.18.1 )
これでうまくいくはずです:
@AfterMethod
public void tearDown(ITestResult result) {
if (result.getStatus() == ITestResult.FAILURE) {
//your screenshooting code goes here
}
}
_@AfterMethod
_で障害レポートを処理する代わりに、ITestListener
を使用することをお勧めします。テストリスナーのonTestFailed()
関数は、テストメソッドが実行された後、_@AfterMethod
_メソッドが実行される前に呼び出されます。 (リスナーにはonTestFinished()
関数がないことに注意してください。その役割は_@AfterMethod
_によって実行されます。)
自分で物事を簡単にするために、TestListenerAdapter
を使用できます。これは、特に_@Override
_ではない他のすべての関数を実装します。
最終的には次のようになります。
_public class MyTestListener extends TestListenerAdapter {
@Override
public void onTestFailure(ITestResult result){
yourTakeScreenShotFunctionHere();
}
}
_
次に、リスナーをテストクラスにアタッチします。
_@Listeners({MyTestListener.class})
public class MyTestClass(){etc}
_
ITestResult
はテストクラスのオブジェクトへの参照であるため、リフレクションを使用して、SeleniumWebDriverインスタンスなどのデータをオブジェクトから取得できます。
エラーログのクリーンアップや保存、スクリーンショットの撮影、他のレポート機能のトリガー、電子メールの送信など、さまざまなことを行うために、必要な数の異なるリスナーを使用できます。
前の回答のバリエーション:
失敗した場合にのみスクリーンショットを撮りたいことはすでにわかっているので、TestListenerAdapter
からonTestFailure()
メソッドを使用できます。
import org.testng.ITestResult;
import org.testng.TestListenerAdapter;
public class LFailure extends TestListenerAdapter {
@Override
public void onTestFailure(ITestResult tr) {
System.out.println("Failure");
// your screenshot code
}
}
PS:LFailure
をtestng.xmlに追加するか、次のようなコードに直接追加することを忘れないでください。
@Listeners({ LFailure.class })
(できれば、すべてのテストが継承する基本クラスで)
リスナー IInvokedMethodListener を実装し、afterInvocation()
メソッドを実装できればよいでしょう。これにより、メソッドの結果オブジェクトにアクセスできます。ここにスクリーンショットを撮るためのコードを置くことができます。