私は Allure+TestNG で同様の問題を抱えており、BaseTest クラスでIHookableインターフェイスを実装することで解決しました。その run() メソッドを実装すると、通常どおりテストを実行するように TestNG に指示するだけで済みますが、例外が発生した場合にスクリーンショットを撮るために例外をキャッチする必要があります。
Javadoc は次のように述べています。
run() メソッドは、見つかった各 @Test メソッドの代わりに呼び出されます。テスト メソッドの呼び出しは、IHookCallBack パラメーターの callBack() メソッドの呼び出し時に実行されます。
コード スニペットは次のようになります。
public class BaseTest implements IHookable {
@Override
public void run(IHookCallBack callBack, ITestResult testResult) {
callBack.runTestMethod(testResult);
if (testResult.getThrowable() != null) {
try {
takeScreenShot(testResult.getMethod().getMethodName());
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Attachment(value = "Failure in method {0}", type = "image/png")
private byte[] takeScreenShot(String methodName) throws IOException {
return getWebDriver().getScreenshotAs(OutputType.BYTES);
}
}
テストメソッドの結果の実行はまだ不明であり、その時点で「RUNNING」ステータスになっているため、まだ testResult.isSuccess() を使用できないことに注意してください。
これにより、例外がキャッチされた直後にスクリーンショットが取得され、魅力レポートの適切なテストケースに配置されます