martes, 5 de abril de 2011

SharpTestEx extensiones para hacer las pruebas unitarias más alegres

 

Cuando hacemos mucha prueba unitaria (Unit Test) nos encontramos a menudo con tareas similares como evaluar si un número está dentro de un rango, si una colección contiene cierta cantidad de ítems, y cosas así para las cuales nuestro amado .NET Framework no está dotado de funciones ya listas para usar “out of the box” sino más bien tenemos que hacer algunos “Helpers” y cosas así para poder probar más felizmente.

SharpTestEx

El amigo Fabio Maulo en el tiempo que le queda siendo el project leader de NHibernate, manteniendo su propio framework para mapeos de NHibernate, ConfORM, trabajar y otras cosas, se hizo un rato y se escribió un conjunto de métodos de extensión para ampliar las funcionalidades del Framework. :)

Básicamente son métodos de extensión que extienden la clase object, con lo cual con agregar la referencia a la única DLL de SharpTestEx ya contamos con toda su potencia, que nos pemite hacer cosas como esta:

Sintáxis fluyente y auto-descriptiva

[TestMethod]
public void TestMethod1()
{
    var texto = "mi vieja mula ya no es lo que era";

    texto.Should().Contain("mula");
}

Notemos que el objeto texto (que no es más que un string) ahora tiene un método Should() que indica que debería cumplir concierta condición, en este caso se leería

texto debería contener “mula”

bien descriptivo, con esta sintáxis ya está listo el test, si la condición no se cumple SharpTestEx lanza una bonita excepción que además nos dice exáctamente qué pasó, mágico.

Potencia por todos lados

SharpTestEx tiene un arsenal de métodos que nos facilitan la vida cada día, Fabio es un tipo que programa mucho y sabe mucho qué necesita un programador a la hora de probar. Sino miren las estadísticas de Fabio en Ohloh.

public void TestMethod2()
{
    var valorBoleano = false;

    valorBoleano.Should().Be.False();
}

Otro ejemplo de la rica sintáxis, lo interesante de que el código sea quien describe lo que va a pasar en lugar de agregar un pila de comentarios es que cuando cambiemos el código para que se comporte de otra manera ya tenemos la auto-documentación actualizada, por lo menos en mi experiencia los comentarios si son muchos suelen quedar obsoletos, pero es una opinión personal.

public void TestMethod()
{
    var valorNumerico = 110;
    valorNumerico.Should().Be.GreaterThanOrEqualTo(100);
}

Otro ejemplo muy claro, el método GreaterThanOrEqualTo nos soluciona unos cuantos problemas si  quisiéramos hacerlo a mano.

public void TestMethod()
{
    var listaEnteros = new[] { 1, 2, 3 };

    listaEnteros.Should()
        .Not.Be.Null()
        .And.Not.Be.Empty()
        .And.Not.Have.SameSequenceAs(new[] { 3, 2, 1 })
        .And.Have.UniqueValues();

    listaEnteros.Should().Contain(2).And.Not.Contain(4);

    listaEnteros.Should().Contain(3).And.Not.Have.Count.LessThan(2);
}

Este ejemplo copiado del sitio de Codeplex nos muestra la versatilidad para verificar IEnumerables<T> (colecciones) y que además podemos encadenar validaciones, más que mágico!

Detalles finales

Lo único que me queda decir es que sin duda SharpTestEx es una herramienta que siempre nos va a facilitar las cosas, un detalle es que hay un assembly (DLL) según el framework de Unit Testing que usemos, por ejemplo yo usé MSTest el que viene integrado dentro de Visual Studio y agregué el using al principio de los test para “ver” los métodos de extensión.

using SharpTestsEx;

Nada más, nos vemos la próxima.

3 comentarios:

Eric# dijo...

Muy buena la libreria. Podes darle una mirada a Fluent Assertions http://fluentassertions.codeplex.com/ y tomar buenas ideas de ahi ya que esta bastante madura. O podrian unirse y potenciar.

Leonardo Micheloni dijo...

Gracias Eric, ya conocía la librería, me gusta más #TestEx creo que estaría bueno algo con un poco de cada una. Saludos, Leonardo.

Edson VIzcaino dijo...

Gracias Por la Info! No conocía esta librería pero me ha resultado de gran ayuda en el desarrollo de mi tesis.

Saludos.