¿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 en testng.xml, por ejemplo las pruebas de humo en cada commit y todo por la noche.
  • Dependencias: dependsOnMethods ejecuta una prueba después de los métodos indicados. Si uno falla, la prueba dependiente se marca como SKIP, no FAIL, salvo que use alwaysRun=true.
  • Data providers: @DataProvider ejecuta un método de prueba con muchas entradas. Con parallel = true en el provider, esas ejecuciones corren en paralelo. Hay un ejemplo completo en cómo usar el DataProvider en TestNG.
  • Analizadores de reintento: implemente IRetryAnalyzer y 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.xml y groups. JUnit 5 usa @Tag y 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: @DataProvider en TestNG, @ParameterizedTest en 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.xml que 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.

¿Qué tan rápido es tu sitio web?

Mejora su velocidad y SEO sin problemas con nuestra Prueba de Velocidad gratuita.

Prueba de velocidad de sitio web gratis

Analice la velocidad de carga de su sitio web y mejore su rendimiento con nuestro comprobador de velocidad de página gratuito.