Slik kjører du flere testtilfeller i TestNG Suite

⚡ Smart oppsummering

Kjør flere testtilfeller med TestNG Suite i Selenium lar deg utløse flere klasser, pakker eller underordnede suiter fra én testng.xml. Denne gjennomgangen dekker parallelle tråder, suitehierarki, rapportering og AI-assistanse for moderne TestNG 7.x-prosjekter.

  • 🧵 Parallelle tråder: Sett thread-count og parallel=”tests” for å redusere den totale kjøretiden på tvers av nettlesere og pakker.
  • 🗂️ Suitehierarki: En overordnet testng.xml-fil kan liste oppføringer i underordnede suite-filer for å kjede flere suiter i én trigger.
  • ⚙️ TestNG 7.x Klar: Eksemplene stemmer overens med TestNG 7.10 og Selenium 4 W3C-drivere, som erstatter eldre drivere FirefoxKabling av driver.
  • 📊 Smart rapportering: Detaljrike nivåer 1 til 10 og HTML-rapporter som kan sendes på e-post, bidrar til å diagnostisere mislykkede parallelle tråder raskt.
  • 🤖 AI-orkestrering: AI-drevne planleggere omorganiserer, prøver på nytt og sharder suiter basert på historiske flake- og varighetsdata.

Kjør flere testtilfeller med TestNG Suite i Selenium

TestNG lar deg kjøre testmetoder, klasser og komplette pakker parallelt i ett prosjekt. Parallell utførelse reduserer total kjøretid fordi tråder starter testene samtidig i stedet for én etter hverandre. Denne veiledningen forklarer hvordan du kjører flere klasser (forskjellige pakker) ved hjelp av TestNG 7.x med Selenium WebDriver.

Trinn 1) Opprette en TestNG.xml-fil for å kjøre tester

Følg trinnene nedenfor for å opprette konfigurasjonen.

  1. Opprett et nytt prosjekt i Eclipse.
  2. Opprett to pakker i prosjektet (gi dem navn com.suite1 og com.suite2).
  3. Opprett en klasse i hver pakke (gi dem navn Flipkart.java og Snapdeal.java) og kopier koden nedenfor inn i de respektive klassene.
  4. Opprett en ny fil i prosjektet ditt og gi den et navn testng.xml. Forsikre deg om at TestNG plugin er installert (instruksjoner tilgjengelig her.). testng.xml-filen inneholder all konfigurasjon, for eksempel klassenavn, testnavn og suite-navn.

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>

Den endelige prosjektstrukturen ser ut som eksemplet nedenfor.

Opprette en TestNG.xml-fil for utføring av test

Trinn 2) Parallell utførelse i TestNG

Etter at du har lagret XML-filen ovenfor, er neste trinn å kjøre parallelle tester. Koden vises nedenfor.

Parallell utførelse i TestNG

1) trådtellingDefinerer hvor mange tråder TestNG kan spinne opp for parallell utførelse. En høyere verdi kjører flere tester samtidig, opp til CPU-grensen.

2) ordrikLogger utførelsesdetaljer i konsollen. Tillatte verdier går fra 1 til 10. Høyere verdier gir mer detaljerte og detaljerte logger.

3) navnNavnet på suiten. Her er det «Gmail Suite».

4) parallellForteller TestNG hva som skal kjøres samtidig. Gyldige verdier er tester, klasser, metoder eller instanser. Standardverdien er none.

Høyreklikk på testng.xml-filen og velg Kjør som > TestNG SuiteNår det er ferdig, vil du se de samlede resultatene.

Når du utfører koden ovenfor, vil du få følgende utgang.

Utgang:

Parallell utførelse i TestNG

1) Navnet på pakken som er definert i testng.xml.

Parallell utførelse i TestNG

2) Navnet på testen som er definert i testng.xml.

Parallell utførelse i TestNG

3) Navnet på klassen som er deklarert i testng.xml.

Parallell utførelse i TestNG

4) Metodenavn merket med @Test i .java-filen.

Parallell utførelse i TestNG

Den samme flyten kjører for SnapDeal-testen, så begge klassene kjøres side om side.

Trinn 3) Kjøre flere pakker fra én overordnet testng.xml

Et vanlig krav på større prosjekter er å kjede sammen flere testng.xml-filer til én enkelt trigger. TestNG 7.x støtter en foreldrepakke som refererer til barneprogrammer suite-fil oppføringer, slik at hvert barn kan beholde sitt eget antall tråder, lyttere og parametere. Lagre hver barnesuite separat, og pek deretter foreldrefilen til banen. Kjør bare foreldrefilen fra Eclipse, Maven eller kommandolinjen.

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

Dette mønsteret holder regresjons-, røyk- og fornuftspakkene separate, men likevel gjenbrukbare. Du kan også utløse foreldrefilen fra Maven Surefire ved å sette <suiteXmlFile>parent-suite.xml</suiteXmlFile> inne i plugin-konfigurasjonen, som gjør at det samme parallelle oppsettet fungerer i kontinuerlige integrasjonsrørledninger.

Trinn 4) Beste praksis for parallell TestNG går

  • pin TestNG 7.x: Bruk TestNG 7.10 eller nyere med Selenium 4 slik at W3C-kompatible drivere oppfører seg konsistent på tvers av tråder.
  • Unngå delt tilstand: Flytt webdriver feltet inn i en ThreadLocal slik at hver tråd har sin egen økt.
  • Juster trådantall: Start med antallet CPU-kjerner, og følg deretter med på den e-postbare HTML-rapporten og Grid-innlastingen før du laster den opp.
  • Isoler testdata: Bruk unike brukere, handlekurver og postkoder per tråd, slik at pålogginger aldri kolliderer.
  • Ta skjermbilder ved feil: Fest dem gjennom en ITestListener for å feilsøke ustabile parallelle kjøringer raskere.
  • Bruk AI-assistanse: Verktøy som Testim, mabl og CodiumAI kan flagge ustabile tester og foreslå stabile selektorer før neste kjøring.

Konklusjon

Eksemplet ovenfor viser hvordan du bruker TestNG å utføre parallelle tester. TestNG 7.x gir deg én XML-fil for å starte flere testklasser, koble sammen flere underordnede suiter og finjustere parallelle tråder, så store Selenium prosjekter blir ferdige mye raskere.

Spørsmål og svar

Plasser hver klasse i sin egen taggen i testng.xml, og angi deretter parallel=”tests” og et trådtall på minst 2. TestNG starter begge testene på separate tråder, slik at klassene kjøres samtidig i stedet for sekvensielt.

Ja. Bygg en overordnet suite som viser underfiler inni Hver filsti for barnesuiten kjører sin egen konfigurasjon. Mønsteret fungerer i Eclipse, Maven Surefire, og Gradle, og støttes fra TestNG 6 og utover, inkludert den nåværende 7.x-utgivelsen.

Parallel-attributtet aksepterer tester, klasser, metoder, instanser eller ingen. Velg tester når hver taggen er selvstendig, klasser for helklasseisolering, og metoder når individuelle @Test-metoder er trådsikre. Standardverdien er ingen, som kjører alt sekvensielt.

Bruk en ThreadLocal eller initialiser driveren inne i en @BeforeMethod-blokk i stedet for som et statisk felt. Hver tråd eier da sin egen nettleserøkt, noe som eliminerer kappløpsbetingelsene som krasjer parallelt. TestNG kjører på Selenium Nett.

AI-orkestratorer studerer data fra tidligere kjøringer for å forutsi feil, sette ustabile tester i karantene og endre rekkefølgen på trege tester. Plattformer som Launchable, Testim, og mabl-pluggen inn i TestNG slik at de mest sannsynlig feilende suitene kjører først, noe som forkorter tilbakemeldingsløkker på kontinuerlige integrasjonsservere.

Ja. AI-drevne planleggere i Launchable og BuildPulse måler historisk varighet og flakefrekvens per test, og deler deretter testng.xml-filen inn i balanserte shards. Hver shard kjører på en separat agent, slik at den totale veggklokketiden synker mens parallellutnyttelsen holder seg høy.

Oppsummer dette innlegget med: