TestNG のリスナー Selenium

⚡ スマートサマリー

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

  • リスナーの行動: 彼らは購読しています TestNG 開始、合格、失敗、スキップなどのイベントは、ログ記録またはレポート作成フックを推進します。
  • 🧩 12種類のインターフェース: TestNG きめ細かな制御のために、ITestListener、ISuiteListener、IReporter、IInvokedMethodListener、IAnnotationTransformerなどのインターフェースを提供します。
  • 🛠️ 2つの配線モード: 単一のクラスに@Listenersアノテーションを使用してリスナーをアタッチするか、各スイートごとにtestng.xml内で一度だけ登録します。
  • 🚀 Selenium 4アップデート: EventFiringWebDriver は非推奨になりました。WebDriver レベルのイベントフックは、最新の WebDriverListener インターフェイスと EventFiringDecorator によって実現されています。
  • 🤖 AIの視点: AI支援リスナーは、障害を自動的に分類し、スマートなスクリーンショットを添付し、不安定なテストシグナルをリアルタイムでCIダッシュボードにフィードバックすることができます。

TestNG のリスナー Selenium

Selenium WebDriver スクリプトは、アサーションの合格、ロケーターの失敗、ステップのスキップなどのテスト イベントに反応する必要があることがよくあります。リスナーはそれを可能にします。大まかに言うと、 Selenium このプロジェクトは、2つのリスナーファミリーに依存しています。

  1. WebDriver リスナー
  2. TestNG リスナー

このチュートリアルでは、次のことに焦点を当てます。 TestNG リスナー、WebDriver レベルのリスナーがどのように変更されたかについての注記 Selenium 4.x。

リスナーとは何か TestNG?

リスナーは、デフォルトの動作を変更するインターフェースです。 TestNG名前が示すように、リスナーは、で定義されたイベントを「聞く」。 Selenium スクリプトを作成し、それに応じて反応します。これらを使用するには、関連するリスナーインターフェイスを実装し、テストクラスまたはスイートに登録します。リスナーを使用すると、カスタマイズできます。 TestNG レポートを作成し、スクリーンショットを添付し、構造化ログを出力します。

リスナーの種類 TestNG

TestNG は、テストライフサイクルの異なる段階をそれぞれ対象とする、一連のリスナーインターフェースを提供します。

以下は一般的に使用されているものです TestNG リスナー:

  1. IAnnotationTransformer
  2. IAnnotationTransformer2
  3. I構成可能
  4. IConfigurationListener
  5. I実行リスナー
  6. IHookable
  7. IInvokedMethodListener
  8. IInvokedMethodListener2
  9. IMethodInterceptor
  10. Iレポーター
  11. ISuiteListenerGenericName
  12. ITestListenerComment

これらのインターフェースは、 Selenium ログを生成するかカスタマイズする TestNG レポート。このチュートリアルでは、 ITestListenerComment.

ITestListenerComment 以下のメソッドを公開します。

  • onStart – いずれかのテストが開始されると呼び出されます。
  • onTestSuccess – テストが合格したときに呼び出されます。
  • onTestFailure – テストが失敗したときに呼び出されます。
  • onTestSkipped – テストがスキップされたときに呼び出されます。
  • onTestFailedButWithinSuccessPercentage – テストが失敗したが、成功率の範囲内である場合に呼び出されます。
  • 完了時 – クラス内のすべてのテストが実行された後に呼び出されます。

テストシナリオ

このテストシナリオでは、ログインプロセスを自動化し、 ITestListenerComment それに対して。

  1. 起動する Firefox そしてサイトを開きます https://demo.guru99.com/V4/

テストシナリオログイン URL

  1. アプリケーションにログインします。

テストシナリオログインフォーム

を作成する手順 TestNG リスナー

上記のテストシナリオでは、リスナーを段階的に実装していきます。

ステップ1) クラスを作成します。 リスナーテスト 実装する ITestListenerComment赤い下線の上にカーソルを合わせると、 Eclipse 以下に示すように、2つの簡単な解決策を提案します。

Eclipse 未実装メソッドを追加するための応急処置

「未実装メソッドの追加」をクリックします。すると、以下のような複数のスタブメソッド(本体のないメソッド)がコードに追加されます。

パッケージ リスナーデモ;

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つあります。

最初の方法は、 @リスナー 以下に示す注釈:

@Listeners(Listener_Demo.ListenerTest.class)

この注釈を上に追加します テストケース クラス。すると、クラスは次のようになります。

パッケージ リスナーデモ;

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);
}
}

プロジェクトの構造は次のようになります。

TestNG リスナープロジェクト構造

ステップ4) 実行する テストケース クラス。内部のメソッド リスナーテスト 注釈が付けられたメソッドの動作に基づいて自動的に呼び出されます @テスト.

ステップ5) コンソールに表示されている出力を確認してください。

の出力 テストケース 次のようになります。

TestNG リスナーコンソール出力

[TestNG] 実行中:
C:\Users\gauravn\AppData\Local\Temp\testng-eclipse–1058076918\testng-customsuite.xml

ログインテストケースが開始されました
合格したテストケースの名前は「ログイン」です。
TestToFailテストケースが開始されました
このテスト方法は失敗します
失敗したテストケースの名前は TestToFail です。
合格: ログイン
失敗: TestToFail
java.lang.AssertionError: [true] が期待されていましたが、[false] が見つかりました

複数のクラスにリスナーを使用する

プロジェクトにテスト クラスが多数ある場合、 @リスナー それぞれに注釈を付けるのは面倒で、エラーが発生しやすくなる。

その場合は、 テスト ファイルを作成し、そこにリスナーを一度登録します。

複数のクラスに対応するtestng.xmlリスナータグ

このリスナーは、クラスの数に関係なく、テストスイート全体に適用されます。XMLファイルを実行すると、スイート内で宣言されたすべてのクラスに対してリスナーが起動し、同じタグ内に任意の数のリスナークラスを連結できます。

WebDriverListener で Selenium 4 と非推奨の EventFiringWebDriver の比較

一方、 TestNG リスナーはテストライフサイクルイベントに反応し、WebDriverリスナーはクリック、ナビゲーション、findElement呼び出しなどのブラウザドライバアクションに反応します。 Selenium 3 典型的なアプローチは WebDriverEventListener インターフェースは有線接続されています EventFiringWebDriverどちらも非推奨です Selenium 4.x。

現代の代替品は WebDriverListener インターフェースと イベント発火デコレーター:

import org.openqa.selenium.WebDriver;
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レベルのイベント用。

よくあるご質問

リスナーは、イベント発生時に生成されるイベントを購読するインターフェースです。 Selenium テスト走行。 TestNG リスナーは、開始、合格、不合格、スキップなどのテストライフサイクルイベントに反応します。WebDriverリスナーは、クリック、ナビゲーション、findElement呼び出しなどのブラウザドライバイベントに反応します。

ITestListener は個々の @Test メソッドに対して発生し、onTestStart、onTestSuccess、onTestFailure、onTestSkipped、および onFinish を公開します。ISuiteListener はスイートごとに onStart と onFinish の 2 回のみ発生するため、レポート ファイルを開くなどのスイート レベルの設定に最適です。

登録できるのは、 TestNG リスナーは 2 つの方法で作成できます。テスト クラスの上に @Listeners(MyListener.class) アノテーションを追加するか、 testng.xml 内のタグ。XML アプローチでは、ソースコードを変更することなく、スイート内のすべてのクラスにリスナーを適用します。

EventFiringWebDriver と WebDriverEventListener は非推奨です Selenium 4.x。推奨される代替手段は、WebDriverListener インターフェイスと EventFiringDecorator を組み合わせたもので、WebDriver、WebElement、または Alert インスタンスをラップでき、beforeGet や afterClick などのよりクリーンなフック ポイントを提供します。

テストスイートの完了後に、HTML や JSON 形式のサマリーなど、カスタムレポートを作成する場合は、IReporter を使用してください。@BeforeMethod や @AfterMethod などの設定メソッドを含め、すべてのテストメソッドの前後にフックが必要な場合は、IInvokedMethodListener を使用してください。

AI モデルは、各ログエントリに重大度タグを付け、自然言語による手順説明を生成し、関連する障害をクラスタリングすることで、リスナーの出力を充実させることができます。onTestFailure 内では、AI サービスがスクリーンショットとスタックを分析できます。 trace、次に考えられる根本原因を TestNG レポート。

はい。リスナーは、失敗を不安定、環境的、または実際の回帰として分類するAIサービスに、合否履歴をストリーミングできます。判定は次のように書き戻されます。 TestNG 属性により、ダッシュボードは、人間がすべてのレッドビルドをレビューすることなく、不安定なテストを隔離できます。