JUnit 5 és una reescriptura completa de JUnit 4, dissenyada per ser més flexible i extensible. La seva arquitectura modular permet als desenvolupadors utilitzar només les parts que necessiten, i facilita la integració amb altres eines i biblioteques. En aquesta secció, explorarem els components clau de l'arquitectura de JUnit 5.
Components Principals de JUnit 5
JUnit 5 està dividit en tres subprojectes principals:
- JUnit Platform
- JUnit Jupiter
- JUnit Vintage
- JUnit Platform
JUnit Platform és la base sobre la qual es construeixen els altres components de JUnit 5. Proporciona la infraestructura necessària per descobrir, executar i informar sobre els tests. Els seus components principals són:
- TestEngine API: Defineix l'API que han d'implementar els motors de test (com JUnit Jupiter i JUnit Vintage) per ser compatibles amb la plataforma.
- Launcher API: Permet als clients (IDE, sistemes de construcció, etc.) descobrir i executar tests.
- Console Launcher: Una eina de línia de comandes per executar tests des de la consola.
- Test Kit: Proporciona utilitats per escriure i executar tests de motors de test.
- JUnit Jupiter
JUnit Jupiter és el nou motor de test i model de programació per a JUnit 5. Inclou:
- API de Test: Proporciona anotacions i interfícies per escriure tests i extensions.
- Motor de Test: Implementa l'API TestEngine per executar tests escrits amb l'API de JUnit Jupiter.
Anotacions Clau de JUnit Jupiter
@Test: Marca un mètode com un test.@BeforeEachi@AfterEach: Executen codi abans i després de cada test.@BeforeAlli@AfterAll: Executen codi abans i després de tots els tests en una classe.@DisplayName: Proporciona un nom personalitzat per a un test.@Nested: Permet definir classes de test internes per agrupar tests lògicament.@Tag: Marca tests amb etiquetes per facilitar la seva selecció i execució.
- JUnit Vintage
JUnit Vintage permet executar tests escrits amb JUnit 3 i JUnit 4 en la plataforma JUnit 5. Això facilita la migració gradual de tests antics a la nova API de JUnit 5.
Diagrama de l'Arquitectura
A continuació es mostra un diagrama simplificat de l'arquitectura de JUnit 5:
+-------------------+
| JUnit Platform |
|-------------------|
| TestEngine API |
| Launcher API |
| Console Launcher |
| Test Kit |
+-------------------+
|
v
+-------------------+ +-------------------+
| JUnit Jupiter | | JUnit Vintage |
|-------------------| |-------------------|
| API de Test | | JUnit 3/4 Engine |
| Motor de Test | +-------------------+
+-------------------+Exemple Pràctic
Vegem un exemple pràctic d'un test escrit amb JUnit Jupiter:
import org.junit.jupiter.api.*;
import static org.junit.jupiter.api.Assertions.*;
class CalculatorTest {
private Calculator calculator;
@BeforeEach
void setUp() {
calculator = new Calculator();
}
@Test
@DisplayName("Test de suma")
void testAdd() {
assertEquals(5, calculator.add(2, 3), "2 + 3 hauria de ser 5");
}
@Test
@DisplayName("Test de resta")
void testSubtract() {
assertEquals(1, calculator.subtract(3, 2), "3 - 2 hauria de ser 1");
}
@AfterEach
void tearDown() {
calculator = null;
}
}Explicació del Codi
@BeforeEach: El mètodesetUps'executa abans de cada test per inicialitzar l'objecteCalculator.@Test: Marca els mètodestestAdditestSubtractcom a tests.@DisplayName: Proporciona noms personalitzats per als tests.@AfterEach: El mètodetearDowns'executa després de cada test per netejar l'objecteCalculator.
Exercici Pràctic
Exercici
Escriu un test per a una classe StringUtils que contingui un mètode isPalindrome que determini si una cadena és un palíndrom.
class StringUtils {
public static boolean isPalindrome(String str) {
String cleaned = str.replaceAll("\\s+", "").toLowerCase();
return cleaned.equals(new StringBuilder(cleaned).reverse().toString());
}
}Solució
import org.junit.jupiter.api.*;
import static org.junit.jupiter.api.Assertions.*;
class StringUtilsTest {
@Test
@DisplayName("Test de palíndrom")
void testIsPalindrome() {
assertTrue(StringUtils.isPalindrome("A man a plan a canal Panama"), "Ha de ser un palíndrom");
assertFalse(StringUtils.isPalindrome("Hello World"), "No ha de ser un palíndrom");
}
}Explicació del Codi
@Test: Marca el mètodetestIsPalindromecom un test.assertTrueiassertFalse: Verifiquen que el resultat del mètodeisPalindromesigui correcte.
Conclusió
En aquesta secció, hem explorat l'arquitectura modular de JUnit 5, incloent els seus components principals: JUnit Platform, JUnit Jupiter i JUnit Vintage. També hem vist un exemple pràctic de com escriure tests amb JUnit Jupiter i hem proporcionat un exercici per reforçar els conceptes apresos. Amb aquesta base, estàs preparat per aprofundir en les noves funcionalitats i millores que JUnit 5 ofereix.
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
