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.
- Arquitectura de JUnit 5
JUnit 5 està compost per tres subprojectes principals:
- 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.
- JUnit Jupiter: Conté les noves anotacions i el model de programació per escriure tests en JUnit 5.
- 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.
- 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ó.
- 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() }
- 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.
- 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.
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