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.
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.
- Maak een nieuw project aan in Eclipse.
- Maak twee pakketten aan in het project (geef ze een naam). com.suite1 en com.suite2).
- 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.
- 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.
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.
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:
1) Naam van de suite gedefinieerd in testng.xml.
2) Naam van de test gedefinieerd in testng.xml.
3) Naam van de klasse die is gedeclareerd in testng.xml.
4) Methodenamen die in het .java-bestand zijn geannoteerd met @Test.
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.





