Как запустить несколько тестовых случаев в TestNG Люкс

⚡ Умное резюме

Запустите несколько тестовых случаев с помощью 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 ВебДрайвер.

Шаг 1) Создание TestNGXML-файл для выполнения тестов

Для создания конфигурации выполните следующие действия.

  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>

Окончательная структура проекта выглядит так, как показано в примере ниже.

Создание TestNGXML-файл для выполнения теста

Шаг 2) Параллельное выполнение в TestNG

После сохранения указанного выше XML-файла следующим шагом является запуск параллельных тестов. Код показан ниже.

Параллельное выполнение в TestNG

1) количество потоковОпределяет количество потоков. TestNG Может запускаться для параллельного выполнения. Более высокое значение запускает больше тестов одновременно, вплоть до предела возможностей процессора.

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

3) имяНазвание номера. Вот оно:Gmail Люкс».

4) параллельный: Рассказывает TestNG Что запускать параллельно. Допустимые значения: тесты, классы, методы или экземпляры. Значение по умолчанию: нет.

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

Когда вы выполните приведенный выше код, вы получите следующий результат.

Выход:

Параллельное выполнение в TestNG

1) Название набора тестов, определенного в файле testng.xml.

Параллельное выполнение в TestNG

2) Название теста, определенного в файле testng.xml.

Параллельное выполнение в TestNG

3) Название класса, объявленного в файле testng.xml.

Параллельное выполнение в TestNG

4) Названия методов в файле .java аннотированы с помощью @Test.

Параллельное выполнение в TestNG

Аналогичный алгоритм выполняется и для теста SnapDeal, поэтому оба класса выполняются параллельно.

Шаг 3) Запуск нескольких наборов тестов из одного родительского файла testng.xml

В крупных проектах часто требуется объединить несколько файлов testng.xml в один триггер. TestNG В версии 7.x поддерживается родительский набор, который ссылается на дочерний. файл набора записи, чтобы каждый дочерний процесс мог хранить собственное количество потоков, слушателей и параметры. Сохраняйте каждый набор дочерних процессов отдельно, а затем укажите родительскому процессу путь к нему. Запускайте только родительский файл из 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 работает

  • шпилька TestNG 7.х: Используйте TestNG 7.10 или более поздняя версия с Selenium 4. Таким образом, драйверы, соответствующие стандартам W3C, будут работать согласованно во всех потоках.
  • Избегайте использования общего состояния: Перемещение Вебдрайвер преобразуйте поле в ThreadLocal, чтобы каждый поток мог поддерживать собственную сессию.
  • Настройка количества нитей: Начните с подсчета количества ядер процессора, затем понаблюдайте за загрузкой HTML-отчета, который можно отправить по электронной почте, и сетки, прежде чем повышать этот показатель.
  • Выделить тестовые данные: Используйте уникальных пользователей, корзины и пин-коды для каждого потока, чтобы избежать конфликтов при входе в систему.
  • Делайте скриншоты при возникновении ошибки: Прикрепите их с помощью ITestListener для более быстрой отладки нестабильных параллельных процессов.
  • Воспользуйтесь помощью искусственного интеллекта: Такие инструменты, как Testimmabl и CodiumAI могут выявлять нестабильные тесты и предлагать стабильные селекторы перед следующим запуском.

Заключение

Приведенный выше пример показывает, как использовать TestNG для выполнения параллельных тестов. TestNG В версии 7.x используется один XML-файл для запуска нескольких тестовых классов, связывания нескольких дочерних наборов тестов и настройки параллельных потоков, что делает большие тестовые наборы слишком большими. Selenium Проекты завершаются гораздо быстрее.

Часто задаваемые вопросы (FAQ)

Разместите каждый класс в отдельном месте. Затем вставьте тег внутри файла testng.xml, установите параметр parallel=”tests” и количество потоков не менее 2. TestNG Оба теста запускаются в отдельных потоках, поэтому классы выполняются параллельно, а не последовательно.

Да. Создайте родительский набор файлов, в котором будет перечислены дочерние файлы внутри него. Каждый путь к файлу дочернего набора выполняет свою собственную конфигурацию. Этот шаблон работает в EclipseMaven Surefire и Gradleи поддерживается из TestNG Начиная с версии 6, включая текущую версию 7.x.

Атрибут parallel принимает значения tests, classes, methods, instances или none. Выбирайте tests, когда каждый Тег является самодостаточным, классы — для изоляции всего класса, а методы — когда отдельные методы с аннотацией @Test являются потокобезопасными. Значение по умолчанию — none, что означает последовательное выполнение всех действий.

Используйте ThreadLocal или инициализировать драйвер внутри блока `@BeforeMethod` вместо статического поля. В этом случае каждый поток будет владеть собственной сессией браузера, что исключает состояния гонки, приводящие к сбоям параллельных приложений. TestNG работает на Selenium Сетка.

Системы управления на основе ИИ анализируют данные предыдущих запусков, чтобы прогнозировать сбои, изолировать нестабильные тесты и перенастраивать медленные. Такие платформы, как Launchable, Testimи может быть подключен к TestNG Таким образом, сначала запускаются наиболее вероятные неудачные наборы тестов, что сокращает циклы обратной связи на серверах непрерывной интеграции.

Да. Планировщики на основе ИИ в Launchable и BuildPulse измеряют историческую продолжительность и частоту сбоев для каждого теста, а затем разделяют файл testng.xml на сбалансированные сегменты. Каждый сегмент работает на отдельном агенте, поэтому общее время выполнения сокращается, а параллельная загрузка остается высокой.

Подведем итог этой публикации следующим образом: