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
| Feature | JUnit 5 | TestNG |
|---|---|---|
| Release | 2017+ | 2004+ |
| Annotations | @Test, @BeforeEach, etc. | @Test, @BeforeMethod, etc. |
| Ejecución paralela | Sí (config) | Sí (incorporada) |
| Data-driven | @ParameterizedTest | @DataProvider |
| Agrupación tests | @Tag | @Groups |
| Dependencias | @Order | dependsOnMethods |
| Reportes | Básicos + plugins | Ricos incorporados |
| Configuración XML | No | testng.xml |
| Integración Spring | Excelente | Buena |
Comparación de Annotations
Ciclo de Vida de Tests
| Propósito | JUnit 5 | TestNG |
|---|---|---|
| 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
- Unit testing — estándar de industria para unit tests Java
- Proyectos Spring — excelente integración Spring Boot
- Soporte IDE — mejor tooling en IntelliJ y Eclipse
- Java moderno — diseñado para Java 8+ con lambdas
- Proyectos simples — menos configuración necesaria
Cuándo Elegir TestNG
- Testing Selenium — establecido en automatización browser
- Suites de test complejas — configuración XML, grupos
- Testing enterprise — reportes extensos, listeners
- Ejecución paralela — control más granular
- 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.
¿Cuál es más popular?
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
- JUnit Tutorial - Guía completa JUnit 5
- TestNG Tutorial - Guía comprensiva TestNG
- Selenium Tutorial - Básicos de WebDriver
- Java Testing Best Practices - Estrategias de testing
