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:

  1. JUnit Platform
  2. JUnit Jupiter
  3. JUnit Vintage

  1. 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.

  1. 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ó.

  1. 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ètode setUp s'executa abans de cada test per inicialitzar l'objecte Calculator.
  • @Test: Marca els mètodes testAdd i testSubtract com a tests.
  • @DisplayName: Proporciona noms personalitzats per als tests.
  • @AfterEach: El mètode tearDown s'executa després de cada test per netejar l'objecte Calculator.

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ètode testIsPalindrome com un test.
  • assertTrue i assertFalse: Verifiquen que el resultat del mètode isPalindrome 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.

© Copyright 2024. Tots els drets reservats