Як запустити кілька тестових випадків у TestNG Suite
⚡ Розумний підсумок
Запуск кількох тестових випадків за допомогою TestNG Люкс в Selenium дозволяє запускати кілька класів, пакетів або дочірніх наборів з одного testng.xml. Цей посібник охоплює паралельні потоки, ієрархію наборів, звітність та допомогу штучного інтелекту для сучасних... TestNG 7.x проекти.
TestNG дозволяє запускати методи тестування, класи та повні набори паралельно в одному проєкті. Паралельне виконання зменшує загальний час виконання, оскільки потоки запускають тести одночасно, а не один за одним. У цьому посібнику пояснюється, як запускати кілька класів (різних наборів) за допомогою TestNG 7.x з Selenium WebDriver.
Крок 1) Створення a TestNG.xml-файл для виконання тестів
Щоб створити конфігурацію, виконайте наведені нижче кроки.
- Створіть новий проект у Eclipse.
- Створіть два пакети в проекті (назвіть їх com.suite1 та com.suite2).
- Створіть клас у кожному пакеті (назвіть їх Flipkart.java та Snapdeal.java) та скопіюйте наведений нижче код у відповідні класи.
- Створіть новий файл у вашому проєкті та назвіть його testng.xml. Переконайтеся, що TestNG плагін встановлено (інструкції доступні тут). Файл testng.xml містить усю конфігурацію, таку як назви класів, назви тестів та назви пакетів.
Flipkart.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(); } }
SnapDeal.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 може розкручуватися для паралельного виконання. Вище значення запускає більше тестів одночасно, аж до ліміту процесора.
2) багатослівний: Записує деталі виконання в консолі. Допустимі значення від 1 до 10. Вищі значення створюють детальніші та детальніші журнали.
3) ім'яНазва люкса. Ось вона «Gmail Люкс».
4) паралельнийРозповідає TestNG що запускати одночасно. Дійсні значення – це тести, класи, методи або екземпляри. Значення за замовчуванням – ніхто.
Клацніть правою кнопкою миші на файлі testng.xml та виберіть Запустити від імені > TestNG Suite Після завершення ви побачите зведені результати.
Коли ви виконаєте наведений вище код, ви отримаєте наступний результат.
вихід:
1) Назва пакету, визначеного в testng.xml.
2) Назва тесту, визначеного в testng.xml.
3) Ім'я класу, оголошеного в testng.xml.
4) Назви методів, анотовані за допомогою @Test у файлі .java.
Той самий потік виконується для тесту SnapDeal, тому обидва класи виконуються пліч-о-пліч.
Крок 3) Запуск кількох пакетів з одного батьківського файлу testng.xml
Поширеною вимогою для великих проектів є об'єднання кількох файлів testng.xml в один тригер. TestNG 7.x підтримує батьківський набір, який посилається на дочірній suite-file записи, щоб кожен дочірній об'єкт міг зберігати власну кількість потоків, слухачі та параметри. Збережіть кожен дочірній набір окремо, а потім вкажіть батьківському об'єкту його шлях. Запустіть лише батьківський файл з Eclipse, Maven або командний рядок.
<!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 пробіжки
- Pin TestNG 7.x: Скористайтеся кнопкою TestNG 7.10 або пізнішої версії з Selenium 4, щоб драйвери, сумісні з W3C, поводилися однаково в усіх потоках.
- Уникайте спільного стану: Переміщення веб-драйвер поле в ThreadLocal, щоб кожен потік мав власний сеанс.
- Кількість потоків налаштування: Почніть з кількості ядер процесора, потім перегляньте HTML-звіт, який можна надіслати електронною поштою, та завантаження Grid, перш ніж збільшувати його.
- Ізолювати тестові дані: Використовуйте унікальних користувачів, кошики та PIN-коди для кожного потоку, щоб логіни ніколи не конфліктували.
- Зробіть скріншоти у разі невдачі: Прикріпіть їх через ITestListener для швидшого налагодження нестабільних паралельних запусків.
- Використовуйте допомогу ШІ: Такі інструменти, як Testim, mabl та CodiumAI можуть позначати ненадійні тести та пропонувати стабільні селектори перед наступним запуском.
Висновок
Наведений вище приклад показує, як використовувати TestNG виконувати паралельні тести. TestNG 7.x надає вам один XML-файл для запуску кількох тестових класів, зв'язування кількох дочірніх наборів та налаштування паралельних потоків, настільки великих Selenium проекти завершуються набагато швидше.





