TestNG のリスナー Selenium
⚡ スマートサマリー
のリスナー Selenium WebDriverは TestNG テストイベントをインターセプトしてログ、レポート、および障害発生後のアクションをカスタマイズするインターフェース。この記事では、ITestListener メソッドについて説明し、実行可能なサンプルを順に見ていきます。 Java 例を挙げ、どのように Selenium 4 は非推奨の WebDriverEventListener を置き換えました。

Selenium WebDriver スクリプトは、アサーションの合格、ロケーターの失敗、ステップのスキップなどのテスト イベントに反応する必要があることがよくあります。リスナーはそれを可能にします。大まかに言うと、 Selenium このプロジェクトは、2つのリスナーファミリーに依存しています。
- WebDriver リスナー
- TestNG リスナー
このチュートリアルでは、次のことに焦点を当てます。 TestNG リスナー、WebDriver レベルのリスナーがどのように変更されたかについての注記 Selenium 4.x。
リスナーとは何か TestNG?
リスナーは、デフォルトの動作を変更するインターフェースです。 TestNG名前が示すように、リスナーは、で定義されたイベントを「聞く」。 Selenium スクリプトを作成し、それに応じて反応します。これらを使用するには、関連するリスナーインターフェイスを実装し、テストクラスまたはスイートに登録します。リスナーを使用すると、カスタマイズできます。 TestNG レポートを作成し、スクリーンショットを添付し、構造化ログを出力します。
リスナーの種類 TestNG
TestNG は、テストライフサイクルの異なる段階をそれぞれ対象とする、一連のリスナーインターフェースを提供します。
以下は一般的に使用されているものです TestNG リスナー:
- IAnnotationTransformer
- IAnnotationTransformer2
- I構成可能
- IConfigurationListener
- I実行リスナー
- IHookable
- IInvokedMethodListener
- IInvokedMethodListener2
- IMethodInterceptor
- Iレポーター
- ISuiteListenerGenericName
- ITestListenerComment
これらのインターフェースは、 Selenium ログを生成するかカスタマイズする TestNG レポート。このチュートリアルでは、 ITestListenerComment.
ITestListenerComment 以下のメソッドを公開します。
- onStart – いずれかのテストが開始されると呼び出されます。
- onTestSuccess – テストが合格したときに呼び出されます。
- onTestFailure – テストが失敗したときに呼び出されます。
- onTestSkipped – テストがスキップされたときに呼び出されます。
- onTestFailedButWithinSuccessPercentage – テストが失敗したが、成功率の範囲内である場合に呼び出されます。
- 完了時 – クラス内のすべてのテストが実行された後に呼び出されます。
テストシナリオ
このテストシナリオでは、ログインプロセスを自動化し、 ITestListenerComment それに対して。
- 起動する Firefox そしてサイトを開きます https://demo.guru99.com/V4/
- アプリケーションにログインします。
を作成する手順 TestNG リスナー
上記のテストシナリオでは、リスナーを段階的に実装していきます。
ステップ1) クラスを作成します。 リスナーテスト 実装する ITestListenerComment赤い下線の上にカーソルを合わせると、 Eclipse 以下に示すように、2つの簡単な解決策を提案します。
「未実装メソッドの追加」をクリックします。すると、以下のような複数のスタブメソッド(本体のないメソッド)がコードに追加されます。
import org.testng.ITestContext;
import org.testng.ITestListener;
import org.testng.ITestResult;
パブリッククラス リスナーテスト 実装する ITestListenerComment {
@オーバーライド
パブリックボイド 完了(ITestContext arg0) {
// TODO 自動生成されたメソッド スタブ
}
@オーバーライド
パブリックボイド onStart(ITestContext arg0) {
// TODO 自動生成されたメソッド スタブ
}
@オーバーライド
パブリックボイド onTestFailedButWithinSuccessPercentage(ITestResult arg0) {
// TODO 自動生成されたメソッド スタブ
}
@オーバーライド
パブリックボイド onTestFail()ITestResult arg0) {
// TODO 自動生成されたメソッド スタブ
}
@オーバーライド
パブリックボイド onTestSkipped(ITestResult arg0) {
// TODO 自動生成されたメソッド スタブ
}
@オーバーライド
パブリックボイド onTestStart(ITestResult arg0) {
// TODO 自動生成されたメソッド スタブ
}
@オーバーライド
パブリックボイド onTestSuccess(ITestResult arg0) {
// TODO 自動生成されたメソッド スタブ
}
}
それでは、 リスナーテスト クラス。具体的には、以下のメソッドを実装します。 テスト失敗時, onTestSkipped, onTestStart, onTestSuccess.
変更点は単純です。各メソッドがテスト名を出力するようにすることで、コンソールに合格、不合格、スキップのステータスが明確に表示されるようになります。
変更後のコードは以下のようになります。
import org.testng.ITestContext;
import org.testng.ITestListener;
import org.testng.ITestResult;
パブリッククラス リスナーテスト 実装する ITestListenerComment {
@オーバーライド
パブリックボイド 完了(ITestContext 結果) {
}
@オーバーライド
パブリックボイド onStart(ITestContext 結果) {
}
@オーバーライド
パブリックボイド onTestFailedButWithinSuccessPercentage(ITestResult 結果) {
}
// テストケースが失敗した場合に、このメソッドが呼び出されます。
@オーバーライド
パブリックボイド onTestFail()ITestResult 結果) {
System.out.println(「失敗したテストケースの名前は次のとおりです。」 + Result.getName());
}
// テストケースがスキップされた場合、このメソッドが呼び出されます。
@オーバーライド
パブリックボイド onTestSkipped(ITestResult 結果) {
System.out.println(「スキップされたテストケースの名前は次のとおりです。」 + Result.getName());
}
// テストケースが開始されると、このメソッドが呼び出されます。
@オーバーライド
パブリックボイド onTestStart(ITestResult 結果) {
System.out.println(Result.getName() + 「テストケースが開始されました」);
}
// テストケースが合格すると、このメソッドが呼び出されます。
@オーバーライド
パブリックボイド onTestSuccess(ITestResult 結果) {
System.out.println(「合格したテストケースの名前は次のとおりです。」 + Result.getName());
}
}
ステップ2) 別のクラスを作成します テストケース ログイン自動化のため。 Selenium このクラスを実行すると、デモサイトにログインできます。
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox です。Firefoxドライバ;
import org.testng.Assert;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;
パブリッククラス テストケース {
webdriver ドライバー = NEW Firefoxドライバ();
// 成功リスナーを検証するために、合格するように設計されたテスト。
@テスト
パブリックボイド ログイン() {
ドライバー.get(「https://demo.guru99.com/V4/」);
driver.findElement(By.name(「uid」)).sendKeys(「mngr34926」);
driver.findElement(By.name("パスワード")).sendKeys(「amUpenu」);
driver.findElement(By.name(「btnLogin」))。クリック();
}
// 強制的にテストを失敗させて、失敗リスナーを確認します。
@テスト
パブリックボイド TestToFail() {
System.out.println(「このテスト方法は失敗する」);
Assert.assertTrue(false);
}
}
ステップ3) 次に、このリスナーをテストクラスにアタッチします。 テストケースクラスをリスナーインターフェースに接続する方法は2つあります。
最初の方法は、 @リスナー 以下に示す注釈:
この注釈を上に追加します テストケース クラス。すると、クラスは次のようになります。
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox です。Firefoxドライバ;
import org.testng.Assert;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;
@Listeners(Listener_Demo.ListenerTest.class)
パブリッククラス テストケース {
webdriver ドライバー = NEW Firefoxドライバ();
// 成功リスナーを確認するために、テストに合格する必要があります。
@テスト
パブリックボイド ログイン() {
ドライバー.get(「https://demo.guru99.com/V4/」);
driver.findElement(By.name(「uid」)).sendKeys(「mngr34926」);
driver.findElement(By.name("パスワード")).sendKeys(「amUpenu」);
driver.findElement(By.name(「btnLogin」))。クリック();
}
// 強制的にテストを失敗させて、失敗リスナーを確認します。
@テスト
パブリックボイド TestToFail() {
System.out.println(「このテスト方法は失敗する」);
Assert.assertTrue(false);
}
}
プロジェクトの構造は次のようになります。
ステップ4) 実行する テストケース クラス。内部のメソッド リスナーテスト 注釈が付けられたメソッドの動作に基づいて自動的に呼び出されます @テスト.
ステップ5) コンソールに表示されている出力を確認してください。
の出力 テストケース 次のようになります。
C:\Users\gauravn\AppData\Local\Temp\testng-eclipse–1058076918\testng-customsuite.xml
ログインテストケースが開始されました
合格したテストケースの名前は「ログイン」です。
TestToFailテストケースが開始されました
このテスト方法は失敗します
失敗したテストケースの名前は TestToFail です。
合格: ログイン
失敗: TestToFail
java.lang.AssertionError: [true] が期待されていましたが、[false] が見つかりました
複数のクラスにリスナーを使用する
プロジェクトにテスト クラスが多数ある場合、 @リスナー それぞれに注釈を付けるのは面倒で、エラーが発生しやすくなる。
その場合は、 テスト ファイルを作成し、そこにリスナーを一度登録します。
このリスナーは、クラスの数に関係なく、テストスイート全体に適用されます。XMLファイルを実行すると、スイート内で宣言されたすべてのクラスに対してリスナーが起動し、同じタグ内に任意の数のリスナークラスを連結できます。
WebDriverListener で Selenium 4 と非推奨の EventFiringWebDriver の比較
一方、 TestNG リスナーはテストライフサイクルイベントに反応し、WebDriverリスナーはクリック、ナビゲーション、findElement呼び出しなどのブラウザドライバアクションに反応します。 Selenium 3 典型的なアプローチは WebDriverEventListener インターフェースは有線接続されています EventFiringWebDriverどちらも非推奨です Selenium 4.x。
現代の代替品は WebDriverListener インターフェースと イベント発火デコレーター:
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.events.EventFiringDecorator;
import org.openqa.selenium.support.events.WebDriverListener;
パブリッククラス ロギングリスナー 実装する WebDriverListener {
@オーバーライド
パブリックボイド beforeGet(webdriver ドライバー、文字列 url) {
System.out.println(「ナビゲーション」 + URL);
}
}
webdriver 生の = NEW クロムドライバー();
webdriver ドライバー = NEW イベント発火デコレーター<>(NEW LoggingListener()).decorate(raw);
デコレータは任意の WebDriver、WebElement、または Alert をラップできるため、従来のイベント発火ラッパーよりも柔軟性があります。 WebDriverListener ブラウザ側の可観測性と TestNG ITestListenerComment スイートレベルのレポート作成用。
AI搭載リスナー:よりスマートなログと障害トリアージ
モダン Selenium チームは、CIシグナルをより実用的なものにするために、AIサービスをリスナーに組み込むケースが増えている。 テスト失敗時AI 支援リスナーは DOM スナップショットとスクリーンショットをキャプチャし、それらをモデルに送信して、考えられる根本原因クラスターを返し、タグを書き戻すことができます。 TestNG レポート、またはReportPortalのようなツール。
一般的なAI駆動型パターンには以下のようなものがある。
- 不安定なテストの検出: リスナーは、合否判定のタイムラインをモデルに送信し、そのモデルは失敗を不安定な故障、環境的な故障、または実際の不具合として分類します。
- スマートスクリーンショット: コンピュータビジョンモデルは、UIスクリーンショットを切り抜き、注釈を付け、差分を表示するため、レビュー担当者はページ全体ではなく、変更された領域のみを確認できます。
- 自己修復機能付き位置情報装置: A WebDriverListener フック beforeFindElement そして、プライマリロケーターがエラーを返した場合に、AIヘルパーに代替ロケーターを提案するように依頼します。 NoSuchElementException.
- 自然言語による要約: An Iレポーター 実装では、一連の結果をLLMに入力し、LLMは1段落の要約レポートを作成する。
リスナー層は、テストロジックから切り離され、テストスイート全体に均一に適用されるため、これらのフックを挿入するのに最もクリーンな場所です。
製品概要
リスナーはログを生成するかカスタマイズする必要があります TestNG の報告 Selenium ウェブドライバー。
- TestNG 様々なリスナーインターフェースが用意されています。関心のあるイベントに合ったものを選んでください。
- リスナーは、 Selenium テストライフサイクルイベントに対応するWebDriverスクリプト。
- このチュートリアルでは、 ITestListenerComment 合格と不合格のテストがあります。
- リスナーをアタッチするには @リスナー または一度登録すれば テスト スイート全体に対して。
- Selenium 4.x は EventFiringWebDriver WebDriverListener + イベント発火デコレーター WebDriverレベルのイベント用。






