Cómo ejecutar varios casos de prueba en TestNG Suite

⚡ Resumen inteligente

Ejecute múltiples casos de prueba con TestNG Suite en Selenium Te permite activar varias clases, paquetes o suites secundarias desde un único archivo testng.xml. Este tutorial cubre hilos paralelos, jerarquía de suites, informes y asistencia de IA para la IA moderna. TestNG Proyectos 7.x.

  • 🧵 Hilos paralelos: Configura thread-count y parallel=”tests” para reducir drásticamente el tiempo de ejecución total en todos los navegadores y paquetes.
  • 🗂️ Jerarquía de suites: Un archivo testng.xml principal puede listar las entradas de los archivos de suite secundarios para encadenar varias suites en un solo activador.
  • ⚙️ TestNG 7.x Listo: Los ejemplos se alinean con TestNG 7.10 y Selenium 4 controladores W3C, que reemplazan a los anteriores. FirefoxCableado del controlador.
  • 📊 Informes inteligentes: Los niveles de detalle del 1 al 10 y los informes HTML que se pueden enviar por correo electrónico ayudan a diagnosticar rápidamente los problemas con los hilos paralelos.
  • 🤖 Orquestación de IA: Los planificadores impulsados ​​por IA reordenan, reintentan y dividen los conjuntos de tareas en función de los datos históricos de latencia y duración.

Ejecute múltiples casos de prueba con TestNG Suite en Selenium

TestNG permite ejecutar métodos de prueba, clases y conjuntos completos en paralelo dentro de un mismo proyecto. La ejecución en paralelo reduce el tiempo total de ejecución porque los hilos inician las pruebas simultáneamente en lugar de una tras otra. Esta guía explica cómo ejecutar varias clases (diferentes conjuntos) utilizando TestNG 7.x con Selenium Controlador web.

Paso 1) Crear un TestNGArchivo .xml para ejecutar pruebas

Para crear la configuración, siga los pasos que se indican a continuación.

  1. Crea un nuevo proyecto en Eclipse.
  2. Crea dos paquetes en el proyecto (nómbralos com.suite1 y com.suite2).
  3. Crea una clase en cada paquete (nómbralas Flipkart.java y Snapdeal.java) y copie el código que aparece a continuación en las clases correspondientes.
  4. Crea un nuevo archivo en tu proyecto y nómbralo pruebang.xml. Asegúrate que TestNG El complemento está instalado (instrucciones disponibles) aquíEl archivo testng.xml contiene toda la configuración, como los nombres de las clases, los nombres de las pruebas y los nombres de los conjuntos de pruebas.

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 estructura final del proyecto se parece al ejemplo que aparece a continuación.

Crear un  TestNGArchivo .xml para ejecutar la prueba

Paso 2) Ejecución paralela en TestNG

Tras guardar el archivo XML anterior, el siguiente paso es ejecutar las pruebas en paralelo. El código se muestra a continuación.

Ejecución paralela en TestNG

1) número de hilos: Define cuántos hilos TestNG Puede configurarse para la ejecución en paralelo. Un valor más alto ejecuta más pruebas a la vez, hasta el límite de la CPU.

2) detallado: Registra los detalles de la ejecución en la consola. Los valores permitidos van del 1 al 10. Los valores más altos generan registros más detallados y específicos.

3) nombre: Nombre de la suite. Aquí está “Gmail Suite".

4) paralelo: Dice TestNG qué ejecutar simultáneamente. Los valores válidos son pruebas, clases, métodos o instancias. El valor predeterminado es ninguna.

Haga clic con el botón derecho en el archivo testng.xml y seleccione Ejecutar como > TestNG SuiteUna vez finalizado, verá los resultados consolidados.

Cuando ejecute el código anterior, obtendrá el siguiente resultado.

Salida:

Ejecución paralela en TestNG

1) Nombre del conjunto definido en testng.xml.

Ejecución paralela en TestNG

2) Nombre de la prueba definida en testng.xml.

Ejecución paralela en TestNG

3) Nombre de la clase declarada en testng.xml.

Ejecución paralela en TestNG

4) Nombres de métodos anotados con @Test en el archivo .java.

Ejecución paralela en TestNG

El mismo flujo se aplica a la prueba SnapDeal, por lo que ambas clases se ejecutan en paralelo.

Paso 3) Ejecutar múltiples conjuntos de pruebas desde un único archivo testng.xml principal.

Un requisito común en proyectos de mayor envergadura es encadenar varios archivos testng.xml en un único activador. TestNG 7.x admite un conjunto principal que hace referencia al conjunto secundario. archivo de suite entradas, para que cada hijo pueda mantener su propio recuento de subprocesos, oyentes y parámetros. Guarde cada suite de hijos por separado, luego indique al padre su ruta. Ejecute solo el archivo padre desde Eclipse, Maven o la línea de comandos.

<!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>

Este patrón mantiene los conjuntos de regresión, humo y sanidad separados pero reutilizables. También puede activar el archivo padre desde Maven Surefire configurando <suiteXmlFile>parent-suite.xml</suiteXmlFile> dentro de la configuración del complemento, lo que permite que el mismo diseño paralelo funcione en las canalizaciones de integración continua.

Paso 4) Mejores prácticas para paralelo TestNG corre

  • Pin TestNG 7.x: Usar TestNG 7.10 o posterior con Selenium 4. De esta forma, los controladores compatibles con W3C se comportan de manera consistente en todos los subprocesos.
  • Evitar el estado compartido: Mueva el Controlador web campo en un ThreadLocal para que cada hilo mantenga su propia sesión.
  • Ajustar el número de hilos: Empiece por el recuento de núcleos de la CPU, luego observe el informe HTML que se puede enviar por correo electrónico y la carga de la cuadrícula antes de aumentarla.
  • Aislar los datos de prueba: Utilice usuarios, carritos y códigos PIN únicos por hilo para evitar que los inicios de sesión se produzcan conflictos.
  • Capturar capturas de pantalla en caso de fallo: Conéctalos a través de un ITestListener para depurar ejecuciones paralelas inestables más rápidamente.
  • Utilice la asistencia de la IA: Herramientas como Testimmabl y CodiumAI pueden detectar pruebas inestables y sugerir selectores estables antes de la siguiente ejecución.

Conclusión

El ejemplo anterior muestra cómo usar TestNG para ejecutar pruebas en paralelo. TestNG 7.x te ofrece un único archivo XML para ejecutar múltiples clases de prueba, vincular varias suites secundarias y ajustar hilos paralelos, por lo que es muy grande. Selenium Los proyectos se terminan mucho más rápido.

Preguntas Frecuentes

Coloca cada clase en su propio Agregue la etiqueta dentro de testng.xml y luego establezca parallel=”tests” y un recuento de hilos de al menos 2. TestNG Esto inicia ambas pruebas en hilos separados, de modo que las clases se ejecutan simultáneamente en lugar de secuencialmente.

Sí. Crea un conjunto principal que enumere los archivos secundarios dentro Cada ruta de archivo de suite secundaria ejecuta su propia configuración. El patrón funciona en Eclipse, Maven Surefire y Gradley cuenta con el apoyo de TestNG A partir de la versión 6, incluyendo la versión actual 7.x.

El atributo parallel acepta pruebas, clases, métodos, instancias o ninguno. Elija pruebas cuando cada La etiqueta es autocontenida, las clases permiten el aislamiento de clases completas y los métodos son seguros para subprocesos cuando los métodos @Test individuales lo son. El valor predeterminado es ninguno, lo que ejecuta todo secuencialmente.

Utilice un ThreadLocal o inicializar el controlador dentro de un bloque @BeforeMethod en lugar de como un campo estático. Cada hilo entonces posee su propia sesión del navegador, lo que elimina las condiciones de carrera que provocan fallos en paralelo. TestNG se ejecuta en Selenium Rejilla

Los orquestadores de IA estudian datos de ejecuciones anteriores para predecir fallas, poner en cuarentena pruebas inestables y reordenar las lentas. Plataformas como Launchable, Testimy mabl conectar en TestNG De esta forma, se ejecutan primero los conjuntos de pruebas con mayor probabilidad de fallar, lo que acorta los ciclos de retroalimentación en los servidores de integración continua.

Sí. Los planificadores basados ​​en IA de Launchable y BuildPulse miden la duración histórica y la tasa de fallos por prueba, y luego dividen el archivo testng.xml en fragmentos equilibrados. Cada fragmento se ejecuta en un agente independiente, por lo que el tiempo total de ejecución disminuye mientras que la utilización paralela se mantiene alta.

Resumir este post con: