La migración de JUnit 4 a JUnit 5 puede parecer una tarea desalentadora, pero con una comprensión clara de las diferencias y las nuevas características, el proceso puede ser bastante manejable. En esta sección, cubriremos los pasos necesarios para migrar tus pruebas de JUnit 4 a JUnit 5, destacando las diferencias clave y proporcionando ejemplos prácticos.
Diferencias Clave entre JUnit 4 y JUnit 5
Antes de comenzar la migración, es importante entender las diferencias clave entre JUnit 4 y JUnit 5:
-
Arquitectura Modular:
- JUnit 5 está compuesto por tres subproyectos: JUnit Platform, JUnit Jupiter y JUnit Vintage.
- JUnit 4 es un monolito, mientras que JUnit 5 permite una mayor flexibilidad y extensibilidad.
-
Anotaciones:
- JUnit 5 introduce nuevas anotaciones y cambia algunas de las existentes.
- Ejemplo:
@Before
y@After
en JUnit 4 se reemplazan por@BeforeEach
y@AfterEach
en JUnit 5.
-
Aserciones y Suposiciones:
- JUnit 5 proporciona un conjunto más rico de aserciones y suposiciones.
-
Soporte para Programación Funcional:
- JUnit 5 permite el uso de expresiones lambda y referencias a métodos, lo que facilita la escritura de pruebas más concisas y legibles.
Paso 1: Actualizar las Dependencias
Lo primero que debes hacer es actualizar las dependencias de tu proyecto para incluir JUnit 5. Aquí hay un ejemplo de cómo hacerlo con Maven y Gradle.
Maven
<dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>5.8.1</version> <scope>test</scope> </dependency>
Gradle
Paso 2: Migrar Anotaciones
Las anotaciones en JUnit 5 han cambiado ligeramente. Aquí hay una tabla comparativa de las anotaciones más comunes:
JUnit 4 | JUnit 5 |
---|---|
@BeforeClass |
@BeforeAll |
@AfterClass |
@AfterAll |
@Before |
@BeforeEach |
@After |
@AfterEach |
@Ignore |
@Disabled |
@Test(expected) |
assertThrows |
@Test(timeout) |
@Test con assertTimeout |
Ejemplo de Migración de Anotaciones
JUnit 4
import org.junit.Before; import org.junit.After; import org.junit.BeforeClass; import org.junit.AfterClass; import org.junit.Test; import static org.junit.Assert.*; public class ExampleTest { @BeforeClass public static void setUpBeforeClass() throws Exception { // Código de configuración antes de todos los tests } @AfterClass public static void tearDownAfterClass() throws Exception { // Código de limpieza después de todos los tests } @Before public void setUp() throws Exception { // Código de configuración antes de cada test } @After public void tearDown() throws Exception { // Código de limpieza después de cada test } @Test public void testExample() { assertEquals(1, 1); } }
JUnit 5
import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; public class ExampleTest { @BeforeAll public static void setUpBeforeClass() throws Exception { // Código de configuración antes de todos los tests } @AfterAll public static void tearDownAfterClass() throws Exception { // Código de limpieza después de todos los tests } @BeforeEach public void setUp() throws Exception { // Código de configuración antes de cada test } @AfterEach public void tearDown() throws Exception { // Código de limpieza después de cada test } @Test public void testExample() { assertEquals(1, 1); } }
Paso 3: Migrar Aserciones y Suposiciones
JUnit 5 proporciona un conjunto más rico de aserciones y suposiciones. Aquí hay algunos ejemplos de cómo migrar aserciones comunes.
Aserciones
JUnit 4
import static org.junit.Assert.*; public class AssertionTest { @Test public void testAssertions() { assertEquals("failure - strings are not equal", "text", "text"); assertTrue("failure - should be true", true); assertFalse("failure - should be false", false); } }
JUnit 5
import static org.junit.jupiter.api.Assertions.*; public class AssertionTest { @Test public void testAssertions() { assertEquals("text", "text", "failure - strings are not equal"); assertTrue(true, "failure - should be true"); assertFalse(false, "failure - should be false"); } }
Suposiciones
JUnit 4
import static org.junit.Assume.*; public class AssumptionTest { @Test public void testAssumptions() { assumeTrue(System.getProperty("os.name").startsWith("Windows")); // Test code that should only run on Windows } }
JUnit 5
import static org.junit.jupiter.api.Assumptions.*; public class AssumptionTest { @Test public void testAssumptions() { assumeTrue(System.getProperty("os.name").startsWith("Windows")); // Test code that should only run on Windows } }
Paso 4: Ejecutar y Verificar
Una vez que hayas migrado tus pruebas, es importante ejecutarlas y verificar que todo funcione correctamente. JUnit 5 es compatible con la mayoría de los entornos de construcción y herramientas de CI/CD, por lo que no deberías tener problemas para integrarlo en tu flujo de trabajo existente.
Conclusión
Migrar de JUnit 4 a JUnit 5 puede requerir un esfuerzo inicial, pero las mejoras en la flexibilidad, la extensibilidad y las nuevas características de JUnit 5 hacen que valga la pena. Al seguir los pasos descritos en esta sección, deberías poder realizar la transición de manera efectiva y aprovechar al máximo las capacidades avanzadas de JUnit 5.
Recuerda siempre ejecutar tus pruebas después de cada cambio para asegurarte de que todo funcione como se espera. ¡Buena suerte con tu migración!
Curso de JUnit
Módulo 1: Introducción a JUnit
Módulo 2: Anotaciones Básicas de JUnit
- Entendiendo @Test
- Usando @Before y @After
- Usando @BeforeClass y @AfterClass
- Ignorando Tests con @Ignore
Módulo 3: Aserciones en JUnit
Módulo 4: Tests Parametrizados
- Introducción a los Tests Parametrizados
- Creando Tests Parametrizados
- Usando @ParameterizedTest
- Tests Parametrizados Personalizados
Módulo 5: Suites de Tests
Módulo 6: Mocking con JUnit
Módulo 7: Características Avanzadas de JUnit
Módulo 8: Mejores Prácticas y Consejos
- Escribiendo Tests Efectivos
- Organizando el Código de Tests
- Desarrollo Guiado por Tests (TDD)
- Integración Continua con JUnit