Els tests parametritzats són una característica poderosa de JUnit que permet executar el mateix test diverses vegades amb diferents dades d'entrada. Això és especialment útil quan es vol provar una funció amb múltiples conjunts de dades sense haver de duplicar el codi del test.
Conceptes Clau
- Reutilització del Codi de Test: Els tests parametritzats permeten reutilitzar el mateix codi de test per a diferents conjunts de dades, reduint la duplicació i millorant la mantenibilitat.
- Cobertura de Casos de Test: Amb els tests parametritzats, es poden cobrir més casos de test amb menys codi, assegurant que la funció es comporti correctament amb una varietat de dades d'entrada.
- Estructura del Test: Els tests parametritzats en JUnit es defineixen utilitzant l'anotació
@ParameterizedTest
i una font de dades, com ara@ValueSource
,@CsvSource
,@MethodSource
, etc.
Exemples Pràctics
Exemple 1: Utilitzant @ValueSource
L'anotació @ValueSource
permet passar un conjunt de valors literals al test.
import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; import static org.junit.jupiter.api.Assertions.assertTrue; public class ValueSourceTest { @ParameterizedTest @ValueSource(ints = {1, 2, 3, 4, 5}) void testWithValueSource(int argument) { assertTrue(argument > 0 && argument < 6); } }
Explicació:
@ParameterizedTest
: Indica que aquest és un test parametritzat.@ValueSource(ints = {1, 2, 3, 4, 5})
: Proporciona un conjunt de valors literals (en aquest cas, enters) que es passaran al test.testWithValueSource(int argument)
: El test es cridarà una vegada per a cada valor proporcionat per@ValueSource
.
Exemple 2: Utilitzant @CsvSource
L'anotació @CsvSource
permet passar múltiples valors en format CSV (Comma-Separated Values).
import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; import static org.junit.jupiter.api.Assertions.assertEquals; public class CsvSourceTest { @ParameterizedTest @CsvSource({ "1, 1", "2, 4", "3, 9", "4, 16", "5, 25" }) void testWithCsvSource(int input, int expected) { assertEquals(expected, input * input); } }
Explicació:
@CsvSource
: Proporciona un conjunt de valors en format CSV.testWithCsvSource(int input, int expected)
: El test es cridarà una vegada per a cada conjunt de valors proporcionat per@CsvSource
.
Exercici Pràctic
Exercici 1: Test de Funció de Factorial
Escriu un test parametritzat per a una funció que calcula el factorial d'un nombre.
Funció a Provar:
public class MathUtils { public static int factorial(int n) { if (n < 0) throw new IllegalArgumentException("Number must be non-negative"); int result = 1; for (int i = 1; i <= n; i++) { result *= i; } return result; } }
Test Parametritzat:
import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; import static org.junit.jupiter.api.Assertions.assertEquals; public class MathUtilsTest { @ParameterizedTest @CsvSource({ "0, 1", "1, 1", "2, 2", "3, 6", "4, 24", "5, 120" }) void testFactorial(int input, int expected) { assertEquals(expected, MathUtils.factorial(input)); } }
Solució:
@CsvSource
: Proporciona els valors d'entrada i els resultats esperats per a la funció de factorial.testFactorial(int input, int expected)
: El test comprova que la funciófactorial
retorna el valor esperat per a cada entrada.
Conclusió
Els tests parametritzats són una eina essencial per a qualsevol desenvolupador que vulgui assegurar-se que el seu codi funcioni correctament amb una varietat de dades d'entrada. Utilitzant anotacions com @ValueSource
i @CsvSource
, es poden escriure tests més eficients i mantenibles. En el proper tema, explorarem com crear tests parametritzats més complexos utilitzant altres fonts de dades.
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