Cum se execută mai multe cazuri de testare în TestNG Suită
⚡ Rezumat inteligent
Executați mai multe cazuri de testare cu TestNG Suită în Selenium vă permite să declanșați mai multe clase, pachete sau suite copii dintr-un singur fișier testng.xml. Această prezentare prezintă fire de execuție paralele, ierarhia suitelor, raportarea și asistența AI pentru tehnologiile moderne. TestNG Proiecte 7.x.

TestNG vă permite să rulați metode de testare, clase și suite complete în paralel în cadrul unui singur proiect. Execuția paralelă reduce timpul total de execuție deoarece thread-urile pornesc testele simultan, în loc de unul după altul. Acest ghid explică cum să rulați mai multe clase (suite diferite) folosind TestNG 7.x cu Selenium WebDriver.
Pasul 1) Crearea unui TestNGFișier .xml pentru executarea testelor
Pentru a crea configurația, urmați pașii de mai jos.
- Creați un nou proiect în Eclipse.
- Creați două pachete în proiect (denumiți-le com.suite1 și com.suite2).
- Creați o clasă în fiecare pachet (denumiți-le Flipkart.java și Snapdeal.java) și copiați codul de mai jos în clasele respective.
- Creați un fișier nou în proiectul dvs. și denumiți-l testng.xml. Asigurați-vă că TestNG pluginul este instalat (instrucțiuni disponibile) aiciFișierul testng.xml conține toate configurațiile, cum ar fi numele claselor, numele testelor și numele suitelor.
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>
Structura finală a proiectului arată ca în exemplul de mai jos.
Pasul 2) Execuție paralelă în TestNG
După salvarea fișierului XML de mai sus, următorul pas este rularea testelor paralele. Codul este prezentat mai jos.
1) numărul de fire: Definește câte fire de execuție TestNG se poate roti pentru execuție paralelă. O valoare mai mare execută mai multe teste simultan, până la limita CPU.
2) verbosÎnregistrează detaliile execuției în consolă. Valorile permise sunt cuprinse între 1 și 10. Valorile mai mari produc jurnale mai detaliate și mai granulare.
3) numeNumele suitei. Iată-l „Gmail Suită".
4) paralelSpune TestNG ce să ruleze concomitent. Valorile valide sunt teste, clase, metode sau instanțe. Valoarea implicită este nici unul.
Faceți clic dreapta pe fișierul testng.xml și selectați Executare ca > TestNG SuităDupă ce se termină, veți vedea rezultatele consolidate.
Când executați codul de mai sus, veți obține următoarea ieșire.
ieșire:
1) Numele suitei definite în testng.xml.
2) Numele testului definit în testng.xml.
3) Numele clasei declarate în testng.xml.
4) Numele metodelor sunt adnotate cu @Test în fișierul .java.
Același flux se execută și pentru testul SnapDeal, deci ambele clase se execută una lângă alta.
Pasul 3) Rularea mai multor suite dintr-un fișier testng.xml părinte
O cerință comună în proiectele mai mari este înlănțuirea mai multor fișiere testng.xml într-un singur declanșator. TestNG 7.x acceptă o suită părinte care face referire la fiu fișier-suite intrări, astfel încât fiecare copil să își poată păstra propriul număr de fire de execuție, listener-e și parametri. Salvați fiecare suită de copii separat, apoi indicați părintele către calea sa. Rulați doar fișierul părinte din Eclipse, Maven sau linia de comandă.
<!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>
Acest model menține suitele de regresie, fum și sanitate separate, dar reutilizabile. De asemenea, puteți declanșa fișierul părinte din Maven Surefire setând <suiteXmlFile>parent-suite.xml</suiteXmlFile> în configurația pluginului, ceea ce face ca același layout paralel să funcționeze în conductele de integrare continuă.
Pasul 4) Cele mai bune practici pentru paralelism TestNG ruleaza
- Pin TestNG 7.x: Utilizare TestNG 7.10 sau o versiune ulterioară cu Selenium 4, astfel încât driverele compatibile cu W3C să se comporte uniform în toate firele de execuție.
- Evitați starea partajată: Mutaţi webdriver într-un ThreadLocal, astfel încât fiecare fir de execuție să își păstreze propria sesiune.
- Număr de fire pentru melodii: Începeți cu numărul de nuclee CPU, apoi urmăriți raportul HTML care poate fi trimis prin e-mail și încărcarea Grid înainte de a-l crește.
- Izolați datele de testare: Folosește utilizatori unici, coșuri de cumpărături și coduri PIN per fir de execuție, astfel încât datele de conectare să nu se mai colizeze.
- Faceți capturi de ecran în caz de eșec: Atașați-le printr-un ITestListener pentru a depana mai rapid rulările paralele instabile.
- Folosește asistența AI: Instrumente de genul Testim, mabl și CodiumAI pot semnala testele instabile și pot sugera selectori stabili înainte de următoarea rulare.
Concluzie
Exemplul de mai sus arată cum se utilizează TestNG pentru a executa teste paralele. TestNG 7.x vă oferă un singur fișier XML pentru a lansa mai multe clase de testare, a lega mai multe suite de copii și a regla fire de execuție paralele, astfel încât spațiile mari Selenium proiectele se termină mult mai repede.




