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.

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.
- Hozz létre egy új projektet a Eclipse.
- Hozz létre két csomagot a projektben (nevezd el őket com.suite1 és a com.suite2).
- 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.
- 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.
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ó.
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:
1) A testng.xml fájlban definiált csomag neve.
2) A testng.xml fájlban definiált teszt neve.
3) A testng.xml fájlban deklarált osztály neve.
4) A .java fájlban @Test taggel jelölt metódusnevek.
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.




