Як запустити кілька тестових випадків у TestNG Suite

⚡ Розумний підсумок

Запуск кількох тестових випадків за допомогою TestNG Люкс в Selenium дозволяє запускати кілька класів, пакетів або дочірніх наборів з одного testng.xml. Цей посібник охоплює паралельні потоки, ієрархію наборів, звітність та допомогу штучного інтелекту для сучасних... TestNG 7.x проекти.

  • 🧵 Паралельні нитки: Встановіть thread-count та parallel=”tests”, щоб скоротити загальний час виконання в різних браузерах та пакетах.
  • 🗂️ Ієрархія люксів: Батьківський файл testng.xml може перераховувати записи дочірніх файлів наборів для об'єднання кількох наборів в один тригер.
  • TestNG 7.x Готовий: Приклади узгоджуються з TestNG 7.10 і Selenium 4 драйвери W3C, що замінюють застарілі версії FirefoxПроводка драйвера.
  • 📊 Розумна звітність: Детальні звіти рівнів від 1 до 10 та HTML-звіти, які можна надсилати електронною поштою, допомагають швидко діагностувати невдалі паралельні потоки.
  • 🤖 Оркестрація ШІ: Планувальники на основі штучного інтелекту змінюють порядок, повторюють спроби та розподіляють набори шардів на основі історичних даних про періодичність та тривалість.

Запуск кількох тестових випадків за допомогою TestNG Люкс в Selenium

TestNG дозволяє запускати методи тестування, класи та повні набори паралельно в одному проєкті. Паралельне виконання зменшує загальний час виконання, оскільки потоки запускають тести одночасно, а не один за одним. У цьому посібнику пояснюється, як запускати кілька класів (різних наборів) за допомогою TestNG 7.x з Selenium WebDriver.

Крок 1) Створення a TestNG.xml-файл для виконання тестів

Щоб створити конфігурацію, виконайте наведені нижче кроки.

  1. Створіть новий проект у Eclipse.
  2. Створіть два пакети в проекті (назвіть їх com.suite1 та com.suite2).
  3. Створіть клас у кожному пакеті (назвіть їх Flipkart.java та Snapdeal.java) та скопіюйте наведений нижче код у відповідні класи.
  4. Створіть новий файл у вашому проєкті та назвіть його 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>

Остаточна структура проекту виглядає як у прикладі нижче.

Створення TestNGФайл .xml для виконання тесту

Крок 2) Паралельне виконання в TestNG

Після збереження наведеного вище XML-файлу наступним кроком є ​​запуск паралельних тестів. Код показано нижче.

Паралельне виконання в TestNG

1) кількість нитокВизначає, скільки потоків TestNG може розкручуватися для паралельного виконання. Вище значення запускає більше тестів одночасно, аж до ліміту процесора.

2) багатослівний: Записує деталі виконання в консолі. Допустимі значення від 1 до 10. Вищі значення створюють детальніші та детальніші журнали.

3) ім'яНазва люкса. Ось вона «Gmail Люкс».

4) паралельнийРозповідає TestNG що запускати одночасно. Дійсні значення – це тести, класи, методи або екземпляри. Значення за замовчуванням – ніхто.

Клацніть правою кнопкою миші на файлі testng.xml та виберіть Запустити від імені > TestNG Suite Після завершення ви побачите зведені результати.

Коли ви виконаєте наведений вище код, ви отримаєте наступний результат.

вихід:

Паралельне виконання в TestNG

1) Назва пакету, визначеного в testng.xml.

Паралельне виконання в TestNG

2) Назва тесту, визначеного в testng.xml.

Паралельне виконання в TestNG

3) Ім'я класу, оголошеного в testng.xml.

Паралельне виконання в TestNG

4) Назви методів, анотовані за допомогою @Test у файлі .java.

Паралельне виконання в TestNG

Той самий потік виконується для тесту 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 проекти завершуються набагато швидше.

Поширені запитання

Розмістіть кожен клас у своєму окремому всередині testng.xml, потім встановіть parallel=”tests” та кількість потоків щонайменше 2. TestNG запускає обидва тести в окремих потоках, тому класи виконуються одночасно, а не послідовно.

Так. Створіть батьківський пакет, який містить список дочірніх файлів усередині. Кожен шлях до дочірнього файлу набору виконує власну конфігурацію. Шаблон працює в Eclipse, Maven Surefire та Gradle, і підтримується з TestNG 6 та новіших версій, включаючи поточну версію 7.x.

Атрибут parallel приймає тести, класи, методи, екземпляри або жодного варіанта. Вибирайте тести, коли кожен Тег є автономним, класи для ізоляції всього класу та методи, коли окремі методи @Test є потокобезпечними. Значення за замовчуванням — none, що виконує все послідовно.

Використовуйте ThreadLocal або ініціалізуйте драйвер всередині блоку @BeforeMethod, а не як статичне поле. Кожен потік тоді володіє власним сеансом браузера, що усуває умови змагання, які призводять до паралельного аварійного завершення. TestNG бігає на Selenium Сітка.

Оркестратори ШІ вивчають дані попередніх запусків, щоб прогнозувати збої, поміщати ненадійні тести в карантин та змінювати порядок повільних. Такі платформи, як Launchable, Testim, і підключіть mabl до TestNG тому пакети з найімовірнішими збоями запускаються першими, що скорочує цикли зворотного зв'язку на серверах безперервної інтеграції.

Так. Планувальники на основі штучного інтелекту в Launchable та BuildPulse вимірюють історичну тривалість та частоту збоїв для кожного тесту, а потім розділяють testng.xml на збалансовані шарди. Кожен шард працює на окремому агенті, тому загальний час роботи настінного процесора зменшується, тоді як паралельне використання залишається високим.

Підсумуйте цей пост за допомогою: