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
