Comment exécuter plusieurs cas de test dans TestNG Suite
⚡ Résumé intelligent
Exécutez plusieurs cas de test avec TestNG Suite à Selenium permet de déclencher plusieurs classes, packages ou suites enfants à partir d'un seul fichier testng.xml. Ce guide aborde les threads parallèles, la hiérarchie des suites, les rapports et l'assistance IA pour les tests modernes. TestNG Projets 7.x.

TestNG permet d'exécuter des méthodes de test, des classes et des suites de tests complètes en parallèle au sein d'un même projet. L'exécution parallèle réduit le temps d'exécution total car les threads lancent les tests simultanément au lieu de les exécuter l'un après l'autre. Ce guide explique comment exécuter plusieurs classes (différentes suites) à l'aide de cet outil. TestNG 7.x avec Selenium Pilote Web.
Étape 1) Création d'un TestNGFichier .xml pour l'exécution des tests
Pour créer la configuration, suivez les étapes ci-dessous.
- Créer un nouveau projet dans Eclipse.
- Créez deux packages dans le projet (nommez-les) com.suite1 et com.suite2).
- Créez une classe dans chaque package (nommez-les). Flipkart.java et Snapdeal.java) et copiez le code ci-dessous dans les classes respectives.
- Créez un nouveau fichier dans votre projet et nommez-le testng.xml. Assurez-vous que le TestNG Le plugin est installé (instructions disponibles) iciLe fichier testng.xml contient toute la configuration, notamment les noms des classes, les noms des tests et les noms des suites de tests.
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 structure finale du projet ressemble à l'exemple ci-dessous.
Étape 2) Exécution parallèle dans TestNG
Après avoir enregistré le fichier XML ci-dessus, l'étape suivante consiste à exécuter les tests parallèles. Le code est présenté ci-dessous.
1) nombre de fils: Définit le nombre de threads TestNG Peut être exécuté en parallèle. Une valeur plus élevée permet d'exécuter davantage de tests simultanément, dans la limite des capacités du processeur.
2) verbeuxAffiche les détails d'exécution dans la console. Les valeurs autorisées vont de 1 à 10. Plus la valeur est élevée, plus les journaux sont détaillés et précis.
3) nom: Nom de la suite. La voici : «Gmail Suite".
4) parallèle: dit TestNG Éléments à exécuter simultanément. Les valeurs valides sont : tests, classes, méthodes ou instances. La valeur par défaut est aucun.
Cliquez avec le bouton droit sur le fichier testng.xml et sélectionnez Exécuter en tant que > TestNG SuiteUne fois l'opération terminée, vous verrez les résultats consolidés.
Lorsque vous exécutez le code ci-dessus, vous obtiendrez le résultat suivant.
Sortie :
1) Nom de la suite définie dans testng.xml.
2) Nom du test défini dans testng.xml.
3) Nom de la classe déclarée dans testng.xml.
4) Noms de méthodes annotés avec @Test dans le fichier .java.
Le même flux est utilisé pour le test SnapDeal, les deux classes s'exécutent donc côte à côte.
Étape 3) Exécution de plusieurs suites à partir d'un fichier testng.xml parent
Sur les projets de grande envergure, il est fréquent d'enchaîner plusieurs fichiers testng.xml en un seul déclencheur. TestNG La version 7.x prend en charge une suite parente qui référence une suite enfant. fichier de suite Chaque entrée permet à son enfant de conserver son propre nombre de threads, ses écouteurs et ses paramètres. Enregistrez chaque suite enfant séparément, puis indiquez au parent son chemin d'accès. Exécutez uniquement le fichier parent depuis Eclipse, Maven ou la ligne de commande.
<!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>
Ce modèle permet de séparer les suites de tests de régression, de fumée et de validation tout en les réutilisant. Vous pouvez également déclencher le fichier parent depuis Maven Surefire en configurant <suiteXmlFile>parent-suite.xml</suiteXmlFile> dans la configuration du plugin, ce qui permet à la même disposition parallèle de fonctionner dans les pipelines d'intégration continue.
Étape 4) Meilleures pratiques pour le parallèle TestNG fonctionne
- Pin TestNG 7.x : Utilisez le TestNG 7.10 ou version ultérieure avec Selenium 4. Ainsi, les pilotes conformes aux normes W3C se comportent de manière cohérente entre les différents threads.
- Évitez les états partagés : Déplacez le pilote web Ce champ est stocké dans un ThreadLocal afin que chaque thread conserve sa propre session.
- Réglage du nombre de fils : Commencez par le nombre de cœurs du processeur, puis surveillez le rapport HTML envoyable par e-mail et la charge de la grille avant de l'augmenter.
- Isoler les données de test : Utilisez des utilisateurs, des paniers et des codes PIN uniques pour chaque conversation afin d'éviter les conflits de connexion.
- Capture d'écran en cas d'échec : Attachez-les à l'aide d'un ITestListener pour déboguer plus rapidement les exécutions parallèles instables.
- Utiliser l'assistance de l'IA : Des outils comme Testim, mabl et CodiumAI peuvent signaler les tests instables et suggérer des sélecteurs stables avant la prochaine exécution.
Conclusion
L'exemple ci-dessus montre comment utiliser TestNG pour exécuter des tests en parallèle. TestNG La version 7.x vous fournit un seul fichier XML pour lancer plusieurs classes de tests, lier plusieurs suites de tests enfants et optimiser les threads parallèles, ce qui permet de traiter un grand nombre de cas. Selenium Les projets se terminent beaucoup plus rapidement.




