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.@BeforeEach
i@AfterEach
: Executen codi abans i després de cada test.@BeforeAll
i@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ètodesetUp
s'executa abans de cada test per inicialitzar l'objecteCalculator
.@Test
: Marca els mètodestestAdd
itestSubtract
com a tests.@DisplayName
: Proporciona noms personalitzats per als tests.@AfterEach
: El mètodetearDown
s'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ètodetestIsPalindrome
com un test.assertTrue
iassertFalse
: Verifiquen que el resultat del mètodeisPalindrome
sigui 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