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