Wie man mehrere Testfälle ausführt in TestNG Suiten

⚡ Intelligente Zusammenfassung

Führen Sie mehrere Testfälle aus mit TestNG Suite in Selenium Mit dieser Methode können Sie mehrere Klassen, Pakete oder untergeordnete Test-Suites über eine einzige testng.xml-Datei auslösen. Diese Anleitung behandelt parallele Threads, die Suite-Hierarchie, Berichterstellung und KI-Unterstützung für moderne Tests. TestNG 7.x-Projekte.

  • 🧵 Parallele Threads: Setzen Sie thread-count und parallel="tests", um die Gesamtlaufzeit browser- und paketübergreifend deutlich zu verkürzen.
  • 🗂️ Suite-Hierarchie: Eine übergeordnete testng.xml-Datei kann untergeordnete Suite-Datei-Einträge auflisten, um mehrere Test-Suites in einem Trigger zu verketten.
  • ⚙️ TestNG 7.x-fähig: Beispiele stimmen überein mit TestNG 7.10 und Selenium 4 W3C-Treiber, die ältere Treiber ersetzen FirefoxTreiberverkabelung.
  • 📊 Intelligente Berichterstattung: Ausführliche Protokolle der Stufen 1 bis 10 und per E-Mail versendbare HTML-Berichte helfen bei der schnellen Diagnose fehlgeschlagener paralleler Threads.
  • 🤖 KI-Orchestrierung: KI-gesteuerte Scheduler ordnen, wiederholen und teilen Suites basierend auf historischen Flake- und Dauerdaten auf.

Führen Sie mehrere Testfälle aus mit TestNG Suite in Selenium

TestNG Mit dieser Funktion können Sie Testmethoden, Klassen und komplette Testsuiten parallel innerhalb eines Projekts ausführen. Die parallele Ausführung verkürzt die Gesamtlaufzeit, da die Threads die Tests gleichzeitig und nicht nacheinander starten. Diese Anleitung erklärt, wie Sie mehrere Klassen (verschiedene Testsuiten) mit dieser Funktion ausführen. TestNG 7.x mit Selenium WebDriver.

Schritt 1) ​​Erstellen eines TestNG.xml-Datei zur Ausführung von Tests

Um die Konfiguration zu erstellen, befolgen Sie die folgenden Schritte.

  1. Erstellen Sie ein neues Projekt in Eclipse.
  2. Erstellen Sie zwei Pakete im Projekt (benennen Sie sie). com.suite1 und com.suite2).
  3. Erstelle in jedem Paket eine Klasse (benenne sie Flipkart.java und Snapdeal.java) und kopieren Sie den unten stehenden Code in die jeweiligen Klassen.
  4. Erstellen Sie eine neue Datei in Ihrem Projekt und benennen Sie sie. testng.xml. Stellen Sie sicher, dass TestNG Das Plugin ist installiert (Anleitung verfügbar). werden auf dieser Seite erläutertDie Datei testng.xml enthält alle Konfigurationen wie Klassennamen, Testnamen und 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>

Die endgültige Projektstruktur sieht wie im folgenden Beispiel aus.

Erstellen einer TestNG.xml-Datei zum Ausführen des Tests

Schritt 2) Parallele Ausführung in TestNG

Nachdem die oben genannte XML-Datei gespeichert wurde, besteht der nächste Schritt darin, die parallelen Tests auszuführen. Der Code ist unten aufgeführt.

Parallele Ausführung in TestNG

1) Threadanzahl: Definiert die Anzahl der Threads TestNG Die parallele Ausführung kann aktiviert werden. Ein höherer Wert ermöglicht die gleichzeitige Ausführung von mehr Tests, bis zur CPU-Grenze.

2) ausführlichProtokolliert Ausführungsdetails in der Konsole. Zulässige Werte reichen von 1 bis 10. Höhere Werte erzeugen detailliertere und gröbere Protokolle.

3) NameName der Suite. Hier ist er:Gmail Suite".

4) parallel: Erzählt TestNG Was gleichzeitig ausgeführt werden soll. Gültige Werte sind Tests, Klassen, Methoden oder Instanzen. Der Standardwert ist keine.

Klicken Sie mit der rechten Maustaste auf die Datei testng.xml und wählen Sie aus Ausführen als > TestNG SuitenSobald der Vorgang abgeschlossen ist, werden Ihnen die zusammengefassten Ergebnisse angezeigt.

Wenn Sie den obigen Code ausführen, erhalten Sie die folgende Ausgabe.

Ausgang:

Parallele Ausführung in TestNG

1) Name der in testng.xml definierten Testsuite.

Parallele Ausführung in TestNG

2) Name des in testng.xml definierten Tests.

Parallele Ausführung in TestNG

3) Name der in testng.xml deklarierten Klasse.

Parallele Ausführung in TestNG

4) Methodennamen, die in der .java-Datei mit @Test annotiert sind.

Parallele Ausführung in TestNG

Der gleiche Ablauf wird auch für den SnapDeal-Test verwendet, sodass beide Klassen parallel ausgeführt werden.

Schritt 3) Ausführen mehrerer Testreihen aus einer übergeordneten testng.xml-Datei

Eine häufige Anforderung bei größeren Projekten ist die Verkettung mehrerer testng.xml-Dateien zu einem einzigen Trigger. TestNG Version 7.x unterstützt eine übergeordnete Suite, die auf untergeordnete Suiten verweist. Suite-Datei Einträge, damit jedes Kind seine eigene Threadanzahl, Listener und Parameter verwalten kann. Speichern Sie jede Kind-Suite separat und verweisen Sie dann die übergeordnete Datei auf ihren Pfad. Führen Sie nur die übergeordnete Datei aus. Eclipse, Maven oder die Kommandozeile.

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

Dieses Muster hält Regressions-, Smoke- und Sanity-Tests getrennt, aber dennoch wiederverwendbar. Sie können die übergeordnete Datei auch über Maven Surefire auslösen, indem Sie die entsprechende Einstellung vornehmen. <suiteXmlFile>parent-suite.xml</suiteXmlFile> innerhalb der Plugin-Konfiguration, wodurch das gleiche parallele Layout auch in Continuous-Integration-Pipelines funktioniert.

Schritt 4) Best Practices für parallele TestNG läuft

  • Pin TestNG 7.x: Arbeiten jederzeit weiterbearbeiten können. Jede Präsentation und jeder KI-Avatar, den Sie von Grund auf neu erstellen oder hochladen, TestNG 7.10 oder später mit Selenium 4. W3C-konforme Treiber verhalten sich daher threadübergreifend konsistent.
  • Vermeiden Sie gemeinsam genutzte Zustände: Bewegen Sie den WebTreiber Das Feld wird in ein ThreadLocal-Objekt umgewandelt, sodass jeder Thread seine eigene Sitzung verwaltet.
  • Gewindeanzahl anpassen: Beginnen Sie mit der Anzahl der CPU-Kerne, beobachten Sie dann den per E-Mail versendbaren HTML-Bericht und die Grid-Auslastung, bevor Sie diese erhöhen.
  • Isolierte Testdaten: Verwenden Sie für jeden Thread einen eigenen Benutzer, Warenkorb und PIN-Code, damit es nie zu Login-Kollisionen kommt.
  • Bei Fehlern Screenshots erstellen: Befestigen Sie sie durch ein ITestListener um fehlerhafte parallele Ausführungen schneller zu debuggen.
  • Nutzen Sie KI-Unterstützung: Tools wie Testimmabl und CodiumAI können fehlerhafte Tests kennzeichnen und vor dem nächsten Durchlauf stabile Selektoren vorschlagen.

Fazit

Das obige Beispiel zeigt, wie man es verwendet. TestNG um parallele Tests auszuführen. TestNG Version 7.x ermöglicht es Ihnen, mit einer einzigen XML-Datei mehrere Testklassen zu starten, mehrere untergeordnete Test-Suites zu verknüpfen und parallele Threads zu optimieren, sodass große Selenium Projekte werden viel schneller abgeschlossen.

Häufig gestellte Fragen

Platzieren Sie jede Klasse in ihrem eigenen Fügen Sie im testng.xml-Tag das Attribut parallel="tests" und eine Thread-Anzahl von mindestens 2 ein. TestNG Die Tests werden in separaten Threads gestartet, sodass die Klassen parallel und nicht nacheinander ausgeführt werden.

Ja. Erstellen Sie eine übergeordnete Suite, die die untergeordneten Dateien auflistet. Jeder Pfad einer untergeordneten Suite-Datei führt seine eigene Konfiguration aus. Das Muster funktioniert in Eclipse, Maven Surefire und Gradleund wird unterstützt von TestNG 6 und höher, einschließlich der aktuellen Version 7.x.

Das Attribut „parallel“ akzeptiert Tests, Klassen, Methoden, Instanzen oder keines. Wählen Sie Tests, wenn jeder Das Tag ist in sich abgeschlossen, Klassen dienen der Isolation ganzer Klassen, und Methoden sind threadsicher, wenn einzelne @Test-Methoden threadsicher sind. Der Standardwert ist „none“, was bedeutet, dass alles sequenziell ausgeführt wird.

Verwenden Sie eine ThreadLocal-Variable. Alternativ kann der Treiber innerhalb eines @BeforeMethod-Blocks anstatt als statisches Feld initialisiert werden. Jeder Thread besitzt dann seine eigene Browsersitzung, wodurch die Race Conditions, die zu Abstürzen bei paralleler Ausführung führen, beseitigt werden. TestNG läuft auf Selenium Gitter

KI-Orchestrierungssysteme analysieren vorherige Testläufe, um Fehler vorherzusagen, instabile Tests zu isolieren und langsame Tests neu anzuordnen. Plattformen wie Launchable, Testimund mabl-Stecker in TestNG Daher werden zuerst die Testreihen ausgeführt, die am ehesten fehlschlagen, was die Feedbackschleifen auf den Continuous-Integration-Servern verkürzt.

Ja. Die KI-gesteuerten Scheduler in Launchable und BuildPulse messen die bisherige Dauer und die Ausfallrate pro Test und teilen die testng.xml-Datei anschließend in gleichmäßig verteilte Shards auf. Jeder Shard läuft auf einem separaten Agenten, wodurch die Gesamtlaufzeit sinkt, während die parallele Auslastung hoch bleibt.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: