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.

  • 🧵 Fils parallèles : Configurez thread-count et parallel="tests" pour réduire considérablement le temps d'exécution global sur tous les navigateurs et packages.
  • 🇧🇷 Hiérarchie des suites : Un fichier testng.xml parent peut lister les entrées de fichiers de suite enfants pour chaîner plusieurs suites dans un seul déclencheur.
  • ⚙️ TestNG 7.x Prêt : Les exemples correspondent à TestNG 7.10 et Selenium 4 pilotes W3C, remplaçant les anciens pilotes FirefoxCâblage du pilote.
  • (I.e. Rapports intelligents : Les niveaux de détail 1 à 10 et les rapports HTML envoyables par e-mail permettent de diagnostiquer rapidement les threads parallèles défaillants.
  • 🤖 Orchestration de l'IA : Les planificateurs pilotés par l'IA réorganisent, réessaient et partitionnent les suites en fonction des données historiques de flocons et de durée.

Exécutez plusieurs cas de test avec TestNG Suite à Selenium

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.

  1. Créer un nouveau projet dans Eclipse.
  2. Créez deux packages dans le projet (nommez-les) com.suite1 et com.suite2).
  3. Créez une classe dans chaque package (nommez-les). Flipkart.java et Snapdeal.java) et copiez le code ci-dessous dans les classes respectives.
  4. 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.

Création d'un TestNGFichier .xml pour l'exécution du test

É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.

Exécution parallèle dans TestNG

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 :

Exécution parallèle dans TestNG

1) Nom de la suite définie dans testng.xml.

Exécution parallèle dans TestNG

2) Nom du test défini dans testng.xml.

Exécution parallèle dans TestNG

3) Nom de la classe déclarée dans testng.xml.

Exécution parallèle dans TestNG

4) Noms de méthodes annotés avec @Test dans le fichier .java.

Exécution parallèle dans TestNG

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.

FAQ

Placez chaque classe dans sa propre section. Dans le fichier testng.xml, ajoutez la balise, puis définissez parallel="tests" et un nombre de threads d'au moins 2. TestNG Les deux tests sont lancés sur des threads séparés, de sorte que les classes s'exécutent simultanément plutôt que séquentiellement.

Oui. Créez une suite parente qui liste les fichiers enfants à l'intérieur. Chaque chemin de fichier de suite enfant exécute sa propre configuration. Ce modèle fonctionne dans Eclipse, Maven Surefire, et Gradleet est soutenu par TestNG À partir de la version 6, y compris la version actuelle 7.x.

L'attribut parallel accepte les tests, les classes, les méthodes, les instances ou aucun. Choisissez tests lorsque chaque L'annotation `@Test` est autonome, les classes assurent l'isolation de la classe entière, et les méthodes sont définies lorsque les méthodes `@Test` individuelles sont thread-safe. La valeur par défaut est `none`, ce qui exécute tout séquentiellement.

Utilisez un ThreadLocal Vous pouvez aussi initialiser le pilote dans un bloc `@BeforeMethod` plutôt que comme un champ statique. Chaque thread dispose alors de sa propre session de navigateur, ce qui élimine les conditions de concurrence susceptibles de provoquer des plantages en parallèle. TestNG fonctionne sur Selenium Grille

Les orchestrateurs d'IA analysent les données d'exécution précédentes pour prédire les échecs, mettre en quarantaine les tests instables et réorganiser les tests lents. Des plateformes telles que Launchable, Testimet mabl se branche dans TestNG Ainsi, les suites les plus susceptibles d'échouer s'exécutent en premier, ce qui raccourcit les boucles de rétroaction sur les serveurs d'intégration continue.

Oui. Les planificateurs pilotés par l'IA de Launchable et BuildPulse mesurent la durée historique et le taux d'instabilité de chaque test, puis divisent le fichier testng.xml en partitions équilibrées. Chaque partition s'exécute sur un agent distinct, ce qui réduit le temps d'exécution total tout en maintenant un taux d'utilisation parallèle élevé.

Résumez cet article avec :