Come eseguire più casi di test in TestNG Suite
⚡ Riepilogo intelligente
Esegui più casi di test con TestNG Suite in Selenium consente di attivare diverse classi, pacchetti o suite figlie da un singolo testng.xml. Questa guida illustra i thread paralleli, la gerarchia delle suite, la creazione di report e l'assistenza AI per i test moderni. TestNG Progetti 7.x.
TestNG consente di eseguire metodi di test, classi e suite complete in parallelo all'interno di un progetto. L'esecuzione parallela riduce il tempo di esecuzione totale perché i thread avviano i test contemporaneamente invece che uno dopo l'altro. Questa guida spiega come eseguire più classi (suite diverse) utilizzando TestNG 7.x con Selenium WebDriver.
Passaggio 1) Creazione di un file TestNGFile .xml per l'esecuzione dei test
Per creare la configurazione, segui i passaggi seguenti.
- Crea un nuovo progetto in Eclipse.
- Crea due pacchetti nel progetto (dai loro un nome com.suite1 and com.suite2).
- Crea una classe in ogni pacchetto (dai loro un nome Flipkart.java and Snapdeal.java) e copiare il codice seguente nelle rispettive classi.
- Crea un nuovo file nel tuo progetto e chiamalo testng.xml. Assicurati che il file TestNG il plugin è installato (istruzioni disponibili) Qui.Il file testng.xml contiene tutta la configurazione, come i nomi delle classi, i nomi dei test e i nomi delle suite.
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>
La struttura finale del progetto è simile all'esempio riportato di seguito.
Passaggio 2) Esecuzione parallela in TestNG
Dopo aver salvato il file XML di cui sopra, il passaggio successivo consiste nell'eseguire i test in parallelo. Il codice è mostrato di seguito.
1) numero di thread: Definisce quanti thread TestNG È possibile avviare l'esecuzione parallela. Un valore più alto consente di eseguire più test contemporaneamente, fino al limite della CPU.
2) prolisso: Registra i dettagli dell'esecuzione nella console. I valori consentiti vanno da 1 a 10. Valori più alti producono log più dettagliati e granulari.
3) nome: Nome della suite. Ecco qui “Gmail Suite".
4) parallelo: Racconta TestNG cosa eseguire contemporaneamente. I valori validi sono test, classi, metodi o istanze. Il valore predefinito è nessuna.
Fai clic con il pulsante destro del mouse sul file testng.xml e seleziona Esegui come > TestNG SuiteAl termine dell'operazione, visualizzerai i risultati consolidati.
Quando esegui il codice sopra, otterrai il seguente output.
Produzione:
1) Nome della suite definita in testng.xml.
2) Nome del test definito in testng.xml.
3) Nome della classe dichiarata in testng.xml.
4) Nomi dei metodi annotati con @Test nel file .java.
Lo stesso flusso viene eseguito anche per il test SnapDeal, quindi entrambe le classi vengono eseguite in parallelo.
Passaggio 3) Esecuzione di più suite da un singolo file testng.xml principale
Nei progetti di grandi dimensioni, un requisito comune è quello di concatenare diversi file testng.xml in un singolo trigger. TestNG 7.x supporta una suite padre che fa riferimento a una suite figlia file della suite voci, in modo che ogni figlio possa mantenere il proprio conteggio dei thread, i listener e i parametri. Salva ogni suite figlio separatamente, quindi indica al padre il suo percorso. Esegui solo il file padre da Eclipse, Maven o la riga di comando.
<!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>
Questo modello mantiene separate ma riutilizzabili le suite di regressione, smoke e sanity. È anche possibile attivare il file padre da Maven Surefire impostando <suiteXmlFile>parent-suite.xml</suiteXmlFile> all'interno della configurazione del plugin, che consente di utilizzare lo stesso layout parallelo nelle pipeline di integrazione continua.
Passo 4) migliori pratiche per il parallelo TestNG corre
- Pin TestNG 7.x: Usa il TestNG 7.10 o versioni successive con Selenium 4 in modo che i driver conformi al W3C si comportino in modo coerente tra i thread.
- Evitare lo stato condiviso: Sposta il file webdriver campo in un ThreadLocal in modo che ogni thread abbia la propria sessione.
- Regola il numero di fili: Iniziate controllando il numero di core della CPU, poi monitorate il report HTML inviabile via email e il caricamento della griglia prima di segnalare il problema.
- Isolare i dati di test: Utilizza utenti, carrelli e codici PIN univoci per ogni discussione, in modo che gli accessi non si sovrappongano mai.
- Acquisisci schermate in caso di errore: Collegali tramite un ITest Listener per eseguire il debug di esecuzioni parallele instabili più rapidamente.
- Utilizzare l'assistenza dell'intelligenza artificiale: Strumenti come Testimmabl e CodiumAI possono segnalare test instabili e suggerire selettori stabili prima dell'esecuzione successiva.
Conclusione
L'esempio sopra mostra come utilizzare TestNG per eseguire test in parallelo. TestNG La versione 7.x ti offre un singolo file XML per avviare più classi di test, collegare diverse suite secondarie e ottimizzare i thread paralleli, quindi di grandi dimensioni Selenium I progetti si concludono molto più velocemente.





