Cum se execută mai multe cazuri de testare în TestNG Suită

⚡ Rezumat inteligent

Executați mai multe cazuri de testare cu TestNG Suită în Selenium vă permite să declanșați mai multe clase, pachete sau suite copii dintr-un singur fișier testng.xml. Această prezentare prezintă fire de execuție paralele, ierarhia suitelor, raportarea și asistența AI pentru tehnologiile moderne. TestNG Proiecte 7.x.

  • 🧵 Fire paralele: Setați thread-count și parallel="tests" pentru a reduce timpul total de execuție în browsere și pachete.
  • 🗂️ Ierarhia suitelor: Un fișier testng.xml părinte poate lista intrări de fișiere suite copil pentru a înlănțui mai multe suite într-un singur declanșator.
  • ⚙️ TestNG 7.x Gata: Exemplele se aliniază cu TestNG 7.10 și Selenium 4 drivere W3C, care înlocuiesc versiunile vechi FirefoxCablarea driverului.
  • 📊 Raportare inteligentă: Nivelurile detaliate de la 1 la 10 și rapoartele HTML care pot fi trimise prin e-mail ajută la diagnosticarea rapidă a firelor de execuție paralele eșuate.
  • 🤖 Orchestrarea AI: Planificatoarele bazate pe inteligență artificială reordonează, reîncercă și fragmentează suite pe baza datelor istorice de tip flake și durată.

Executați mai multe cazuri de testare cu TestNG Suită în Selenium

TestNG vă permite să rulați metode de testare, clase și suite complete în paralel în cadrul unui singur proiect. Execuția paralelă reduce timpul total de execuție deoarece thread-urile pornesc testele simultan, în loc de unul după altul. Acest ghid explică cum să rulați mai multe clase (suite diferite) folosind TestNG 7.x cu Selenium WebDriver.

Pasul 1) Crearea unui TestNGFișier .xml pentru executarea testelor

Pentru a crea configurația, urmați pașii de mai jos.

  1. Creați un nou proiect în Eclipse.
  2. Creați două pachete în proiect (denumiți-le com.suite1 și com.suite2).
  3. Creați o clasă în fiecare pachet (denumiți-le Flipkart.java și Snapdeal.java) și copiați codul de mai jos în clasele respective.
  4. Creați un fișier nou în proiectul dvs. și denumiți-l testng.xml. Asigurați-vă că TestNG pluginul este instalat (instrucțiuni disponibile) aiciFișierul testng.xml conține toate configurațiile, cum ar fi numele claselor, numele testelor și numele suitelor.

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>

Structura finală a proiectului arată ca în exemplul de mai jos.

Crearea unui TestNGFișier .xml pentru executarea testului

Pasul 2) Execuție paralelă în TestNG

După salvarea fișierului XML de mai sus, următorul pas este rularea testelor paralele. Codul este prezentat mai jos.

Execuție paralelă în TestNG

1) numărul de fire: Definește câte fire de execuție TestNG se poate roti pentru execuție paralelă. O valoare mai mare execută mai multe teste simultan, până la limita CPU.

2) verbosÎnregistrează detaliile execuției în consolă. Valorile permise sunt cuprinse între 1 și 10. Valorile mai mari produc jurnale mai detaliate și mai granulare.

3) numeNumele suitei. Iată-l „Gmail Suită".

4) paralelSpune TestNG ce să ruleze concomitent. Valorile valide sunt teste, clase, metode sau instanțe. Valoarea implicită este nici unul.

Faceți clic dreapta pe fișierul testng.xml și selectați Executare ca > TestNG SuităDupă ce se termină, veți vedea rezultatele consolidate.

Când executați codul de mai sus, veți obține următoarea ieșire.

ieșire:

Execuție paralelă în TestNG

1) Numele suitei definite în testng.xml.

Execuție paralelă în TestNG

2) Numele testului definit în testng.xml.

Execuție paralelă în TestNG

3) Numele clasei declarate în testng.xml.

Execuție paralelă în TestNG

4) Numele metodelor sunt adnotate cu @Test în fișierul .java.

Execuție paralelă în TestNG

Același flux se execută și pentru testul SnapDeal, deci ambele clase se execută una lângă alta.

Pasul 3) Rularea mai multor suite dintr-un fișier testng.xml părinte

O cerință comună în proiectele mai mari este înlănțuirea mai multor fișiere testng.xml într-un singur declanșator. TestNG 7.x acceptă o suită părinte care face referire la fiu fișier-suite intrări, astfel încât fiecare copil să își poată păstra propriul număr de fire de execuție, listener-e și parametri. Salvați fiecare suită de copii separat, apoi indicați părintele către calea sa. Rulați doar fișierul părinte din Eclipse, Maven sau linia de comandă.

<!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>

Acest model menține suitele de regresie, fum și sanitate separate, dar reutilizabile. De asemenea, puteți declanșa fișierul părinte din Maven Surefire setând <suiteXmlFile>parent-suite.xml</suiteXmlFile> în configurația pluginului, ceea ce face ca același layout paralel să funcționeze în conductele de integrare continuă.

Pasul 4) Cele mai bune practici pentru paralelism TestNG ruleaza

  • Pin TestNG 7.x: Utilizare TestNG 7.10 sau o versiune ulterioară cu Selenium 4, astfel încât driverele compatibile cu W3C să se comporte uniform în toate firele de execuție.
  • Evitați starea partajată: Mutaţi webdriver într-un ThreadLocal, astfel încât fiecare fir de execuție să își păstreze propria sesiune.
  • Număr de fire pentru melodii: Începeți cu numărul de nuclee CPU, apoi urmăriți raportul HTML care poate fi trimis prin e-mail și încărcarea Grid înainte de a-l crește.
  • Izolați datele de testare: Folosește utilizatori unici, coșuri de cumpărături și coduri PIN per fir de execuție, astfel încât datele de conectare să nu se mai colizeze.
  • Faceți capturi de ecran în caz de eșec: Atașați-le printr-un ITestListener pentru a depana mai rapid rulările paralele instabile.
  • Folosește asistența AI: Instrumente de genul Testim, mabl și CodiumAI pot semnala testele instabile și pot sugera selectori stabili înainte de următoarea rulare.

Concluzie

Exemplul de mai sus arată cum se utilizează TestNG pentru a executa teste paralele. TestNG 7.x vă oferă un singur fișier XML pentru a lansa mai multe clase de testare, a lega mai multe suite de copii și a regla fire de execuție paralele, astfel încât spațiile mari Selenium proiectele se termină mult mai repede.

Întrebări frecvente

Plasați fiecare clasă în locul ei eticheta din testng.xml, apoi setați parallel="tests" și un număr de fire de execuție de cel puțin 2. TestNG pornește ambele teste pe fire de execuție separate, astfel încât clasele se execută concurent, nu secvențial.

Da. Construiți o suită părinte care listează fișierele copil din interior Fiecare cale de fișier suite copil își rulează propria configurație. Modelul funcționează în Eclipse, Maven Surefire și Gradleși este susținut de TestNG 6 și următoarele, inclusiv versiunea actuală 7.x.

Atributul paralel acceptă teste, clase, metode, instanțe sau niciuna. Alegeți testele atunci când fiecare eticheta este autonomă, clasele pentru izolarea întregii clase și metodele atunci când metodele individuale @Test sunt thread-safe. Valoarea implicită este none, ceea ce execută totul secvențial.

Folosește un ThreadLocal sau inițializați driverul în interiorul unui bloc @BeforeMethod în loc să fie un câmp static. Fiecare fir de execuție deține apoi propria sesiune de browser, ceea ce elimină condițiile de concurență care provoacă blocări paralele. TestNG rulează pe Selenium Grilă.

Orchestratorii de inteligență artificială studiază datele rulate anterior pentru a prezice eșecurile, a pune în carantină testele instabile și a le reordona pe cele lente. Platforme precum Launchable, Testimși conectați mabl la TestNG Deci, suitele cu cea mai mare probabilitate de eșec rulează primele, ceea ce scurtează buclele de feedback pe serverele de integrare continuă.

Da. Planificatoarele bazate pe inteligență artificială din Launchable și BuildPulse măsoară durata istorică și rata de fulgi de zăpadă per test, apoi împart fișierul testng.xml în fragmente echilibrate. Fiecare fragment rulează pe un agent separat, astfel încât timpul total de funcționare scade, în timp ce utilizarea paralelă rămâne ridicată.

Rezumați această postare cu: