¿Qué es TestNG?
TestNG es un framework de pruebas Java con anotaciones, grupos, data providers y ejecución paralela. Cómo funciona y diferencias con JUnit 5.
¿Qué es TestNG?
TestNG es un framework de pruebas para Java de código abierto, inspirado en JUnit y NUnit. Las pruebas y el código de preparación se marcan con anotaciones, y añade grupos, data providers, dependencias entre pruebas y ejecución en paralelo. Está pensado para pruebas unitarias, funcionales, de extremo a extremo y de integración, por eso es habitual en suites de UI con Selenium. El nombre viene de Test Next Generation.
Cómo funciona TestNG
Una prueba es un método anotado con @Test dentro de una clase Java normal. La preparación y la limpieza usan anotaciones de configuración que se ejecutan en distintos niveles: @BeforeSuite, @BeforeTest, @BeforeClass y @BeforeMethod, cada una con su pareja @After.... Las pruebas se lanzan desde el IDE, desde Maven o Gradle, o desde un archivo testng.xml que indica qué clases, paquetes o grupos incluir.
import org.testng.annotations.*;
import static org.testng.Assert.*;
public class CalculatorTest {
private Calculator calc;
@BeforeMethod
public void setUp() { calc = new Calculator(); }
@Test(groups = {"smoke"})
public void addsTwoNumbers() {
assertEquals(calc.add(2, 3), 5);
}
@Test(dataProvider = "divisions")
public void divides(int a, int b, int expected) {
assertEquals(calc.divide(a, b), expected);
}
@DataProvider
public Object[][] divisions() {
return new Object[][] { {10, 2, 5}, {20, 4, 5}, {100, 10, 10} };
}
}Cada @BeforeMethod se ejecuta antes de cada prueba, y el data provider pasa tres conjuntos de datos a divides, así que el informe muestra tres resultados a partir de un solo método.
Funciones clave de TestNG
- Grupos: etiquete una prueba con
@Test(groups = {"smoke"})y elija los grupos entestng.xml, por ejemplo las pruebas de humo en cada commit y todo por la noche. - Dependencias:
dependsOnMethodsejecuta una prueba después de los métodos indicados. Si uno falla, la prueba dependiente se marca como SKIP, no FAIL, salvo que usealwaysRun=true. - Data providers:
@DataProviderejecuta un método de prueba con muchas entradas. Conparallel = trueen el provider, esas ejecuciones corren en paralelo. Hay un ejemplo completo en cómo usar el DataProvider en TestNG. - Analizadores de reintento: implemente
IRetryAnalyzery enlácelo con@Test(retryAnalyzer = ...)para repetir las pruebas fallidas. - Listeners: reaccionan al inicio, éxito y fallo de una prueba, por ejemplo para guardar una captura de pantalla cuando falla una prueba de UI.
- Compatibilidad con JUnit: TestNG puede ejecutar pruebas de JUnit 3 y JUnit 4, útil en una migración gradual.
Ejecutar pruebas TestNG en paralelo
El paralelismo se configura en la suite, dentro de testng.xml. El atributo parallel elige la unidad que recibe su propio hilo y thread-count indica cuántos hilos hay disponibles:
methods: cada método de prueba se ejecuta en su propio hilo.tests: cada bloque<test>recibe un hilo y sus métodos lo comparten.classes: cada clase recibe un hilo.instances: los métodos de una misma instancia comparten hilo; instancias distintas pueden correr a la vez.
<suite name="Regression" parallel="methods" thread-count="4">
<test name="Smoke">
<groups><run><include name="smoke"/></run></groups>
<packages><package name="com.example.tests"/></packages>
</test>
</suite>Los data providers paralelos usan su propio pool, que se ajusta con data-provider-thread-count (por defecto, 10). La ejecución en paralelo solo ayuda si las pruebas son independientes. Con Selenium, use un WebDriver por hilo, por ejemplo dentro de un ThreadLocal.
TestNG frente a JUnit 5
Los dos son maduros y funcionan con Maven, Gradle, Selenium y REST Assured. Las diferencias prácticas están en lo que viene incluido:
- Suites y grupos: TestNG incluye
testng.xmlygroups. JUnit 5 usa@Tagy filtros de la herramienta de build. - Dependencias entre pruebas: TestNG las admite. JUnit 5 no, por diseño, lo que empuja hacia pruebas independientes.
- Pruebas parametrizadas:
@DataProvideren TestNG,@ParameterizedTesten JUnit 5. - Ejecución en paralelo: integrada en la configuración de suite de TestNG. JUnit 5 también puede ejecutar en paralelo, activándolo por configuración.
Para pruebas unitarias nuevas sirve cualquiera, así que siga las herramientas que ya usa su equipo. Mezclarlos en un proyecto es posible, pero genera confusión.
Errores comunes con TestNG
- Estado compartido entre pruebas. Una prueba que pasa sola y falla dentro de la suite suele depender de un campo estático que otra prueba modificó.
- Un único WebDriver para todos los hilos. Funciona en serie y se rompe el día que activa
parallel. - Cadenas largas de
dependsOnMethods. Un fallo omite todo lo que viene después y oculta la causa original. - Esperas fijas.
Thread.sleep(5000)ralentiza la suite y aun así falla de forma intermitente. Espere una condición explícita. - Reintentos ilimitados. Repetir una prueba inestable hasta que pase oculta errores reales. Limite los reintentos a uno o dos e investigue cualquier prueba que los necesite.
- Un
testng.xmlque lista cada prueba a mano. Apunte a paquetes y grupos y deje que TestNG descubra las clases.
TestNG, pruebas de regresión y rendimiento
TestNG responde a "¿sigue comportándose correctamente?", que es el trabajo de las pruebas de regresión. No dice cómo se comporta el sistema con muchos usuarios a la vez. Para eso hacen falta pruebas de carga, y en sistemas Java la herramienta habitual es JMeter. LoadFocus ejecuta sus scripts de JMeter sin cambios desde 25 regiones en la nube, y la monitorización de API comprueba códigos de estado, cuerpos de respuesta y latencia según un calendario una vez el código está en producción. Las pruebas TestNG, las pruebas de carga y los monitores cubren fallos distintos y ninguno sustituye a los demás.
Preguntas frecuentes: TestNG
¿Debo usar TestNG o JUnit 5 en un proyecto nuevo?
Las dos opciones son sólidas. TestNG trae de serie archivos de suite, grupos, dependencias y ajustes de paralelismo, lo que encaja con suites grandes de Selenium. JUnit 5 va bien para pruebas unitarias sencillas. Elija el que su equipo y su build ya utilicen.
¿Se sigue manteniendo TestNG?
Sí, TestNG 7.x sigue publicando versiones. Desde la 7.6.0 hace falta JDK 11 o superior; la 7.5 y anteriores funcionan con JDK 8. Consulte la web de TestNG o Maven Central para ver la versión actual.
¿Cómo ejecuto pruebas TestNG en paralelo?
Defina parallel y thread-count en la suite de testng.xml, por ejemplo <suite parallel="methods" thread-count="4">. Los valores válidos son methods, tests, classes e instances. Antes, asegúrese de que las pruebas no comparten estado mutable.
¿Puede TestNG ejecutar pruebas de JUnit?
Puede ejecutar pruebas de JUnit 3 y JUnit 4 si marca la prueba con junit="true" en testng.xml. Las pruebas de JUnit 5 (Jupiter) necesitan en cambio la JUnit Platform.
¿Por qué mi prueba TestNG se omitió en lugar de fallar?
Una prueba con dependsOnMethods se omite cuando falla un método del que depende. Corrija primero la dependencia que falla, o añada alwaysRun=true si la prueba debe ejecutarse siempre.
Términos relacionados
Herramientas LoadFocus relacionadas
Lleva este concepto a la práctica con LoadFocus, la misma plataforma que potencia todo lo que acabas de leer.