Code Tip: test parametrizados con xUnit

viernes, 18 de septiembre de 2015


Hay veces que cuando estamos haciedo test, nos encontramos duplicando test simplemente cambiando los valores a probar. Existe un concepto que se llama test parametrizados que ayuda a reducir el volumen de test a crear porque elimina la duplicación de test donde solo cambian los valores.

No todos los frameworks de test para .Net tienen esta carácteristica. Por ejemplo MSTest no lo tiene, se puede llegar a hacer algo parecido con un componente externo como un excel o algo así pero demasiado complejo para mi gusto. NUnit y xUnit si trae esta carácteristica, vamos a ver como se hace con xUnit.

Creando el proyecto

Cuando creamos un proyecto de pruebas con MSTest debe ser un tipo de proyecto especial de tipo Unit Test Project pero para xUnit un proyecto de tipo Class Library estándar es suficiente.

Añadiendo referencias

Añadimos las referencias necesarias para funcionar con xUnit.

Añadiendo xUnit

Añadimos xUnit a través de NuGet.

Añadiendo el runner de xUnit para Visual Studio

Para poder ejecutar test desde Visual Studio necesitamos añadir, a través de NuGet también, el runner de Visual Studio xunit.runner.visualstudio.

Test duplicados

Vamos a crear unos test que pueban la función string.IsNullOrWhiteSpace, necesitamos 3 test uno por cada valor posible para que devuelva true la función. Los test normales se decoran con el atributo Fact.

[Fact]
public void IsNullOrWhiteSpace_forEmptyString_ShouldReturnTrue()
{
    string value = "";

    Assert.True(string.IsNullOrWhiteSpace(value));
}

[Fact]
public void IsNullOrWhiteSpace_forWhiteSpaceString_ShouldReturnTrue()
{
    string value = " ";

    Assert.True(string.IsNullOrWhiteSpace(value));
}

[Fact]
public void IsNullOrWhiteSpace_forNull_ShouldReturnTrue()
{
    string value = null;

    Assert.True(string.IsNullOrWhiteSpace(value));
}


Tenemos 3 test muy parecidos donde lo único que cambia son los valores que se testean. El resultado de los test se ve así en el test explorer:

Test parametrizado

La idea es crear un solo test parametrizado para probar los 3 casos de prueba de antes. Los test parametrizados en xUnit se decoran con el atributo Theory y se le añade un atributo InlineData por cada caso de prueba a realizar. El test es necesario que reciba los casos de prueba por parámetro.

[Theory]
[InlineData(null)]
[InlineData("")]
[InlineData("    ")]
public void IsNullOrWhiteSpace_ShouldReturnTrue(string value)
{
    Assert.True(string.IsNullOrWhiteSpace(value));
}


Ahora con un solo método realizamos los 3 casos de prueba y eliminamos la duplicación de código. El resultado de los test se ve así en el test explorer:



Fijaros que genera 3 test y al final de cada test especifica el valor del parámetro aplicado en el test.

Concusiones

Mediante los test parametrizados se puede ahorrar bastante código y test duplicados. MStest no tiene esta característica, xUnit y NUnit si. Características como esta pueden hacer que te decantes por un framework o por otro.

No hay comentarios:

Publicar un comentario