JUnit 5 és la nova generació del popular framework de testing per a Java. Aquesta versió introdueix una sèrie de millores i noves funcionalitats que fan que el procés de testing sigui més flexible i potent. En aquesta secció, explorarem les principals característiques de JUnit 5 i com es diferencia de les versions anteriors.

  1. Arquitectura de JUnit 5

JUnit 5 està compost per tres subprojectes principals:

  1. JUnit Platform: Proporciona la infraestructura per llançar frameworks de testing en la JVM. Permet executar tests des de la línia de comandes, IDEs i eines de construcció com Maven i Gradle.
  2. JUnit Jupiter: Conté les noves anotacions i el model de programació per escriure tests en JUnit 5.
  3. JUnit Vintage: Proporciona compatibilitat amb les versions anteriors de JUnit (JUnit 3 i JUnit 4), permetent executar tests escrits amb aquestes versions en la nova plataforma.

  1. Principals Característiques de JUnit 5

2.1. Anotacions Noves i Millorades

JUnit 5 introdueix noves anotacions i millora les existents per oferir més flexibilitat i funcionalitat:

  • @Test: Marca un mètode com un test. Similar a JUnit 4, però amb més opcions.
  • @BeforeEach i @AfterEach: Substitueixen @Before i @After de JUnit 4. S'executen abans i després de cada test, respectivament.
  • @BeforeAll i @AfterAll: Substitueixen @BeforeClass i @AfterClass. S'executen una vegada abans i després de tots els tests de la classe.
  • @DisplayName: Permet definir noms personalitzats per als tests, millorant la llegibilitat dels resultats.
  • @Nested: Permet agrupar tests en classes internes, facilitant l'organització i la llegibilitat.
  • @Tag: Permet etiquetar tests per agrupar-los i executar-los selectivament.

2.2. Assertions i Assumptions

JUnit 5 millora les assertions i assumptions, oferint més opcions i flexibilitat:

  • Assertions: assertEquals, assertTrue, assertThrows, etc.
  • Assumptions: assumeTrue, assumeFalse, assumingThat, etc.

2.3. Tests Parametritzats

JUnit 5 facilita la creació de tests parametritzats amb l'anotació @ParameterizedTest i diversos proveïdors de dades com @ValueSource, @EnumSource, @MethodSource, etc.

2.4. Extensions

JUnit 5 introdueix un model d'extensió potent que permet personalitzar el comportament dels tests. Les extensions es poden utilitzar per:

  • Gestionar el cicle de vida dels tests.
  • Injectar dependències.
  • Manipular el context d'execució.

  1. Configuració de JUnit 5

Per començar a utilitzar JUnit 5, cal afegir les dependències necessàries al projecte. A continuació es mostra com fer-ho amb Maven i Gradle.

3.1. Maven

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.junit</groupId>
            <artifactId>junit-bom</artifactId>
            <version>5.8.1</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter</artifactId>
        <version>5.8.1</version>
        <scope>test</scope>
    </dependency>
</dependencies>

3.2. Gradle

dependencies {
    testImplementation 'org.junit.jupiter:junit-jupiter:5.8.1'
}
test {
    useJUnitPlatform()
}

  1. Primer Test amb JUnit 5

A continuació, es mostra un exemple senzill d'un test escrit amb JUnit 5:

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;

public class CalculatorTest {

    @Test
    void addition() {
        Calculator calculator = new Calculator();
        assertEquals(2, calculator.add(1, 1), "1 + 1 should equal 2");
    }
}

En aquest exemple, hem creat una classe CalculatorTest amb un mètode addition que comprova si la suma de 1 i 1 és igual a 2.

  1. Exercici Pràctic

Exercici

Crea una classe StringUtils amb un mètode isPalindrome que comprovi si una cadena és un palíndrom. Escriu un test per verificar el funcionament d'aquest mètode.

Solució

public class StringUtils {

    public boolean isPalindrome(String str) {
        if (str == null) {
            return false;
        }
        String cleaned = str.replaceAll("\\s+", "").toLowerCase();
        String reversed = new StringBuilder(cleaned).reverse().toString();
        return cleaned.equals(reversed);
    }
}
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.assertFalse;

public class StringUtilsTest {

    @Test
    void testIsPalindrome() {
        StringUtils utils = new StringUtils();
        assertTrue(utils.isPalindrome("A man a plan a canal Panama"), "Should be a palindrome");
        assertFalse(utils.isPalindrome("Hello World"), "Should not be a palindrome");
    }
}

Conclusió

En aquesta secció, hem introduït JUnit 5, destacant les seves principals característiques i diferències respecte a les versions anteriors. Hem vist com configurar JUnit 5 en projectes Maven i Gradle, i hem creat un test senzill per il·lustrar el seu ús. A la següent secció, explorarem l'arquitectura de JUnit 5 en més detall.

© Copyright 2024. Tots els drets reservats