Your Web News in One Place

Help Webnuz

Referal links:

Sign up for GreenGeeks web hosting
November 14, 2022 08:00 am GMT

JUnit Cmo parametrizar un test

JUnit cuenta con una serie de funcionalidades orientadas a ejecutar tests en nuestra aplicacin.
Una de estas funcionalidades son los tests parametrizados, que nos permiten poder declarar los valores que necesitemos fuera del propio test.

Para entender su funcionamiento supongamos que nuestra aplicacin cuenta con un validador de cdigos bancarios IBAN, que comprueba si un valor determinado cumple el patrn esperado en dichos cdigos.

Los cdigos IBAN utilizados en esta publicacin han sido generados mediante la web http://randomiban.com/?country=Spain

class IbanValidator {    // Regex pattern that an Iban must match    static final String PATTERN = "^ES[0-9]{2}[0-9]{20}$";    boolean isValid(String iban) {        return iban.matches(PATTERN);    }    }

Ahora supongamos que tenemos un test sobre esta clase con la siguiente forma:

@Test@DisplayName(value = "Check validity of IBAN")void check_validity_iban() {    IbanValidator validator = new IbanValidator();    assertTrue(validator.isValid("ES7921000813610123456789"));}// Test passed: 1 of 1 

Como podemos ver, en este ejemplo estamos comprobando nicamente un valor concreto para el cdigo IBAN, por lo que el test estara sesgado.
Podramos enfrentarnos a un falso positivo, ya que si desconocemos la implementacin del mtodo isValid() podra ser que siempre devuelva true.

Para resolver este problema, sera mejor probar la validacin con diferentes valores de IBAN. Nuestro primer instinto podra ser copiar el test N veces, tantas como cdigos IBAN diferentes queramos probar, pero JUnit nos facilita este trabajo mediante el uso de la anotacin @ParameterizedTest.

@ParameterizedTest

Para indicar el origen de los parmetros de un test parametrizado, debemos hacer uso de otras anotaciones como:

  1. @ValueSource: permite indicar los valores directamente en la anotacin.
  2. @MethodSource: permite hacer referencia a un mtodo proveedor que contiene los parmetros.

@ValueSource

Utilizando esta anotacin, podemos declarar los valores del parmetro de nuestro test:

import org.junit.jupiter.params.ParameterizedTest;import org.junit.jupiter.params.provider.ValueSource;@ParameterizedTest  // <- Utilizamos la anotacin @ParameterizedTest en lugar de @Test@ValueSource(strings = {"ES7921000813610123456789", "ES1600755981885574867892"}) // <- Indicamos en la anotacin @ValueSource el tipo de parmetro (en este caso String) seguido de los valores que queremos probar@DisplayName(value = "Check validity of IBAN")void check_validity_iban(String iban) { // <- Indicamos en el test el tipo y nombre del nuestro parmetro    IbanValidator validator = new IbanValidator();    assertTrue(validator.isValid(iban));}// Test passed: 2 of 2 

Una de las limitaciones que tiene @ValueSource es que nicamente podemos hacer uso de un parmetro para el test, y en ocasiones esto puede ser insuficiente.
Para resolver este problema debemos hacer uso de la anotacin alternativa @MethodSource.

@MethodSource

Aplicando esta anotacin al mismo ejemplo, el test quedara de la siguiente forma:

import org.junit.jupiter.params.ParameterizedTest;import org.junit.jupiter.params.provider.Arguments;import org.junit.jupiter.params.provider.MethodSource;private static Stream<Arguments> testIbanValidityParams() { // <- Creamos un mtodo proveedor donde indicamos     return Stream.of(        Arguments.of("ES7921000813610123456789"),        Arguments.of("ES1600755981885574867892")    )}@ParameterizedTest@MethodSource(value = "testIbanValidityParams") // <- Indicamos en la anotacin @MethodSource el nombre del mtodo que contiene los parmetros@DisplayName(value = "Check validity of IBAN")void check_validity_iban(String iban) {    IbanValidator validator = new IbanValidator();    assertTrue(validator.isValid(iban));}// Test passed: 2 of 2 

Como podemos ver, lo nico que necesitamos es crear un mtodo esttico que devuelva un Stream<Arguments>, y estos sern utilizados por el test parametrizado.
Algunas de las ventajas de esta anotacin frente a @ValueSource son:

  1. Al extraer los parmetros a un mtodo, podemos documentar mejor el test, ya que podemos comentar en el mtodo proveedor informacin sobre cada parmetro.
  2. El mtodo Arguments.of() espera que indiquemos 1 o N parmetros, por lo que podemos aumentar los casos de uso de nuestro test realizando una simple modificacin:
/** * Parameters: * 1. String - An example of an IBAN code to be validated. * 2. boolean - The expected validation */private static Stream<Arguments> testIbanValidityParams() {    return Stream.of(        Arguments.of("ES7921000813610123456789", true), // <- Creamos un nuevo parmetro booleano con la respuesta esperada        Arguments.of("ES1600755981885574867892", true),        Arguments.of("ESX921000813610123456789", false),        Arguments.of("E81600755981885574867892", false)    )}@ParameterizedTest@MethodSource(value = "testIbanValidityParams")@DisplayName(value = "Check validity of IBAN")void check_validity_iban(String iban, boolean expected) {   // <- Indicamos el nuevo parmetro 'expected'    IbanValidator validator = new IbanValidator();    assertEquals(actual, expected); // <- Modificamos la afirmacin de 'assertTrue' a 'assertEquals'}// Test passed: 4 of 4 

En esta ltima versin del test se puede apreciar lo fcil que sera incluir un nuevo caso de uso para la validacin, as como nuevos parmetros para comprobar en el test.


Original Link: https://dev.to/gekyzo/junit-como-ejecutar-un-test-con-parametros-4cp3

Share this article:    Share on Facebook
View Full Article

Dev To

An online community for sharing and discovering great ideas, having debates, and making friends

More About this Source Visit Dev To