Hoe voer je meerdere testgevallen uit in TestNG Suite

โšก Slimme samenvatting

Voer meerdere testcases uit met TestNG Suite in Selenium Hiermee kunt u meerdere klassen, pakketten of subsuites vanuit รฉรฉn testng.xml-bestand activeren. Deze handleiding behandelt parallelle threads, suitehiรซrarchie, rapportage en AI-ondersteuning voor moderne testng-tests. TestNG 7.x-projecten.

  • ๐Ÿงต Parallelle draden: Stel thread-count en parallel=โ€testsโ€ in om de totale uitvoertijd in verschillende browsers en pakketten drastisch te verkorten.
  • ๐Ÿ—‚๏ธ Suitehiรซrarchie: Een parent testng.xml kan sub suite-file-items bevatten om meerdere suites in รฉรฉn trigger aan elkaar te koppelen.
  • โš™๏ธ TestNG 7.x Klaar: Voorbeelden komen overeen met TestNG 7.10 en Selenium 4 W3C-stuurprogramma's ter vervanging van de oude stuurprogramma's. FirefoxBedrading van de driver.
  • ๐Ÿ“Š Slimme rapportage: Gedetailleerde niveaus 1 tot en met 10 en HTML-rapporten die per e-mail kunnen worden verzonden, helpen bij het snel diagnosticeren van mislukte parallelle threads.
  • ๐Ÿค– AI-orkestratie: Door AI aangestuurde schedulers worden suites opnieuw geordend, herhaald en opgesplitst op basis van historische gegevens over onbetrouwbaarheid en duur.

Voer meerdere testcases uit met TestNG Suite in Selenium

TestNG Hiermee kunt u testmethoden, klassen en complete testsuites parallel uitvoeren binnen รฉรฉn project. Parallelle uitvoering verlaagt de totale looptijd omdat threads de tests gelijktijdig starten in plaats van na elkaar. Deze handleiding legt uit hoe u meerdere klassen (verschillende testsuites) kunt uitvoeren met behulp van parallelle uitvoering. TestNG 7.x met Selenium Webstuurprogramma.

Stap 1) Een TestNG.xml-bestand voor het uitvoeren van tests

Volg de onderstaande stappen om de configuratie te maken.

  1. Maak een nieuw project aan in Eclipse.
  2. Maak twee pakketten aan in het project (geef ze een naam). com.suite1 en com.suite2).
  3. Maak een klasse aan in elk pakket (geef ze een naam). Flipkart.java en Snapdeal.java) en kopieer de onderstaande code naar de betreffende klassen.
  4. Maak een nieuw bestand aan in je project en geef het een naam. testenng.xml. Zorg ervoor dat de TestNG De plugin is geรฏnstalleerd (instructies zijn beschikbaar). hierHet testng.xml-bestand bevat alle configuratie-instellingen, zoals klassenamen, testnamen en suite-namen.

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>

De uiteindelijke projectstructuur ziet eruit zoals in het onderstaande voorbeeld.

Een maken TestNG.xml-bestand voor het uitvoeren van de test

Stap 2) Parallelle uitvoering in TestNG

Na het opslaan van het bovenstaande XML-bestand is de volgende stap het uitvoeren van de parallelle tests. De code wordt hieronder weergegeven.

Parallelle uitvoering in TestNG

1) draadaantal: Definieert het aantal threads TestNG Kan worden opgestart voor parallelle uitvoering. Een hogere waarde voert meer tests tegelijk uit, tot de limiet van de CPU.

2) uitgebreid: Logt uitvoeringsdetails in de console. Toegestane waarden lopen van 1 tot 10. Hogere waarden resulteren in meer gedetailleerde en specifieke logs.

3) naam: Naam van de suite. Hier is die:Gmail Suite".

4) parallel: Vertelt TestNG Wat gelijktijdig uitgevoerd moet worden. Geldige waarden zijn tests, klassen, methoden of instanties. De standaardwaarde is geen.

Klik met de rechtermuisknop op het bestand testng.xml en selecteer Uitvoeren als > TestNG SuiteZodra het klaar is, ziet u de samengevoegde resultaten.

Wanneer u de bovenstaande code uitvoert, krijgt u de volgende uitvoer.

Output:

Parallelle uitvoering in TestNG

1) Naam van de suite gedefinieerd in testng.xml.

Parallelle uitvoering in TestNG

2) Naam van de test gedefinieerd in testng.xml.

Parallelle uitvoering in TestNG

3) Naam van de klasse die is gedeclareerd in testng.xml.

Parallelle uitvoering in TestNG

4) Methodenamen die in het .java-bestand zijn geannoteerd met @Test.

Parallelle uitvoering in TestNG

Hetzelfde proces wordt gevolgd voor de SnapDeal-test, dus beide klassen worden naast elkaar uitgevoerd.

Stap 3) Meerdere testsuites uitvoeren vanuit รฉรฉn overkoepelend testng.xml-bestand

Een veelvoorkomende vereiste bij grotere projecten is het koppelen van meerdere testng.xml-bestanden aan รฉรฉn enkele trigger. TestNG 7.x ondersteunt een oudersuite die verwijst naar een kindsuite. suite-bestand items, zodat elk kind zijn eigen thread-aantal, listeners en parameters kan behouden. Sla elke suite voor de kinderen afzonderlijk op en verwijs vervolgens de ouder naar het pad ervan. Voer alleen het bestand van de ouder uit. Eclipse, Maven, of de commandoregel.

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

Dit patroon houdt regressie-, rook- en sanity-tests gescheiden, maar toch herbruikbaar. Je kunt het bovenliggende bestand ook vanuit Maven Surefire activeren door dit in te stellen. <suiteXmlFile>parent-suite.xml</suiteXmlFile> Binnen de pluginconfiguratie zorgt dit ervoor dat dezelfde parallelle lay-out werkt in continue integratiepipelines.

Stap 4) Beste werkwijzen voor parallelle verwerking TestNG loopt

  • pin TestNG 7.x: Gebruik TestNG 7.10 of later met Selenium 4. Zo gedragen W3C-compatibele stuurprogramma's zich consistent over verschillende threads.
  • Vermijd gedeelde status: Verplaats de webdriver veld in een ThreadLocal zodat elke thread zijn eigen sessie heeft.
  • Stem het aantal draden af: Begin met het aantal CPU-cores, bekijk vervolgens het HTML-rapport dat per e-mail verzonden kan worden en de laadtijd van het raster voordat je het aantal verhoogt.
  • Testgegevens isoleren: Gebruik unieke gebruikers, winkelwagens en pincodes per thread, zodat er nooit conflicten ontstaan โ€‹โ€‹bij het inloggen.
  • Maak schermafbeeldingen bij een storing: Bevestig ze via een ITestListener Om instabiele parallelle uitvoeringen sneller te debuggen.
  • Gebruik AI-ondersteuning: Tools zoals Testim, mabl en CodiumAI kunnen onbetrouwbare tests signaleren en stabiele selectors voorstellen vรณรณr de volgende run.

Conclusie

Het bovenstaande voorbeeld laat zien hoe je het kunt gebruiken. TestNG om parallelle tests uit te voeren. TestNG In versie 7.x kunt u met รฉรฉn enkel XML-bestand meerdere testklassen starten, verschillende subsuites koppelen en parallelle threads optimaliseren, waardoor grote testomgevingen overbodig worden. Selenium Projecten worden veel sneller afgerond.

Veelgestelde vragen

Plaats elke klasse in zijn eigen Voeg de tag in testng.xml toe en stel vervolgens parallel=โ€testsโ€ in met een thread-count van minimaal 2. TestNG De tests worden beide op aparte threads uitgevoerd, waardoor de klassen gelijktijdig in plaats van sequentieel worden uitgevoerd.

Ja. Maak een hoofdsuite die de onderliggende bestanden daarin weergeeft. Elk subpad van een suitebestand voert zijn eigen configuratie uit. Het patroon werkt in Eclipse, Maven Surefire, en Gradleen wordt ondersteund door TestNG Vanaf versie 6, inclusief de huidige 7.x-release.

Het attribuut `parallel` accepteert tests, klassen, methoden, instanties of geen van beide. Kies `tests` wanneer elk `@Test` is een op zichzelf staand element, `@classes` voor isolatie van de hele klasse, en `@methods` wanneer individuele `@Test`-methoden thread-safe zijn. De standaardwaarde is `none`, wat betekent dat alles sequentieel wordt uitgevoerd.

Gebruik een ThreadLocal Of initialiseer de driver binnen een `@BeforeMethod`-blok in plaats van als een statisch veld. Elke thread heeft dan zijn eigen browsersessie, wat de raceomstandigheden elimineert die parallelle uitvoeringen laten crashen. TestNG draait op Selenium Raster.

AI-orkestratoren analyseren eerdere uitvoeringsgegevens om fouten te voorspellen, onbetrouwbare tests te isoleren en trage tests opnieuw te rangschikken. Platforms zoals Launchable, Testimen mabl plug in TestNG De testsuites die waarschijnlijk het meest zullen falen, worden dus eerst uitgevoerd, wat de feedbackloops op de continuous integration-servers verkort.

Ja. AI-gestuurde schedulers in Launchable en BuildPulse meten de historische duur en het flake-percentage per test en splitsen vervolgens het testng.xml-bestand op in evenwichtige shards. Elke shard draait op een aparte agent, waardoor de totale rekentijd afneemt terwijl het parallelle gebruik hoog blijft.

Vat dit bericht samen met: