En aquest tema, explorarem les assertions avançades a JUnit, que ens permeten verificar condicions més complexes en els nostres tests. Les assertions avançades són essencials per assegurar que el nostre codi es comporta correctament en situacions més sofisticades.
Continguts
Assertions amb Missatges Personalitzats
Les assertions amb missatges personalitzats ens permeten proporcionar informació addicional quan una assertion falla, facilitant la depuració.
Exemple:
import static org.junit.jupiter.api.Assertions.assertEquals; public class AdvancedAssertionsTest { @Test void testWithCustomMessage() { int expected = 42; int actual = 40 + 2; assertEquals(expected, actual, "El valor esperat no coincideix amb el valor actual"); } }
En aquest exemple, si l'assertion falla, el missatge "El valor esperat no coincideix amb el valor actual" es mostrarà a la sortida del test.
Assertions per Arrays i Col·leccions
JUnit proporciona assertions específiques per comparar arrays i col·leccions, assegurant que els elements i l'ordre siguin correctes.
Exemple:
import static org.junit.jupiter.api.Assertions.assertArrayEquals; import static org.junit.jupiter.api.Assertions.assertIterableEquals; import java.util.Arrays; import java.util.List; public class AdvancedAssertionsTest { @Test void testArrayEquals() { int[] expected = {1, 2, 3}; int[] actual = {1, 2, 3}; assertArrayEquals(expected, actual, "Els arrays no són iguals"); } @Test void testIterableEquals() { List<String> expected = Arrays.asList("a", "b", "c"); List<String> actual = Arrays.asList("a", "b", "c"); assertIterableEquals(expected, actual, "Les col·leccions no són iguals"); } }
Aquestes assertions asseguren que els arrays i les col·leccions continguin els mateixos elements en el mateix ordre.
Assertions per Excepcions
JUnit permet verificar que una excepció específica es llança durant l'execució d'un bloc de codi.
Exemple:
import static org.junit.jupiter.api.Assertions.assertThrows; public class AdvancedAssertionsTest { @Test void testExceptionThrowing() { Exception exception = assertThrows(IllegalArgumentException.class, () -> { throw new IllegalArgumentException("Argument no vàlid"); }); assertEquals("Argument no vàlid", exception.getMessage()); } }
En aquest exemple, verifiquem que es llança una IllegalArgumentException
amb el missatge esperat.
Assertions per Temps d'Execució
Podem utilitzar assertions per assegurar que un bloc de codi s'executa dins d'un temps determinat.
Exemple:
import static org.junit.jupiter.api.Assertions.assertTimeout; import java.time.Duration; public class AdvancedAssertionsTest { @Test void testTimeout() { assertTimeout(Duration.ofSeconds(2), () -> { // Codi que ha de completar-se en menys de 2 segons Thread.sleep(1000); }); } }
Aquest test fallarà si el bloc de codi triga més de 2 segons a executar-se.
Assertions per Condicions Complexes
Podem combinar diverses assertions per verificar condicions més complexes.
Exemple:
import static org.junit.jupiter.api.Assertions.assertAll; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.assertFalse; public class AdvancedAssertionsTest { @Test void testComplexConditions() { int value = 5; assertAll("Comprovacions múltiples", () -> assertTrue(value > 0, "El valor ha de ser positiu"), () -> assertFalse(value < 0, "El valor no ha de ser negatiu"), () -> assertTrue(value < 10, "El valor ha de ser menor que 10") ); } }
Aquest exemple utilitza assertAll
per agrupar diverses assertions en un sol test.
Exercicis Pràctics
Exercici 1:
Escriu un test que verifiqui que una llista de noms conté exactament els elements esperats en l'ordre correcte.
Solució:
import static org.junit.jupiter.api.Assertions.assertIterableEquals; import java.util.Arrays; import java.util.List; public class AdvancedAssertionsTest { @Test void testListContents() { List<String> expected = Arrays.asList("Anna", "Bernat", "Carla"); List<String> actual = Arrays.asList("Anna", "Bernat", "Carla"); assertIterableEquals(expected, actual, "Les llistes no coincideixen"); } }
Exercici 2:
Escriu un test que verifiqui que una excepció NullPointerException
es llança quan es passa un valor nul a un mètode.
Solució:
import static org.junit.jupiter.api.Assertions.assertThrows; public class AdvancedAssertionsTest { @Test void testNullPointerException() { assertThrows(NullPointerException.class, () -> { String str = null; str.length(); }); } }
Conclusió
Les assertions avançades a JUnit ens permeten escriure tests més robustos i detallats, assegurant que el nostre codi es comporta correctament en una varietat de situacions. Amb aquestes eines, podem verificar condicions complexes, gestionar excepcions i assegurar-nos que el nostre codi compleix amb els requisits de rendiment.
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