Hace poco os enseñaba el framework xUnit con el que hemos estado creando nuestros tests en las últimas semanas. Sin embargo, no comenté nada sobre el la librería que acompaña a xUnit, xunit.extensions.

En esta librería podemos encontrar distintas utilidades que cubren escenarios comunes dentro de los tests, gestión de identidades, transacciones y, seguramente la más interesante, data theories.

¿Qué es una data theory?

Una Data Theory es un test que se ejecuta tantas veces como filas disponibles existen en un origen de datos determinado. Las Data Theory son de mucha ayuda para crear test donde es necesario probar su comportamiento en diferentes escenarios o conjuntos.

Creando una data theory

Para crear una Data Theory, es necesario indicar en un atributo el origen de datos que se utilizará, para ello es valido cualquier atributo que herede de DataAttribute, como puede ser [InlineData]. Por último, en lugar de utilizar el atributo [Fact] como en los tests normales, utilizamos [Theory]:

En este ejemplo sencillo, el test se ejecutará por cada uno de las filas introducidas con InlineData.  xUnit asocia en base al orden los parámetros del test a sus correspondientes “columnas” en las filas del origen de datos, por tanto el proceso es transparente para nosotros.

Al ejecutar una data theory veremos en la mayoría de runners un tests con múltiples ejecuciones, xUnit informa el resultado de cualquiera de las ejecuciones:

Theory Execution

Posibles orígenes de datos

xUnit.extensions incluye varias implementaciones del atributo Data que se pueden utilizar en los tests según las necesidades:

DataAdapterDataAttribute
ExcelDataAttribute
InlineDataAttribute
OleDbDataAttribute
SqlServerDataAttribute
PropertyDataAttribute
ClassDataAttribute

Y mediante el atributo ClassData cualquier origen de datos que queramos es posible, con sólo crear una clase que implemente IEnumerable<object[]>:

Para usar la clase en cualquiera de los test tan sólo hay que utilizar el atributo ClassData indicando el tipo de la clase que hace de origen de datos:

Una mejora para las Data Theories

En los ejemplos anteriores hemos visto como utilizar las Data Theories. Si lo probáis os habréis fijado que xUnit asigna el valor a los parámetros por orden, independientemente del nombre de éstos. En el caso de utilizar un origen de datos de clase, además, nos vemos obligados a devolver un array de object por cada fila dentro de una colección.

Esto hace que sea fácil cometer errores, por no recordar el orden correcto de los parámetros o haberlos intercambiado de lugar. ¿No sería genial si pudiéramos asociar los parámetros directamente por nombre o incluso reutilizar las clases del modelo que representen los datos a probar?

Yo también lo creo, así que para eso cree la librería xUnit.TypedClassData. Esta librería permite crear Data Theories tipadas, que se asocian a los parámetros por nombre o, en caso de que este coincida con el tipo de la Data Theory, directamente.

Por ejemplo, podemos crear una Data Theory a partir de un modelo y asociarlo a los parámetros, por nombre o tipo:

Otro escenario habitual es que estemos construyendo un modelo especifico para el test y no queramos crear una clase de modelo que lo represente. La librería permite para estos casos utilizar tipos dinámicos:

]

Obteniendo xUnit.TypedClassData

El código fuente de la librería esta disponible en mi cuenta de GitHub. Clonad, pintad y coloread, y utilizarlo, si encontráis cualquier bug o mejora no dudéis en comentarlo.

Para utilizarla más fácilmente, hay un paquete de nuget publicado, podeis descargarlo o instalarlo desde la consola:

PM> Install-Package xUnit.TypedClassData

 

Hasta la próxima!