Els tests parametritzats permeten executar el mateix test amb diferents conjunts de dades. Això és especialment útil quan es vol provar una funció amb múltiples valors d'entrada i verificar que el resultat sigui correcte per a cadascun d'ells. En aquest tema, aprendrem com crear tests parametritzats amb JUnit.
- Introducció als Tests Parametritzats
Què són els Tests Parametritzats?
Els tests parametritzats són una manera d'executar el mateix test diverses vegades amb diferents dades d'entrada. Això ajuda a reduir la duplicació de codi i a assegurar que la funció es comporta correctament amb una varietat de dades.
Beneficis dels Tests Parametritzats
- Reducció de la duplicació de codi: No cal escriure múltiples tests per a cada conjunt de dades.
- Millora de la cobertura de tests: Permet provar una funció amb una àmplia gamma de valors d'entrada.
- Mantenibilitat: Facilita l'actualització dels tests, ja que només cal modificar un únic test parametritzat en lloc de múltiples tests individuals.
- Configuració de Tests Parametritzats
Dependències Necessàries
Per utilitzar tests parametritzats amb JUnit, assegura't de tenir les següents dependències al teu projecte:
<dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>5.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-params</artifactId> <version>5.8.1</version> <scope>test</scope> </dependency>
- Creant un Test Parametritzat
Exemple Bàsic
A continuació, es mostra un exemple bàsic de com crear un test parametritzat amb JUnit:
import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; public class ParameterizedTestExample { @ParameterizedTest @ValueSource(ints = {1, 2, 3, 4, 5}) void testIsEven(int number) { assertEquals(0, number % 2); } }
Explicació del Codi
- @ParameterizedTest: Aquesta anotació indica que el mètode és un test parametritzat.
- @ValueSource: Proporciona una font de valors per al test. En aquest cas, una llista de números enters.
- testIsEven: Aquest mètode es cridarà una vegada per a cada valor proporcionat per @ValueSource.
Utilitzant Múltiples Fonts de Dades
També es poden utilitzar múltiples fonts de dades per als tests parametritzats. Aquí hi ha un exemple que utilitza @CsvSource per proporcionar múltiples conjunts de dades:
import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; public class CsvSourceExample { @ParameterizedTest @CsvSource({ "1, 2, 3", "4, 5, 9", "7, 8, 15" }) void testAddition(int a, int b, int expectedSum) { assertEquals(expectedSum, a + b); } }
Explicació del Codi
- @CsvSource: Proporciona múltiples conjunts de dades en format CSV (Comma-Separated Values).
- testAddition: Aquest mètode es cridarà una vegada per a cada conjunt de dades proporcionat per @CsvSource.
- Exercicis Pràctics
Exercici 1: Test de Multiplicació
Crea un test parametritzat que verifiqui la multiplicació de dos números. Utilitza @CsvSource per proporcionar els conjunts de dades.
Solució
import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; public class MultiplicationTest { @ParameterizedTest @CsvSource({ "2, 3, 6", "4, 5, 20", "6, 7, 42" }) void testMultiplication(int a, int b, int expectedProduct) { assertEquals(expectedProduct, a * b); } }
Exercici 2: Test de Concatenació de Strings
Crea un test parametritzat que verifiqui la concatenació de dos strings. Utilitza @CsvSource per proporcionar els conjunts de dades.
Solució
import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; public class StringConcatenationTest { @ParameterizedTest @CsvSource({ "'Hello', 'World', 'HelloWorld'", "'JUnit', '5', 'JUnit5'", "'Parameterized', 'Test', 'ParameterizedTest'" }) void testStringConcatenation(String str1, String str2, String expectedResult) { assertEquals(expectedResult, str1 + str2); } }
- Conclusió
Els tests parametritzats són una eina poderosa per millorar la cobertura de tests i reduir la duplicació de codi. En aquest tema, hem après com crear tests parametritzats utilitzant JUnit, incloent l'ús de @ValueSource i @CsvSource per proporcionar dades d'entrada. També hem vist exemples pràctics i exercicis per reforçar els conceptes apresos.
En el següent tema, explorarem com utilitzar l'anotació @ParameterizedTest per crear tests parametritzats més avançats.
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