TL;DR

  • JUnit 5: Moderno, extensible, estándar para unit tests, integración Spring
  • TestNG: Rico en features, ejecución paralela, data providers, Selenium-friendly
  • Para unit tests: JUnit 5 (estándar industria, mejor soporte IDE)
  • Para Selenium/E2E: TestNG (grupos, paralelo, reportes) o JUnit 5 (moderno)
  • Migración: JUnit 5 y TestNG ahora tienen features similares

Tiempo de lectura: 9 minutos

JUnit y TestNG son los frameworks dominantes de testing Java. JUnit es el estándar para unit testing, TestNG surgió para agregar features que JUnit carecía. JUnit 5 ha reducido la brecha significativamente.

Comparación Rápida

FeatureJUnit 5TestNG
Release2017+2004+
Annotations@Test, @BeforeEach, etc.@Test, @BeforeMethod, etc.
Ejecución paralelaSí (config)Sí (incorporada)
Data-driven@ParameterizedTest@DataProvider
Agrupación tests@Tag@Groups
Dependencias@OrderdependsOnMethods
ReportesBásicos + pluginsRicos incorporados
Configuración XMLNotestng.xml
Integración SpringExcelenteBuena

Comparación de Annotations

Ciclo de Vida de Tests

PropósitoJUnit 5TestNG
Método test@Test@Test
Antes de cada test@BeforeEach@BeforeMethod
Después de cada test@AfterEach@AfterMethod
Antes de todos tests@BeforeAll@BeforeClass
Después de todos tests@AfterAll@AfterClass
Antes de suite@BeforeSuite
Después de suite@AfterSuite

TestNG tiene annotations de lifecycle más granulares.

Ejemplos de Tests

Test JUnit 5

import org.junit.jupiter.api.*;
import static org.junit.jupiter.api.Assertions.*;

@DisplayName("Calculator Tests")
class CalculatorTest {

    private Calculator calc;

    @BeforeEach
    void setUp() {
        calc = new Calculator();
    }

    @Test
    @DisplayName("Addition works correctly")
    void testAddition() {
        assertEquals(5, calc.add(2, 3));
    }

    @Test
    @Tag("slow")
    void testComplexOperation() {
        // Etiquetado para ejecución selectiva
        assertNotNull(calc.complexCalc());
    }
}

Test TestNG

import org.testng.annotations.*;
import static org.testng.Assert.*;

public class CalculatorTest {

    private Calculator calc;

    @BeforeMethod
    public void setUp() {
        calc = new Calculator();
    }

    @Test(description = "Addition works correctly")
    public void testAddition() {
        assertEquals(calc.add(2, 3), 5);
    }

    @Test(groups = {"slow"})
    public void testComplexOperation() {
        // Agrupado para ejecución selectiva
        assertNotNull(calc.complexCalc());
    }
}

Testing Data-Driven

Tests Parametrizados JUnit 5

@ParameterizedTest
@CsvSource({
    "2, 3, 5",
    "0, 0, 0",
    "-1, 1, 0"
})
void testAddition(int a, int b, int expected) {
    assertEquals(expected, calc.add(a, b));
}

@ParameterizedTest
@MethodSource("provideNumbers")
void testWithMethodSource(int a, int b, int expected) {
    assertEquals(expected, calc.add(a, b));
}

static Stream<Arguments> provideNumbers() {
    return Stream.of(
        Arguments.of(2, 3, 5),
        Arguments.of(0, 0, 0)
    );
}

DataProvider TestNG

@DataProvider(name = "additionData")
public Object[][] provideData() {
    return new Object[][] {
        {2, 3, 5},
        {0, 0, 0},
        {-1, 1, 0}
    };
}

@Test(dataProvider = "additionData")
public void testAddition(int a, int b, int expected) {
    assertEquals(calc.add(a, b), expected);
}

El DataProvider de TestNG es más directo para datos complejos.

Ejecución Paralela

JUnit 5 Paralelo

# junit-platform.properties
junit.jupiter.execution.parallel.enabled = true
junit.jupiter.execution.parallel.mode.default = concurrent
junit.jupiter.execution.parallel.config.strategy = fixed
junit.jupiter.execution.parallel.config.fixed.parallelism = 4

TestNG Paralelo

<!-- testng.xml -->
<suite name="Parallel Suite" parallel="methods" thread-count="4">
    <test name="Tests">
        <classes>
            <class name="com.example.CalculatorTest"/>
        </classes>
    </test>
</suite>

La configuración XML de TestNG ofrece más control sobre ejecución paralela.

Dependencias de Tests

Ordenamiento JUnit 5

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
class OrderedTest {

    @Test
    @Order(1)
    void createUser() { }

    @Test
    @Order(2)
    void verifyUser() { }
}

Dependencias TestNG

@Test
public void createUser() { }

@Test(dependsOnMethods = {"createUser"})
public void verifyUser() { }

@Test(dependsOnGroups = {"setup"})
public void runAfterSetup() { }

TestNG tiene dependencias explícitas de métodos; JUnit usa ordenamiento.

Cuándo Elegir JUnit 5

  1. Unit testing — estándar de industria para unit tests Java
  2. Proyectos Spring — excelente integración Spring Boot
  3. Soporte IDE — mejor tooling en IntelliJ y Eclipse
  4. Java moderno — diseñado para Java 8+ con lambdas
  5. Proyectos simples — menos configuración necesaria

Cuándo Elegir TestNG

  1. Testing Selenium — establecido en automatización browser
  2. Suites de test complejas — configuración XML, grupos
  3. Testing enterprise — reportes extensos, listeners
  4. Ejecución paralela — control más granular
  5. Proyectos legacy — infraestructura TestNG existente

FAQ

¿Es TestNG mejor que JUnit?

TestNG ofrece más features incorporadas: ejecución paralela, data providers, agrupación flexible y reportes ricos. JUnit 5 ha avanzado significativamente con tests parametrizados, ejecución paralela y tags. Elige TestNG para automatización de tests compleja y proyectos Selenium, JUnit 5 para unit testing estándar y aplicaciones Spring.

¿TestNG o JUnit para Selenium?

TestNG es tradicionalmente preferido para Selenium debido a ejecución paralela de browsers, agrupación de tests, dependencias de métodos y reportes incorporados. Sin embargo, JUnit 5 ahora soporta estas features adecuadamente. Ambos funcionan igualmente bien con Selenium WebDriver. Elige basándote en experiencia del equipo e infraestructura existente.

¿Puedo usar TestNG y JUnit juntos?

Técnicamente sí, pero no se recomienda en el mismo módulo. Algunos proyectos usan JUnit para unit tests y TestNG para tests de integración/Selenium en módulos separados. Esto agrega complejidad. La mayoría de equipos eligen un framework para consistencia y configuración de build más simple.

JUnit tiene mayor adopción general, especialmente para unit testing. TestNG es popular en QA enterprise y automatización Selenium. Ambos están activamente mantenidos con comunidades fuertes. Las features modernas de JUnit 5 han atraído muchos usuarios de TestNG, mientras TestNG retiene lealtad en testing de automatización.

Ver También