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.

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.
- Crea un nuevo proyecto en Eclipse.
- Crea dos paquetes en el proyecto (nómbralos com.suite1 y com.suite2).
- 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.
- 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.
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.
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:
1) Nombre del conjunto definido en testng.xml.
2) Nombre de la prueba definida en testng.xml.
3) Nombre de la clase declarada en testng.xml.
4) Nombres de métodos anotados con @Test en el archivo .java.
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.




