<div class="page"> <div class="cover text-center"> <img class="mx-auto" src=/itb/images/logo_mislata.png alt="logo"> # Tests parametritzats <div class="text-end fit-content ms-auto my-3 mt-auto pt-3"> <p><strong>Autor:</strong> Joan Puigcerver Ibáñez</p> <p><strong>Correu electrònic:</strong> j.puigcerveribanez@edu.gva.es</p> <p><strong>Curs:</strong> 2024/2025</p> </div> <div> <p class="fw-bold mb-0">Llicència: BY-NC-SA</p> <p class="d-none d-md-block">(Reconeixement - No Comercial - Compartir Igual)</p> <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.ca" target="_blank"> <img class="mx-auto" src="/itb/images/license.png" alt="Licence"/> </a> </div><!--license--> </div><!--cover--> </div><!--page--> {:toc} ## Introducció Els __tests parametritzats__ és una prova que es executada diverses vegades amb diferents dades d'entrada (paràmetres). Aquestes proves són útils quan vols provar diferents casos de prova que tenen la mateixa estructura. Els tests parametritzats formen part de l'extensió `junit-params`. Per poder utilitzar tests parametritzats, cal indicar d'on s'obtindran les dades. Les dades poden ser obtingudes de diferents maneres, utilitzant diferents `Sources`. ### Sources: @ValueSource [`@ValueSource`](https://junit.org/junit5/docs/5.4.1/api/org/junit/jupiter/params/provider/ValueSource.html) és la manera més bàsica per passar-li dades a un test parametritzat. S'utilitza per passar un únic argument a cada test. Els valors poden ser dades `primitives` o qualsevol tipus que es puga convertir a un `Object`. ```java @ParameterizedTest @ValueSource(ints = {2, 4, 6, 8, 10}) @DisplayName("Parameterized Test with ValueSource") public void parameterizedValueSourceTest(int number) { assertEquals(0, number % 2); } ``` ### Sources: @NullSource i @EmptySource `@NullSource` s'utilitza per passar el valor `null`. [`@EmptySource`](https://junit.org/junit5/docs/5.4.1/api/org/junit/jupiter/params/provider/EmptySource.html) s'utilitza per passar el valor que es considera buit en el tipus de dades especificat. Pot ser utilitzat en la classes: - `String` - `List` - `Set` - `Map` - Primitive and Object arrays (`int[]`, `String[]`) ```java @ParameterizedTest(name="\"{0}\"") @NullSource @EmptySource @ValueSource(strings = { " ", " ", " \n " }) void nullEmptyAndBlankStrings(String text) { assertTrue(text == null || text.trim().isEmpty()); } ``` ### Sources: @CsvSource [`@CsvSource`](https://junit.org/junit5/docs/5.4.1/api/org/junit/jupiter/params/provider/CsvSource.html) s'utilitza per passar multiples arguments a un test parametritzat, separats per comes. Els valors, sols poden ser __tipus primitius__ (`int`, `double`, ...) o `String`. L'exemple anterior es podria provar de la següenta manera: ```java @ParameterizedTest(name="{0} + {1} = {2}") @CsvSource({ "1,1,2", "2,2,4", "3,3,6", "4,4,8", "5,5,10", "6,6,12", "7,7,14", "10,90,100" }) @DisplayName("Parameterized Test with CsvSource") public void parameterizedCsvSourceTest(int left, int right, int expected) { assertEquals(expected, Math.addExact(left, right)); } ``` ### Sources: @MehodSource [`@CsvSource`](https://junit.org/junit5/docs/5.4.1/api/org/junit/jupiter/params/provider/CsvSource.html) s'utilitza per passar multiples arguments a un test parametritzat, obtinguts a partir d'un __mètode estàtic__. Aquesta opció és molt versàtil, ja que permet passar multiples arguments de qualsevol tipus (objectes inclosos). El mètode proveidor de dades ha de retornar un `Stream<Arguments>` o qualsevol classe que puga convertir-se a aquest tipus, com `Collection` o `List`. ```java @ParameterizedTest(name="[{index}] {0} + {1} = {2}") @MethodSource("numberToSum") @DisplayName("Parameterized Test with MehodSource") public void parameterizedMehodSourceTest(int left, int right, int expected) { assertEquals(expected, Math.addExact(left, right)); } private static List<Arguments> numberToSum() { ArrayList<Arguments> args = new ArrayList<>(); for (int i = 1; i <= 10; i++) { args.add(arguments(i, i, i + i)); } return args; } ```