La migració de JUnit 4 a JUnit 5 pot semblar una tasca desafiant, però amb una comprensió clara de les diferències i les noves funcionalitats, el procés es pot simplificar considerablement. Aquest tema proporcionarà una guia pas a pas per ajudar-te a migrar els teus tests de JUnit 4 a JUnit 5.
- Diferències Clau entre JUnit 4 i JUnit 5
Arquitectura
- JUnit 4: Monolític, tot el codi està en una sola biblioteca.
- JUnit 5: Modular, dividit en tres subprojectes principals:
- JUnit Platform: Base per a l'execució de frameworks de test.
- JUnit Jupiter: Nou model de programació i extensió per a JUnit 5.
- JUnit Vintage: Suport per executar tests escrits amb JUnit 3 i JUnit 4.
Anotacions
| JUnit 4 | JUnit 5 | Descripció |
|---|---|---|
@Before |
@BeforeEach |
Executa abans de cada test. |
@After |
@AfterEach |
Executa després de cada test. |
@BeforeClass |
@BeforeAll |
Executa una vegada abans de tots els tests de la classe. |
@AfterClass |
@AfterAll |
Executa una vegada després de tots els tests de la classe. |
@Ignore |
@Disabled |
Ignora un test. |
@Category |
@Tag |
Classifica tests en categories. |
@Test(expected) |
@Test + assertThrows |
Verifica que una excepció específica és llançada. |
@Test(timeout) |
@Test + assertTimeout |
Verifica que un test es completa dins d'un temps específic. |
Assertions
- JUnit 5 introdueix noves assertions i millora les existents, proporcionant més flexibilitat i funcionalitat.
- Configuració del Projecte
Dependències de Maven
Actualitza el teu pom.xml per incloure les dependències de JUnit 5:
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
<version>5.8.1</version>
<scope>test</scope>
</dependency>Dependències de Gradle
Actualitza el teu build.gradle per incloure les dependències de JUnit 5:
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1' testRuntimeOnly 'org.junit.vintage:junit-vintage-engine:5.8.1'
- Migració de Tests
Exemple de Migració
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 CalculatorTest {
private Calculator calculator;
@BeforeClass
public static void initAll() {
System.out.println("Before all tests");
}
@Before
public void init() {
calculator = new Calculator();
}
@Test
public void testAdd() {
assertEquals(2, calculator.add(1, 1));
}
@After
public void tearDown() {
calculator = null;
}
@AfterClass
public static void tearDownAll() {
System.out.println("After all tests");
}
}JUnit 5
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
public class CalculatorTest {
private Calculator calculator;
@BeforeAll
public static void initAll() {
System.out.println("Before all tests");
}
@BeforeEach
public void init() {
calculator = new Calculator();
}
@Test
public void testAdd() {
assertEquals(2, calculator.add(1, 1));
}
@AfterEach
public void tearDown() {
calculator = null;
}
@AfterAll
public static void tearDownAll() {
System.out.println("After all tests");
}
}
- Migració d'Assertions
Exemple de Migració d'Assertions
JUnit 4
@Test
public void testException() {
try {
calculator.divide(1, 0);
fail("Expected an ArithmeticException to be thrown");
} catch (ArithmeticException e) {
assertEquals("/ by zero", e.getMessage());
}
}JUnit 5
@Test
public void testException() {
ArithmeticException exception = assertThrows(ArithmeticException.class, () -> {
calculator.divide(1, 0);
});
assertEquals("/ by zero", exception.getMessage());
}
- Migració de Categories a Tags
Exemple de Migració de Categories a Tags
JUnit 4
import org.junit.experimental.categories.Category;
@Category(FastTests.class)
public class FastTest {
// test methods
}JUnit 5
- Consells Addicionals
- Executa tests freqüentment: Durant la migració, executa els tests freqüentment per assegurar-te que tot funciona correctament.
- Utilitza JUnit Vintage: Si tens molts tests antics, pots utilitzar JUnit Vintage per executar-los mentre migres gradualment a JUnit 5.
- Refactoritza el codi de test: Aprofita la migració per refactoritzar i millorar el codi de test.
Conclusió
Migrar de JUnit 4 a JUnit 5 pot requerir una mica de treball, però els beneficis en termes de noves funcionalitats, millor modularitat i una API més moderna valen la pena. Amb aquesta guia, hauràs après els passos necessaris per realitzar una migració efectiva i sense problemes.
Curs de JUnit
Mòdul 1: Introducció a JUnit
Mòdul 2: Anotacions Bàsiques de JUnit
- Entenent @Test
- Utilitzant @Before i @After
- Utilitzant @BeforeClass i @AfterClass
- Ignorant Tests amb @Ignore
Mòdul 3: Assertions a JUnit
Mòdul 4: Tests Parametritzats
- Introducció als Tests Parametritzats
- Creant Tests Parametritzats
- Utilitzant @ParameterizedTest
- Tests Parametritzats Personalitzats
Mòdul 5: Suites de Test
Mòdul 6: Mocking amb JUnit
Mòdul 7: Funcions Avançades de JUnit
Mòdul 8: Millors Pràctiques i Consells
- Escrivint Tests Efectius
- Organitzant el Codi de Test
- Desenvolupament Guiat per Tests (TDD)
- Integració Contínua amb JUnit
