複数のテストケースを実行する方法 TestNG スイート
⚡ スマートサマリー
複数のテストケースを実行する TestNG スイート Selenium 単一の testng.xml から複数のクラス、パッケージ、または子スイートをトリガーできます。このチュートリアルでは、並列スレッド、スイート階層、レポート、および最新の AI アシスタンスについて説明します。 TestNG 7.x プロジェクト。
TestNG を使用すると、1 つのプロジェクト内でテスト メソッド、クラス、およびテスト スイート全体を並列実行できます。並列実行では、スレッドがテストを 1 つずつではなく同時に開始するため、全体の実行時間が短縮されます。このガイドでは、を使用して複数のクラス (異なるスイート) を実行する方法について説明します。 TestNG 7.x Selenium ウェブドライバー。
ステップ 1) TestNGテストを実行するための.xmlファイル
設定を作成するには、以下の手順に従ってください。
- 新しいプロジェクトを作成する Eclipse.
- プロジェクト内に 2 つのパッケージを作成します (名前を付けます) com.suite1 (NAIST) と com.suite2).
- 各パッケージにクラスを作成します(名前を付けます)。 フリップカート.java (NAIST) と Snapdeal.java)そして、以下のコードをそれぞれのクラスにコピーしてください。
- プロジェクトに新しいファイルを作成し、名前を付けます。 テスト。 その TestNG プラグインがインストールされました(手順はこちら) こちらtestng.xml ファイルには、クラス名、テスト名、スイート名などのすべての設定が含まれています。
フリップカート.java
package com.suite1; import java.util.concurrent.TimeUnit; import org.openqa.selenium.Alert; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.interactions.Actions; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; public class Flipkart { WebDriver driver = new FirefoxDriver(); String username = ""; // Change to your username and password String password = ""; // This method navigates to the Flipkart URL @BeforeClass public void init() { driver.manage().window().maximize(); driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS); driver.navigate().to("https://www.flipkart.com"); } // Log in to Flipkart @Test public void login() { driver.findElement(By.partialLinkText("Login")).click(); driver.findElement(By.cssSelector(".fk-input.login-form-input.user-email")).sendKeys(username); driver.findElement(By.cssSelector(".fk-input.login-form-input.user-pwd")).sendKeys(password); driver.findElement(By.cssSelector(".submit-btn.login-btn.btn")).click(); } // Search for a product @Test public void searchAndSelectProduct() { driver.findElement(By.id("fk-top-search-box")).sendKeys("moto g3"); driver.findElement(By.cssSelector("search-bar-submit.fk-font-13.fk-font-bold")).click(); String css = ".gd-row.browse-grid-row:nth-of-type(1) > div:nth-child(1)>div>div:nth-child(2)>div>a"; driver.findElement(By.cssSelector(css)).click(); } @Test public void buyAndRemoveFromCart() { driver.findElement(By.cssSelector(".btn-express-checkout.btn-big.current")).click(); driver.findElement(By.cssSelector(".remove.fk-inline-block")).click(); Alert a = driver.switchTo().alert(); a.accept(); } @Test public void logout() { Actions s = new Actions(driver); WebElement user = driver.findElement(By.partialLinkText(username)); s.moveToElement(user).build().perform(); driver.findElement(By.linkText("Logout")).click(); } @AfterClass public void quit() { driver.close(); } }
スナップディール.java
package com.suite2; import java.util.concurrent.TimeUnit; import org.openqa.selenium.Alert; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.interactions.Actions; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; public class SnapDeal { WebDriver driver = new FirefoxDriver(); String username = ""; // Change to your username and password String password = ""; String pinCode = ""; // This method navigates to the Snapdeal URL @BeforeClass public void init() { driver.manage().window().maximize(); driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS); driver.navigate().to("https://www.snapdeal.com"); } @Test public void login() { driver.findElement(By.xpath("//button[text()='Login']")).click(); driver.switchTo().frame("loginIframe"); driver.findElement(By.cssSelector("div[onClick='getLoginForm()']")).click(); driver.findElement(By.id("j_username")).sendKeys(username); driver.findElement(By.id("j_password_login")).sendKeys(password); driver.findElement(By.id("signin_submit")).click(); driver.switchTo().defaultContent(); } @Test public void searchAndSelectProduct() { driver.findElement(By.cssSelector(".col-xs-20.searchformInput.keyword")).sendKeys("iphone 6s"); driver.findElement(By.cssSelector(".sd-icon.sd-icon-search")).click(); String css = ".product_grid_row:nth-of-type(1)>div:nth-child(1)"; driver.findElement(By.cssSelector(css)).click(); } @Test public void buyAndRemoveFromCart() { driver.findElement(By.xpath("//li[contains(text(),'Silver')]")).click(); driver.findElement(By.id("pincode-check")).sendKeys(pinCode); driver.findElement(By.id("buy-button-id")).click(); driver.findElement(By.cssSelector("i[title='Delete Item']")).click(); Alert a = driver.switchTo().alert(); a.accept(); } @Test public void logout() { driver.findElement(By.linkText("START SHOPPING NOW")).click(); Actions s = new Actions(driver); WebElement user = driver.findElement(By.cssSelector(".sd-icon.sd-icon-user")); s.moveToElement(user).build().perform(); driver.findElement(By.linkText("Logout")).click(); } @AfterClass public void quit() { driver.close(); } }
TestNG。のXml
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite thread-count="2" verbose="1" name="Gmail Suite" parallel="tests"> <test name="flipkart"> <classes> <class name="com.suite1.Flipkart"/> </classes> </test> <test name="Myntra"> <classes> <class name="com.suite2.SnapDeal"/> </classes> </test> </suite>
最終的なプロジェクト構造は、以下の例のようになります。
ステップ 2) での並列実行 TestNG
上記のXMLファイルを保存した後、次のステップは並列テストを実行することです。コードは以下のとおりです。
1) スレッド数: スレッド数を定義します TestNG 並列実行のために起動できます。値が大きいほど、CPUの上限まで同時に実行されるテストの数が増えます。
2) 冗長コンソールに実行の詳細をログ出力します。指定可能な値は1~10です。値が大きいほど、より詳細で粒度の高いログが出力されます。
3) 名前: スイートの名前。こちらです「Gmail スイート"。
4) 平行: 伝える TestNG 並行して実行するもの。有効な値は、テスト、クラス、メソッド、またはインスタンスです。デフォルト値は なし.
testng.xml ファイルを右クリックして、 実行者 > TestNG スイート処理が完了すると、集計結果が表示されます。
上記のコードを実行すると、次の出力が得られます。
出力:
1) testng.xmlで定義されているスイートの名前。
2) testng.xmlで定義されているテストの名前。
3) testng.xmlで宣言されているクラスの名前。
4) .java ファイル内で @Test で注釈が付けられたメソッド名。
SnapDealのテストでも同じフローが実行されるため、両方のクラスが並行して実行されます。
ステップ3)1つの親testng.xmlから複数のスイートを実行する
大規模プロジェクトでは、複数のtestng.xmlファイルを連結して単一のトリガーにするという要件がよく見られます。 TestNG 7.x は、子を参照する親スイートをサポートしています。 スイートファイル エントリにより、各子は独自のスレッド数、リスナー、およびパラメーターを保持できます。各子スイートを個別に保存し、親にそのパスを指定します。親ファイルのみを実行します。 EclipseMaven、またはコマンドライン。
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="Parent Suite" parallel="tests" thread-count="4"> <suite-files> <suite-file path="./flipkart-suite.xml"/> <suite-file path="./snapdeal-suite.xml"/> </suite-files> </suite>
このパターンでは、回帰テスト、スモークテスト、および健全性テストスイートを分離しつつ再利用可能にしています。また、Maven Surefireから親ファイルをトリガーするには、次のように設定します。 <suiteXmlFile>parent-suite.xml</suiteXmlFile> プラグインの設定内部で、継続的インテグレーションパイプラインでも同じ並列レイアウトが機能するようにします。
ステップ4)並列処理のベストプラクティス TestNG runs
- ピン留め TestNG 7.x: TestNG 7.10以降 Selenium 4. W3C準拠のドライバがスレッド間で一貫した動作をするようにする。
- 共有状態を避ける: 移動 webdriver フィールドをThreadLocalに変換することで、各スレッドが独自のセッションを保持できるようにします。
- スレッド数を調整する: まずはCPUコア数を確認し、次にメール送信可能なHTMLレポートとグリッドの読み込み状況を確認してから、コア数を増やしてください。
- 試験データを分離する: ログインが競合しないように、スレッドごとに固有のユーザー、カート、PINコードを使用してください。
- 失敗時にスクリーンショットをキャプチャする: それらを接続します ITestListenerComment 不安定な並列実行をより迅速にデバッグするため。
- AIアシスタントを活用する: のようなツール TestimmablやCodiumAIは、不安定なテストを検出し、次の実行前に安定したセレクターを提案することができます。
結論
上記の例は、使用方法を示しています。 TestNG 並列テストを実行する。 TestNG 7.x では、複数のテスト クラスを起動し、複数の子スイートをリンクし、並列スレッドを調整するための単一の XML ファイルが提供されるため、大規模な Selenium プロジェクトがはるかに早く完了する。





