No todos los frameworks de test son iguales, cada uno aporta un aproximación diferente a las herramientas básicas para plantear un test.

En estas últimas semanas hemos incluido, ¡por fin!, en un proyecto una capa de test unitarios y funcionales. Y a la hora de elegir el framework, entre las muchas opciones disponibles en .NET elegimos xUnit.

Una aproximación diferente

xUnit es un framework creado por los creadores de nUnit, que, utilizando toda la experiencia obtenida en el desarrollo de nUnit, han creado este nuevo (no tan nuevo) framework

Sin duda por lo que destaca xUnit, es por reducir el uso de atributos para modificar o indicar los diferentes aspectos del test, utilizando en su lugar semánticas de objetos  siempre que sea posible.

Integración con Visual Studio

Desde la versión 2012, Visual Studio puede utilizar diferentes frameworks de tests, proporcionando una experiencia integrada con cualquiera de ellos. Para xUnit podemos descargar el runner para Visual Studio 2012.

Si no tenemos Visual Studio 2012, xUnit proporciona diferentes runners para todas las necesidades, desde integrarlo con msbuild hasta un runner de consola.

Primer test con xUnit

Para crear un proyecto de test con xUnit, basta con crear un proyecto de librería de clases. A diferencia de otras frameworks en xUnit las clases de test no tienen que estar decoradas que estar decoradas con atributos, sólo los métodos de test, xUnit buscará aquellos métodos públicos decorados con el atributo [Fact] en toda la solución:

Acciones pre – post test

Siguiendo con la filosofía de utilizar semánticas de OOP allá donde sea posible, en xUnit no existen atributos para indicar acciones a ejecutar antes y después de la ejecución de cada test.

Simplemente xUnit utiliza el constructor de la clase para representar todo aquello que se debe ejecutar antes del test, y para ejecutar acciones después de su ejecución, tan sólo es necesario implementar IDisposable en la clase que contiene el test:

Lo mismo ocurre con aquellos métodos que queremos se ejecuten antes del inicio de la sesión de tests y al final de la misma, donde en otros frameworks estos metodos se decoran con atributos, xUnit representa este tipo de métodos como interfaces:

La clase del ejemplo anterior se encarga de preparar la inicialización de un cliente HTTP antes de que se inicie la ejecución de todos los tests. Utilizar esta clase en los tests es tan sencillo como implementar IUseFixture<T> en la clase de test:

La mayor ventaja de utilizar semánticas de OOP en lugar de atributos, es la sencillez con la que podemos crear elementos reutilizables entre las diferentes clases de test, podemos compartir fácilmente fixtures entre tests, con solo implementar tantos IUseFixture como necesitemos en cada clase.

Consiguiendo xUnit

xUnit esta siendo desarrollado como open source y podéis seguir el proyecto en codeplex

En Visual Studio se puede instalar utilizando los paquetes de nuget:

PM> Install-Package xunit

Hasta la próxima!