Több teszteset futtatása TestNG Suite

⚡ Okos összefoglaló

Több teszteset futtatása TestNG Lakosztály be Selenium lehetővé teszi több osztály, csomag vagy gyermekcsomag elindítását egyetlen testng.xml fájlból. Ez az útmutató a párhuzamos szálakat, a csomaghierarchiát, a jelentéskészítést és a modern mesterséges intelligencia segítségét tárgyalja. TestNG 7.x projektek.

  • 🧵 Párhuzamos szálak: Állítsd be a thread-count és a parallel=”tests” paramétereket a böngészők és csomagok közötti futási idő csökkentésére.
  • 🗂️ Csomaghierarchia: Egy testng.xml szülőfájl listázhatja a gyermekcsomag-fájlbejegyzéseket, hogy egyetlen triggerben több csomagot láncoljon össze.
  • 🇧🇷 TestNG 7.x-es verzióra kész: A példák összhangban vannak a TestNG 7.10 és Selenium 4 W3C illesztőprogram, amelyek felváltják a régieket FirefoxVezetőkábelezés.
  • 📊 Intelligens jelentéskészítés: Az 1–10. szintű részletes jelentések és az e-mailben küldhető HTML-jelentések segítenek a párhuzamos szálak hibás kezelésében.
  • 🤖 AI vezénylés: A mesterséges intelligencia által vezérelt ütemezők a korábbi, átmeneti és időtartamadatok alapján újrarendezik, újrapróbálkoznak és szegmenscsomagokat hoznak létre.

Több teszteset futtatása TestNG Lakosztály be Selenium

TestNG lehetővé teszi tesztmetódusok, osztályok és teljes csomagok párhuzamos futtatását egy projekten belül. A párhuzamos végrehajtás csökkenti a teljes futási időt, mivel a szálak egyszerre indítják a teszteket, ahelyett, hogy egymás után. Ez az útmutató elmagyarázza, hogyan futtathat több osztályt (különböző csomagokat) a következő használatával: TestNG 7.x verzióval Selenium WebDriver.

1. lépés) Létrehozása a TestNG.xml fájl tesztek végrehajtásához

A konfiguráció létrehozásához kövesse az alábbi lépéseket.

  1. Hozz létre egy új projektet a Eclipse.
  2. Hozz létre két csomagot a projektben (nevezd el őket com.suite1 és a com.suite2).
  3. Hozz létre egy osztályt minden csomagban (nevezd el őket) Flipkart.java és a Snapdeal.java) és másold be az alábbi kódot a megfelelő osztályokba.
  4. Hozz létre egy új fájlt a projektedben, és nevezd el testng.xml. Győződjön meg arról, hogy a TestNG bővítmény telepítve van (útmutató elérhető itt ). A testng.xml fájl tartalmazza az összes konfigurációt, például az osztályneveket, tesztneveket és csomagneveket.

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>

A végső projektstruktúra az alábbi példához hasonlóan néz ki.

Sikeres  TestNG.xml fájl a teszt végrehajtásához

2. lépés) Párhuzamos végrehajtás TestNG

A fenti XML fájl mentése után a következő lépés a párhuzamos tesztek futtatása. A kód az alábbiakban látható.

Párhuzamos végrehajtás be TestNG

1) szálszám: Meghatározza, hogy hány szálon TestNG párhuzamos végrehajtáshoz felpöröghet. Magasabb érték esetén több teszt fut egyszerre, a CPU-korlát erejéig.

2) bőbeszédű: Naplózza a végrehajtás részleteit a konzolon. Az engedélyezett értékek 1-től 10-ig terjedhetnek. A magasabb értékek részletesebb és részletesebb naplókat eredményeznek.

3) névA lakosztály neve. Íme: „Gmail Kíséret".

4) párhuzamos: Elmondja TestNG mit kell párhuzamosan futtatni. Az érvényes értékek tesztek, osztályok, metódusok vagy példányok. Az alapértelmezett érték: egyik sem.

Kattintson jobb gombbal a testng.xml fájlra, és válassza a lehetőséget Futtatás másként > TestNG SuiteMiután befejeződött, látni fogja az összesített eredményeket.

Amikor végrehajtja a fenti kódot, a következő kimenetet kapja.

output:

Párhuzamos végrehajtás be TestNG

1) A testng.xml fájlban definiált csomag neve.

Párhuzamos végrehajtás be TestNG

2) A testng.xml fájlban definiált teszt neve.

Párhuzamos végrehajtás be TestNG

3) A testng.xml fájlban deklarált osztály neve.

Párhuzamos végrehajtás be TestNG

4) A .java fájlban @Test taggel jelölt metódusnevek.

Párhuzamos végrehajtás be TestNG

Ugyanez a folyamat fut a SnapDeal tesztnél, így mindkét osztály egymás mellett fut.

3. lépés) Több csomag futtatása egy szülő testng.xml fájlból

A nagyobb projekteknél gyakori követelmény több testng.xml fájl egyetlen triggerbe láncolása. TestNG A 7.x támogatja a szülőcsomagot, amely gyermekre hivatkozik csomagfájl bejegyzéseket, így minden gyermek megtarthatja a saját szálszámát, figyelőit és paramétereit. Mentse el az egyes gyermekcsomagokat külön, majd irányítsa a szülőt a saját elérési útjára. Csak a szülőfájlt futtassa a következőből: Eclipse, Maven vagy a parancssor segítségével.

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

Ez a minta elkülöníti a regressziós, füst- és józansági csomagokat, mégis újrafelhasználhatóvá teszi azokat. A szülőfájlt a Maven Surefire-ből is elindíthatja a következő beállítással: <suiteXmlFile>parent-suite.xml</suiteXmlFile> a bővítmény konfigurációján belül, ami ugyanazt a párhuzamos elrendezést teszi lehetővé a folyamatos integrációs folyamatokban.

4. lépés) A párhuzamos feldolgozás bevált gyakorlatai TestNG fut

  • tű TestNG 7.x: Felhasználás TestNG 7.10 vagy újabb verzióval Selenium 4, így a W3C-kompatibilis illesztőprogramok konzisztensen viselkednek a szálak között.
  • Kerülje a megosztott állapotot: Mozgassa a webdriver mezőt egy ThreadLocal-ba, így minden szál saját munkamenetet tart fenn.
  • Hangolási szálak száma: Kezdd a CPU magok számával, majd figyeld az e-mailben küldhető HTML jelentést és a Grid betöltődését, mielőtt megnövelnéd.
  • Izolált tesztadatok: Használj egyedi felhasználókat, kosarakat és PIN-kódokat szálanként, hogy a bejelentkezések soha ne ütközzenek.
  • Képernyőképek készítése hiba esetén: Rögzítse őket egy ITestListener a hibás párhuzamos futtatások gyorsabb hibakereséséhez.
  • Használj mesterséges intelligencia segítséget: Szerszámok, mint TestimA , a mabl és a CodiumAI képes megjelölni a pontatlan teszteket, és stabil szelektorokat javasolni a következő futtatás előtt.

Összegzés

A fenti példa bemutatja, hogyan kell használni TestNG párhuzamos tesztek végrehajtásához. TestNG A 7.x egyetlen XML fájlt biztosít több tesztosztály elindításához, több gyermekcsomag összekapcsolásához és a párhuzamos szálak hangolásához, így a nagyméretű feladatokhoz is. Selenium a projektek sokkal gyorsabban befejeződnek.

GYIK

Helyezze el az egyes osztályokat a saját kategóriájában tag-et a testng.xml fájlon belül, majd állítsd be a parallel=”tests” értéket és a szálak számát legalább 2-re. TestNG mindkét tesztet külön szálon indítja, így az osztályok egyidejűleg, nem pedig egymás után futnak.

Igen. Hozz létre egy szülőcsomagot, amely felsorolja a benne lévő gyermekfájlokat. Minden gyermekcsomag-fájl elérési útja saját konfigurációt futtat. A minta a következőképpen működik: Eclipse, Maven Surefire, és Gradle, és innen támogatja TestNG 6-os verziótól kezdve, beleértve a jelenlegi 7.x kiadást is.

A parallel attribútum teszteket, osztályokat, metódusokat, példányokat vagy egyet sem fogad el. Válasszon teszteket, ha mindegyik A tag önálló, az osztályok az egész osztály elkülönítésére szolgálnak, és a metódusok, amikor az egyes @Test metódusok szálbiztosak. Az alapértelmezett érték a none, amely mindent szekvenciálisan futtat.

Használjon ThreadLocal-t vagy inicializálja a meghajtót egy @BeforeMethod blokkon belül statikus mező helyett. Minden szál ezután saját böngésző munkamenettel rendelkezik, ami kiküszöböli a párhuzamos összeomlást okozó versenyfeltételeket TestNG fut Selenium Rács.

Az AI-vezéreltek a korábbi futtatási adatokat tanulmányozva előrejelzik a hibákat, karanténba helyezik a bizonytalan teszteket, és átrendezik a lassúakat. Olyan platformok, mint a Launchable, Testim, és a mabl csatlakozik TestNG így a legvalószínűbb hibát okozó csomagok futnak először, ami lerövidíti a visszacsatolási hurkokat a folyamatos integrációs szervereken.

Igen. A Launchable és a BuildPulse mesterséges intelligenciával vezérelt ütemezői mérik a korábbi időtartamot és a tesztenkénti hibaarányt, majd a testng.xml fájlt kiegyensúlyozott szegmensekre osztják. Minden szegmens külön ügynökön fut, így a teljes falióra-idő csökken, miközben a párhuzamos kihasználtság magas marad.

Foglald össze ezt a bejegyzést a következőképpen: