En aquest tema, aprendrem a utilitzar l'anotació @ParameterizedTest
de JUnit per crear tests parametritzats. Els tests parametritzats permeten executar el mateix test diverses vegades amb diferents conjunts de dades, la qual cosa és molt útil per verificar el comportament del codi amb diferents entrades.
Què és un Test Parametritzat?
Un test parametritzat és un test que s'executa múltiples vegades amb diferents valors d'entrada. Això permet verificar que el codi funcioni correctament per a una varietat de casos sense haver d'escriure múltiples tests individuals.
Configuració de @ParameterizedTest
Per utilitzar @ParameterizedTest
, necessitem importar les següents classes:
import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource;
Exemple Bàsic amb @ValueSource
L'anotació @ValueSource
permet especificar un conjunt de valors literals que es passaran al test. A continuació, es mostra un exemple bàsic:
import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; import static org.junit.jupiter.api.Assertions.assertTrue; public class ParameterizedTestExample { @ParameterizedTest @ValueSource(ints = {1, 2, 3, 4, 5}) void testWithValueSource(int argument) { assertTrue(argument > 0); } }
Explicació del Codi
- Importacions: Importem les classes necessàries per a
@ParameterizedTest
i@ValueSource
. - Definició del Test: Utilitzem l'anotació
@ParameterizedTest
per indicar que aquest és un test parametritzat. - @ValueSource: Especifica un conjunt de valors literals (en aquest cas, enters) que es passaran al test.
- Mètode de Test: El mètode
testWithValueSource
s'executarà cinc vegades, una per cada valor especificat a@ValueSource
.
Utilitzant @CsvSource
L'anotació @CsvSource
permet passar múltiples arguments al test en format CSV (valors separats per comes). A continuació, es mostra un exemple:
import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; import static org.junit.jupiter.api.Assertions.assertEquals; public class CsvSourceExample { @ParameterizedTest @CsvSource({ "1, 1", "2, 4", "3, 9", "4, 16", "5, 25" }) void testWithCsvSource(int input, int expected) { assertEquals(expected, input * input); } }
Explicació del Codi
- Importacions: Importem les classes necessàries per a
@ParameterizedTest
i@CsvSource
. - Definició del Test: Utilitzem l'anotació
@ParameterizedTest
per indicar que aquest és un test parametritzat. - @CsvSource: Especifica un conjunt de valors en format CSV. Cada línia representa un conjunt d'arguments que es passaran al test.
- Mètode de Test: El mètode
testWithCsvSource
s'executarà cinc vegades, una per cada conjunt de valors especificat a@CsvSource
.
Utilitzant @MethodSource
L'anotació @MethodSource
permet utilitzar un mètode que retorna un Stream
, Iterable
o Iterator
de valors que es passaran al test. A continuació, es mostra un exemple:
import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; import java.util.stream.Stream; import static org.junit.jupiter.api.Assertions.assertTrue; public class MethodSourceExample { @ParameterizedTest @MethodSource("stringProvider") void testWithMethodSource(String argument) { assertTrue(argument.length() > 0); } static Stream<String> stringProvider() { return Stream.of("apple", "banana", "cherry"); } }
Explicació del Codi
- Importacions: Importem les classes necessàries per a
@ParameterizedTest
i@MethodSource
. - Definició del Test: Utilitzem l'anotació
@ParameterizedTest
per indicar que aquest és un test parametritzat. - @MethodSource: Especifica el nom del mètode que proporcionarà els valors per al test.
- Mètode de Test: El mètode
testWithMethodSource
s'executarà tres vegades, una per cada valor retornat pel mètodestringProvider
. - Mètode Proveïdor: El mètode
stringProvider
retorna unStream
de cadenes de text que es passaran al test.
Exercici Pràctic
Exercici
Crea un test parametritzat que verifiqui si una cadena de text és un palíndrom. Utilitza @CsvSource
per proporcionar diferents cadenes de text i els seus resultats esperats (true o false).
Solució
import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; import static org.junit.jupiter.api.Assertions.assertEquals; public class PalindromeTest { @ParameterizedTest @CsvSource({ "madam, true", "racecar, true", "hello, false", "level, true", "world, false" }) void testIsPalindrome(String input, boolean expected) { assertEquals(expected, isPalindrome(input)); } boolean isPalindrome(String str) { String reversed = new StringBuilder(str).reverse().toString(); return str.equals(reversed); } }
Explicació del Codi
- Definició del Test: Utilitzem l'anotació
@ParameterizedTest
per indicar que aquest és un test parametritzat. - @CsvSource: Especifica un conjunt de cadenes de text i els seus resultats esperats.
- Mètode de Test: El mètode
testIsPalindrome
s'executarà cinc vegades, una per cada conjunt de valors especificat a@CsvSource
. - Mètode Auxiliar: El mètode
isPalindrome
verifica si una cadena de text és un palíndrom.
Conclusió
En aquest tema, hem après a utilitzar l'anotació @ParameterizedTest
de JUnit per crear tests parametritzats. Hem vist exemples amb @ValueSource
, @CsvSource
i @MethodSource
, i hem practicat amb un exercici per verificar si una cadena de text és un palíndrom. Els tests parametritzats són una eina poderosa per verificar el comportament del codi amb diferents conjunts de dades de manera eficient.
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