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.

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

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

  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");
    }
}

  1. 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());
}

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

import org.junit.jupiter.api.Tag;

@Tag("fast")
public class FastTest {
    // test methods
}

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

© Copyright 2024. Tots els drets reservats