web-dev-qa-db-ja.com

testng @ AfterMethodでテストの失敗を検出する

テストが失敗した場合にスクリーンショットを撮りたいです。すべてのテストメソッドをtry/catchブロックでラップするのではなく、このロジックを@AfterMethodアノテーションが付けられたメソッドに追加したいと思います。

現在のテストが失敗した場合、@AfterMethodアノテーションが付けられたメソッドでどのように検出できますか?

17
Ingo Kegel

@AfterMethodアノテーションが付けられたメソッドにITestResultパラメーターがある場合、TestNGはテストの結果を自動的に挿入します。 (出典: TestNGドキュメント、セクション5.18.1

これでうまくいくはずです:

@AfterMethod
public void tearDown(ITestResult result) {
   if (result.getStatus() == ITestResult.FAILURE) {
      //your screenshooting code goes here
   }        
}
28
JacekM

_@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インスタンスなどのデータをオブジェクトから取得できます。

エラーログのクリーンアップや保存、スクリーンショットの撮影、他のレポート機能のトリガー、電子メールの送信など、さまざまなことを行うために、必要な数の異なるリスナーを使用できます。

7
thekevinmonster

前の回答のバリエーション:

失敗した場合にのみスクリーンショットを撮りたいことはすでにわかっているので、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 })

(できれば、すべてのテストが継承する基本クラスで)

2
Nathan Ripert

リスナー IInvokedMethodListener を実装し、afterInvocation()メソッドを実装できればよいでしょう。これにより、メソッドの結果オブジェクトにアクセスできます。ここにスクリーンショットを撮るためのコードを置くことができます。

1
niharika_neo