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.

  • 🧵 Thread paralleli: Imposta thread-count e parallel=”tests” per ridurre drasticamente il tempo di esecuzione complessivo su tutti i browser e i pacchetti.
  • 🗂️ Gerarchia delle suite: Un file testng.xml padre può elencare le voci dei file suite figli per concatenare più suite in un singolo trigger.
  • ⚙️ TestNG 7.x Pronto: Esempi si allineano con TestNG 7.10 e Selenium 4 driver W3C, che sostituiscono quelli legacy FirefoxCablaggio del driver.
  • 📊 Rapporti intelligenti: I livelli di dettaglio da 1 a 10 e i report HTML inviabili via e-mail aiutano a diagnosticare rapidamente i problemi relativi ai thread paralleli.
  • 🤖 Orchestrazione dell'IA: Gli scheduler basati sull'intelligenza artificiale riordinano, riprovano e suddividono le suite in base ai dati storici relativi a flake e durata.

Esegui più casi di test con TestNG Suite in Selenium

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.

  1. Crea un nuovo progetto in Eclipse.
  2. Crea due pacchetti nel progetto (dai loro un nome com.suite1 and com.suite2).
  3. Crea una classe in ogni pacchetto (dai loro un nome Flipkart.java and Snapdeal.java) e copiare il codice seguente nelle rispettive classi.
  4. 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.

Creazione di un TestNGFile .xml per l'esecuzione del test

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.

Esecuzione parallela in TestNG

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:

Esecuzione parallela in TestNG

1) Nome della suite definita in testng.xml.

Esecuzione parallela in TestNG

2) Nome del test definito in testng.xml.

Esecuzione parallela in TestNG

3) Nome della classe dichiarata in testng.xml.

Esecuzione parallela in TestNG

4) Nomi dei metodi annotati con @Test nel file .java.

Esecuzione parallela in TestNG

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.

DOMANDE FREQUENTI

Posiziona ogni classe nella propria Inserisci il tag all'interno di testng.xml, quindi imposta parallel="tests" e un thread-count di almeno 2. TestNG avvia entrambi i test su thread separati, in modo che le classi vengano eseguite contemporaneamente anziché in sequenza.

Sì. Crea una suite principale che elenca i file secondari al suo interno . Ogni percorso del file della suite figlia esegue la propria configurazione. Il modello funziona in Eclipse, Maven Surefire e Gradlee viene supportato da TestNG Dalla versione 6 in poi, inclusa l'attuale versione 7.x.

L'attributo parallelo accetta test, classi, metodi, istanze o nessuno. Scegli test quando ciascuno Il tag è autonomo, le classi per l'isolamento dell'intera classe e i metodi quando i singoli metodi @Test sono thread-safe. Il valore predefinito è none, che esegue tutto in sequenza.

Usa un thread locale oppure inizializzare il driver all'interno di un blocco @BeforeMethod invece che come campo statico. Ogni thread possiede quindi la propria sessione del browser, il che elimina le condizioni di gara che causano il crash in parallelo TestNG gira su Selenium Griglia.

Gli orchestratori di IA studiano i dati delle esecuzioni precedenti per prevedere i fallimenti, mettere in quarantena i test instabili e riordinare quelli lenti. Piattaforme come Launchable, Testime collega mabl TestNG In questo modo, le suite con maggiori probabilità di fallimento vengono eseguite per prime, il che riduce i cicli di feedback sui server di integrazione continua.

Sì. Gli scheduler basati sull'IA di Launchable e BuildPulse misurano la durata storica e il tasso di inattività per ogni test, quindi suddividono il file testng.xml in shard bilanciati. Ogni shard viene eseguito su un agente separato, in modo che il tempo totale di esecuzione si riduca, mentre l'utilizzo parallelo rimane elevato.

Riassumi questo post con: