Как да изпълните множество тестови случаи в 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 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 апартаментСлед като приключи, ще видите консолидираните резултати.

Когато изпълните горния код, ще получите следния изход.

Изход:

Паралелно изпълнение в 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 работи

  • щифт TestNG 7.x: употреба TestNG 7.10 или по-нова версия с Selenium 4, така че съвместимите с W3C драйвери да се държат последователно в различните нишки.
  • Избягвайте споделеното състояние: Преместете уебдрайвер поле в ThreadLocal, така че всяка нишка да поддържа собствена сесия.
  • Брой нишки за настройка: Започнете с броя на ядрата на процесора, след което гледайте HTML отчета, който може да се изпрати по имейл, и зареждането на Grid, преди да го увеличите.
  • Изолиране на тестови данни: Използвайте уникални потребители, колички и ПИН кодове за всяка нишка, така че входните данни никога да не се сблъскват.
  • Заснемане на екранни снимки при неуспех: Прикрепете ги чрез ITestListener за по-бързо отстраняване на грешки при нестабилни паралелни изпълнения.
  • Използвайте помощ от изкуствен интелект: Инструменти като Testim, mabl и CodiumAI могат да сигнализират за нестабилни тестове и да предлагат стабилни селектори преди следващото изпълнение.

Заключение

Горният пример показва как да се използва TestNG да се изпълнят паралелни тестове. TestNG 7.x ви предоставя един XML файл за стартиране на множество тестови класове, свързване на няколко дъщерни пакета и настройване на паралелни нишки, толкова големи Selenium проектите завършват много по-бързо.

Въпроси и Отговори

Поставете всеки клас на негово собствено място таг вътре в testng.xml, след това задайте parallel=”tests” и брой нишки поне 2. TestNG стартира и двата теста в отделни нишки, така че класовете се изпълняват едновременно, а не последователно.

Да. Създайте родителски пакет, който изброява дъщерните файлове вътре. Всеки път до дъщерния suite-file изпълнява собствена конфигурация. Моделът работи в Eclipse, Maven Surefire и Gradleи се поддържа от TestNG 6 нататък, включително текущата версия 7.x.

Атрибутът parallel приема тестове, класове, методи, инстанции или никакви. Изберете тестове, когато всеки Тагът е самостоятелен, класовете за изолация на целия клас и методите, когато отделните @Test методи са безопасни за нишки. Стойността по подразбиране е none, което изпълнява всичко последователно.

Използвайте ThreadLocal или инициализирайте драйвера вътре в блок @BeforeMethod, вместо като статично поле. Всяка нишка след това притежава собствена сесия на браузъра, което елиминира условията на състезание, които водят до паралелен срив. TestNG работи по Selenium Решетка.

Оркестраторите на AI изучават данни от предишни изпълнения, за да предскажат неуспехи, да поставят под карантина нестабилни тестове и да пренареждат бавните. Платформи като Launchable, Testimи mabl се включва в TestNG така че най-вероятно неуспешните пакети се изпълняват първи, което съкращава циклите на обратна връзка на сървърите за непрекъсната интеграция.

Да. Планировчиците, управлявани от изкуствен интелект, в Launchable и BuildPulse измерват историческата продължителност и честотата на прекъсване на теста, след което разделят testng.xml на балансирани шардове. Всеки шард работи на отделен агент, така че общото време на стенен часовник намалява, докато паралелното използване остава високо.

Обобщете тази публикация с: