のグループ TestNG

⚡ スマートサマリー

のグループ TestNG テストメソッドに論理ラベルを付けてタグ付けし、XMLスイートを介してそれらを含めるか除外することができます。このアプローチは、コードを書き直すことなく、スモークテスト、回帰テスト、および依存関係駆動型テストの実行を簡素化します。 Java コー​​ド。

  • 🏷️ アノテーション構文:   @Test(groups = {"smoke","regression"}) 任意のメソッドに、1つ以上の論理グループ名をタグ付けする。
  • 📜 XML制御: その <groups><run><include> (NAIST) と <exclude> testng.xml内のタグによって、実際に実行されるタグ付きメソッドが決まります。
  • 🔗 依存関係: その dependsOnGroups 属性によって順序が強制されるため、前提条件グループは依存テストが開始される前に必ず完了します。
  • 🤖 AIによる選定: AIテスト影響評価ツールは、コードの変更を関連するグループにマッピングするため、各コミットで影響を受けるテストスイートのみが実行されます。
  • 🧪 TestNG 7.x: 最新のリリースでは、グループが並列実行、リスナー、およびMaven Surefireパイプラインと完全に互換性を保つように維持されています。

のグループ TestNG

TestNG は、単体テスト、機能テスト、エンドツーエンドテスト、UIテスト、統合テストを網羅するテストフレームワークです。 Java プロジェクト。

XMLスイートを作成し、Maven経由で実行することで、単一のパッケージまたは複数のパッケージ(パッケージは、定義されたディレクトリ構造内に関連するクラスをカプセル化したもの)を実行できます。

TestNG グループと例

グループを使用する TestNG いつ:

  • 機能領域のみに基づいて多くのクラスにテストメソッドを分散させることは望ましくありません。
  • 選択したテストケースを、コードベースに存在しないかのようにスキップ(実行しない)したい。
  • 両方の目標を達成するために、メソッドを論理的なグループに分類します。 TestNG そして、XMLスイートで宣言された「include」フィルターと「exclude」フィルターを尊重します。

以下のコードスニペットは、テストメソッドで使用されるグループタグ付け構文を示しています。

@テスト (グループヘッド = { "ボンディング", 「強い絆」 })

ここでは2つのグループ名が使用されています。 bonding (NAIST) と strong_tiesこれらは論理的なラベルであり、プロジェクトに合わせて名前を変更できます。

その <groups> タグは、XML スイート内のグループフィルタの開始を示します。

次に、XMLをカスタマイズして、タグ付けされたクラスから選択したグループを選択します。以下の例は、グループ宣言の構文を示しています。

<グループヘッド>
<ラン>
<include ="ボンディング" />
</ラン>
</グループヘッド>

あるクラスに10個のテストメソッドが含まれていると仮定します。

これらの方法のうち:

  • 6つの方法で bonding グループ、そして
  • 4つの方法で strong_ties グループ。

次に、Maven をセットアップして Java パスと使用 Eclipse IDE は、XML ファイルを介してグループの使用を実証します。 Java-ベースのMavenプロジェクト。

XML を作成する TestNG タグ付き

  • MavenフレームワークのXML(拡張マークアップ言語)ファイルには、1つ以上のテストの設定が格納され、 タグ。
  • 各テストエントリは タグを1つ以上保持できます TestNG クラス。
  • A Java 1つ以上のクラス @テスト メソッドの注釈は TestNG とに提供されます。

複数のタグが順番に現れて、動作する testng.xml ファイルを構築します。 、 、 そして。

  • その タグには、スイートレベルの名前が保持されます。 TestNG 執行概要に関する報告書。
  • その <test name=”Guru 99 スモークテストデモ”> タグには論理的なテスト名が格納されます。レポートでは、合格、不合格、スキップの件数、合計実行時間、およびグループメタデータにこのタグが使用されます。
  • その タグはテストクラスを指し、 com.group.guru99 パッケージと TC_Class1 これはクラス名です。

<!DOCTYPE スイート SYSTEM 「http://testng.org/testng-1.0.dtd」>
<スイート ="スイート">
<test = Guru 99 スモークテストデモ>
<グループヘッド>
<ラン>
<include =「強い絆」 />
</ラン>
</グループヘッド>
<クラス>
<class =「com.group.guru99.TC_Class1」 />
</クラス>
</test>
</スイート>

このXML設定は、次のセクションのビデオチュートリアルで参照されています。

テスト XML での「除外」または「含める」

グループメカニズムが小規模なフィルタには重すぎると感じる場合は、testng.xmlスイートでは、個々のテストメソッドを名前で除外または含めることもできます。

除外タグ: 除外タグの構文除外する =「${TEST_CASE_NAME}」 />
タグを含める: includeタグの構文include =「${TEST_CASE_NAME}」 />

注意: 1回の実行で複数のテストケースを含めたり除外したりすることができ、グループフィルターにも同じ構文が適用されます。

dependsOnGroups を使用した順序付き実行

単なる包含を超えて、 TestNG あるグループが別のグループに依存することを可能にする dependsOnGroups 属性。ランナーは、親グループ内のすべてのメソッドが依存メソッドの開始前に完了することを保証し、前提条件の信頼性を維持します。

  • まずログインしてから、取引を行ってください。 タグログイン方法 group = "auth"、タグ転送テスト dependsOnGroups = {"auth"}転送テストは、ログインが成功した後にのみ実行されます。
  • 失敗時にスキップ: 親グループのメソッドが失敗した場合、 TestNG 依存するメソッドを完全に失敗させるのではなく、スキップされたものとしてマークすることで、レポートの正確性を維持します。
  • alwaysRunと組み合わせる: クリーンアップ方法を設定する必要があります alwaysRun = true そのため、上流グループが失敗した場合でも、ティアダウン処理は実行されます。

このパターンは、APIの設定が完了してからUIのアサーションが開始される必要があるエンドツーエンドのスイートでよく見られるものです。

ラン TestNG コードのグループ化、包含、除外 (ビデオデモ)

以下はウォークスルーです Java コードと、それを駆動する XML スイート グループ化、除外、および含める 行動。

テストシナリオ: 起動する Guru99のデモ銀行サイトで、ログインページのいくつかの要素を確認し、認証情報を入力し、ログイン後にダッシュボードでいくつかの項目を再確認します。

ラン TestNG グループ、含める、除外 Code

注意: 各ステップはそれぞれ独自のメソッド内に存在しますが、実行時の順序はXMLスイート内のエントリによって決まります。

  • 方法1: ブラウザを初期化して起動します URL (tc01LaunchURL()).
  • 方法2: ログインページの見出しを確認してください(tc02VerifyLaunchPage()).
  • 方法3: ログインフォームにユーザー名とパスワードを入力してください(tc03EnterCredentials()).
  • 方法4: ユーザーダッシュボードにマネージャーIDが存在することを確認します(tc04VerifyLoggedInPage()).
  • 方法5: ユーザーダッシュボードで追加のリンクを確認します(tc05VerifyHyperlinks()).

Code シナリオの場合:

パッケージ com.group.guru99;

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox です。Firefoxドライバ;
import org.testng.Assert;
import org.testng.annotations.Test;

パブリッククラス TC_Class1 {
パブリックスタティックファイナル webdriver ウェブドライバー = NEW Firefoxドライバ();

String launchPageHeading = “//h3[text()='Guru99バンク']”;
ファイナル String ユーザー名要素 = “//input[@name='uid']”、password_element = “//input[@name='password']”,
signIn_element = “//input[@name='btnLogin']”;
ファイナル String ユーザー名の値 = 「mngr28642」、password_value = 「ydAnate」;
ファイナル String マネージャーID = “//td[contains(text(),'Manger Id')]”;
ファイナル String 新規顧客 = “//a[@href='addcustomerpage.php']”、fundTransfer = “//a[@href='FundTransInput.php']”;

/** このテストケースはwebDriverを初期化します */
@テスト(グループヘッド = { "ボンディング", 「強い絆」 })
パブリックボイド tc01LaunchURL(){
webDriver.manage().window().maximize();
webDriver.manage().timeouts().implicitlyWait(20、TimeUnit.SECONDS);
webDriver.get(「https://www.demo.guru99.com/V4/」);
}

/** ログインページに見出しが存在するかどうかを確認します */
@テスト(グループヘッド = { "ボンディング" })
パブリックボイド tc02VerifyLaunchPage() {
Assert.assertTrue(webDriver.findElement(By.xpath(launchPageHeading)).isDisplayed(),
「ホームページの見出しが表示されません」);
System.out.println(「ホームページの見出しが表示されます」);
}

/** ユーザー名とパスワードを入力し、サインインをクリックします */
@テスト(グループヘッド = { "ボンディング", 「強い絆」 })
パブリックボイド tc03EnterCredentials() {
webDriver.findElement(By.xpath(userName_element)).sendKeys(userName_value);
webDriver.findElement(By.xpath(password_element)).sendKeys(password_value);
webDriver.findElement(By.xpath(signIn_element)).click();
}

/** ダッシュボード上のマネージャーIDを検証します */
@テスト(グループヘッド = { 「強い絆」 })
パブリックボイド tc04VerifyLoggedInPage() {
Assert.assertTrue(webDriver.findElement(By.xpath(managerID)).isDisplayed(),
「管理者IDラベルが表示されません」);
System.out.println(「マネージャーIDラベルが表示されます」);
}

/** ダッシュボード上の新規顧客リンクと資金振替リンクを確認します */
@テスト(グループヘッド = { "ボンディング" })
パブリックボイド tc05VerifyHyperlinks() {
Assert.assertTrue(webDriver.findElement(By.xpath(newCustomer)).isEnabled(),
「新規顧客向けハイパーリンクが表示されません」);
System.out.println(「新規顧客向けハイパーリンクが表示されます」);

Assert.assertTrue(webDriver.findElement(By.xpath(fundTransfer)).isEnabled(),
「資金移動のハイパーリンクが表示されません」);
System.out.println(「資金移動のハイパーリンクが表示されます」);
}
}

ご注意ください:デモ用の銀行口座情報は、約20日間有効です。そのため、有効期間が過ぎた後にローカル環境で実行すると、無効な認証情報エラーが表示される場合があります。

コードの説明:

5つのテスト方法(アクションごとに1つ)には、 groups の属性 @Test 注釈。

2つの論理グループラベルは次のとおりです。 strong_ties (NAIST) と bonding.

  • 1番目と3番目の方法は両方とも bonding (NAIST) と strong_tiesそのため、どちらかのグループがスイートに含まれている場合はいつでも実行されます。これは共有の一般的なパターンです。 テストケース 手順。
  • 2番目の方法は、 bondingそのため、 bonding グループが含まれています。
  • 4番目の方法は、 strong_tiesそのため、そのグループが含まれている場合にのみ実行されます。
  • 5番目のメソッドには、 bondingそのため、 bonding グループが含まれています。

以下に4つの実行シナリオを示します。

シナリオ1: グループに関係なく、すべてのテストメソッドを実行します。 <groups> 実行中のXMLからブロックします。

シナリオ2: 選択したグループに関連付けられたメソッドのみを実行します。 strong_ties or bonding下記の動画をご参照ください。

  • ビデオの最初の部分では、 <groups> このブロックはコメントアウトされているため、すべてのテストメソッドが実行されます。
  • 第2部では、グループフィルターが復元され、一致するメソッドのみが実行されます。

シナリオ3: 除外フィルターを適用して、選択したテストケースをスキップしてください。詳細は動画をご覧ください。

  • デモには以下は含まれません tc02 実行中の XML 内の名前で除外され、結果レポートで除外されたメソッドが実行されないことが確認されます。

シナリオ4: 包含フィルターを適用して、 tc01LaunchURL, tc03EnterCredentials, tc05VerifyHyperlinks動画をご参照ください。

今回の実行では、インクルードフィルタにリストされているメソッドのみが、設定どおりに実行されます。

下記のリンクからサンプルプロジェクトをダウンロードしてください。

上記をダウンロード Code

結論

のグループ TestNG 大規模な構造をもたらす Selenium また、単発的なクラス分割を宣言的なXMLフィルタに置き換えることで、ユニットスイートも管理します。

メソッドにタグを付けます @Test(groups = {...})、次に使用 <include>, <exclude>, dependsOnGroups 同じ Maven プロジェクトから煙、回帰、エンドツーエンドの実行を実行する TestNG 7.x。

よくあるご質問

グループとは、テストメソッドに付随する論理ラベルです。 groups 属性オン @TestXMLスイートは、包含フィルターと除外フィルターを使用してグループを選択するため、実行時にどのタグ付きメソッドを実行するかを決定できます。

内部 <groups><run> <include name="..."> タグのホワイトリストグループをランタイム用に指定し、 <exclude name="..."> それらをブロックする。 TestNG 除外は包含の後に適用されるため、除外されたグループは、包含にもリストされている場合でも常にスキップされます。

その dependsOnGroups 属性オン @Test 軍隊 TestNG 依存メソッドの開始前に、リストされたグループ内のすべてのメソッドを実行します。前提条件となるメソッドが失敗した場合、 TestNG 依存メソッドが失敗したのではなく、スキップされたことを示す。

はい。 の groups 属性は配列を受け入れるので、 @Test(groups = {"smoke", "regression"}) 両方のグループに1つの方法を配置する。 TestNG いずれかのグループがスイートに含まれるたびにそのメソッドが実行されるため、共有ステップはDRY(Don't Repeat Yourself)に保たれます。

TestNG 7.x はメンテナンス対象ラインであり、 org.testng:testng Maven の調整。グループ、並列実行、リスナーを最新のシステムと完全に互換性のある状態に保ちます。 Selenium 4およびJDK 17プロジェクト。

AIテスト影響ツールはコードの差分を分析し、変更されたクラスをそれらをカバーするグループにマッピングします。パイプラインは、各プルリクエストでタグ付けされたグループのみを実行し、フィードバック時間を短縮しながら、ping 危険な道筋が試されている。

はい。AIクラスタリングアルゴリズムは、過去の障害ログを読み取り、不安定なテストにフラグを立て、安定したサブセットを提案します。 regressionエンジニアがリストを承認し、 TestNG そのグループは毎晩そのグループを運営しており、スイートルームの収容人数を制限せずにカバー範囲を狭めることなく運営している。