domingo, 2 de febrero de 2014

Introducción a NUnit (I)

En el proceso de desarrollo de software, una parte muy importante del mismo son las pruebas unitarias. Las pruebas unitarias comprueban la corrección del código. Una prueba unitaria es código que comprueba la corrección de otro código y sirve para contestar a la pregunta ¿Hace mi código “correctamente” lo que se comprometió a hacer?

Con independencia de si te ha gustado o no la definición de prueba unitaria (a muchos nos les gusta hablar de corrección sino del grado de confianza en tu código que te reportan las pruebas), en esta serie de posts me centraré exclusivamente en la utilización de NUnit. El cómo, cuándo y dónde escribir una prueba unitaria… es harina de otro costal.

En este primer post mi intención es poner cara y ojos a NUnit. Ver qué es, cómo se ejecuta y cómo se integra con Visual Studio.

NUnit es un framework de unit testing de testing (ya sea pruebas unitarias, de integración o de cualquier otro tipo… gracias @lantoli por la corrección), muy utilizado en el mundo .NET y ampliamente soportado por herramientas de terceros. Válido para cualquier lenguaje .NET, está escrito en C# y es Open Source. Aunque a día de hoy ha sido complemente reescrito haciendo hincapié en características propias y novedosas de C#, inicialmente fue un port de JUnit (el primer framework de unit testing).

A propósito de esta amalgama de nombres (NUnit, JUnit, Xunit, etc.) puedes leerte este artículo de Martin Fowler que explica qué significa Xunit y el nacimiento de JUnit y NUnit. En mi caso, la confusión vino por confundir Xunit (nombre derivado de JUnit para hacer mención a la familia de frameworks de unit testing) con xUnit.Net, un nuevo framework del creador original de NUnit.

Como queda claro según lo expuesto, NUnit no es el único framework disponible de unit testing. De hecho son muchos y seguro todos ellos con un buen número de seguidores y detractores. Al final está claro que lo que cuenta es escribir buenas pruebas. El utilizar uno u otro framework debería ser algo secundario.

Para disponer de NUnit, bastará con descargar la última versión desde su página oficial e instalarlo a través de un asistente muy sencillo. Una vez instalado, tenemos a nuestra disposición tanto el ensamblado necesario para agregarlo como referencia a un proyecto de Visual Studio (nunit.framework.dll), así como un par de ejecutables (nunit.exe y nunit-console.exe) que actúan como “test runners”. Un test-runner es una herramienta que entiende el framework de testing y es capaz de ejecutar los tests.

Para escribir nuestra primeras pruebas unitarias con NUnit tiraré del manido ejemplo de una calculadora.

    class Calculadora

    {

        public int Sumar(int num1, int num2)

        {

            return num1 + num2;

        }

    }

Una vez tenemos el código que queremos testear, nuestro siguiente paso será agregar NUnit al proyecto. Para ello  bien podemos agregar manualmente una referencia al ensamblado nunit.framework.dll desde el directorio de instalación de NUnit, o bien agregar el paquete NUnit a través de Nuget. Sea cual sea la forma el resultado es siempre el mismo: una referencia a nunit.framework.dll. Yo personalmente prefiero agregar NUnit vía paquete Nuget porque si hay una actualización del paquete (es decir, una actualización de NUnit) tarde o temprano seré consciente de ello a través de Visual Studio. Además, y como veremos más tarde, no siempre es necesario instalar NUnit (en último instancia lo único que necesitamos para escribir nuestras pruebas es el ensamblado nunit.framework.dll).

NUnit se basa en atributos. Para decorar un método como un test simplemente tenemos que añadirle el atributo Test.

    class CalculadoraTest

    {

        [Test]

        public void Sumar()

        {

            var calculadora = new Calculadora();

            var resultado = calculadora.Sumar(1, 2);

            Assert.AreEqual(3, resultado);

        }

    }

Para ejecutar las pruebas unitarias tenemos varias posibilidades:

  • Ejecutar uno de los test runner que instaló NUnit (esto claro está, si optamos por instalar NUnit).
  • Instalar el plugin NUnit Test Adapter para integrar NUnit dentro de Visual Studio y poder así ejecutar las pruebas desde el mismo IDE.
  • Utilizar ReSharper para, de nuevo, ejecutar las pruebas también desde la comodidad del IDE.

Otra opción muy interesante es la que comenta Fernando Pérez (@ferpega_) en los comentarios, que es descargar el paquete de Nuget “NUnit Test Adapter” sin tener que instalarlo como un complemento. Además de hacer la misma función que el complemento, ya no será necesario tener que instalarlo en todos los equipos de desarrollo e incluso en un escenario de CI se descargará automáticamente y lanzará los tests. Gran aporte, Fernando!

image

Yo personalmente no he probado esa solución para integrar NUnit en un servidor de CI y por el contrario he optado por agregar el paquete NUnit.Runners, que creará un fichero package.config en la carpeta /nuget, es decir, el paquete no está asociado a ningún proyecto en particular. De este modo y hasta nuevo aviso, es necesario agregarlo también a algún proyecto de la solución para que se descargue automáticamente al restaurar paquetes en el servidor de CI (y para ello hay que editar manualmente algún package.config de un proyecto de la solución y agregar a mano la dependencia)… un poco raro, lo sé!

Si hemos instalado NUnit podemos utilizar la herramienta gráfica nunit.exe. La gran ventaja de esta herramienta es que podemos manualmente seleccionar que tests queremos ejecutar. Además, al compilar de nuevo nuestro proyecto desde Visual Studio, nunit-exe detectará el cambio y recargará qué pruebas hay disponibles.

image

También podemos utilizar nunit-console.exe que, por línea de comandos, recibirá los parámetros necesarios para ejecutar los test que le indiquemos. Por defecto, nunit-console.exe creará un fichero TestResult.xml en el directorio de trabajo con los resultados de las pruebas.

Si no hemos instalado NUnit (esto es que hemos agregado NUnit al proyecto vía Nuget) o no queremos ejecutar las pruebas desde una herramienta externa a Visual Studio porque, por ejemplo, queremos depurar nuestras pruebas, podemos instalar el anteriormente citado plugin NUnit Test Adapter que se integra dentro de Visual Studio y nos da una experiencia de uso igual a la que tendríamos si hubiéramos elegido el framework MSTest (el propio de Microsoft). En realidad esto es posible porque a partir de VS 2012, se ha añadido soporte para frameworks de unit testing de terceros.

Después de instalar NUnit Test Adapter, NUnit estará totalmente integrado en Visual Studio y podremos ejecutar/depurar los tests desde la ventana Test Explorer (disponible en todas las versiones de Visual Studio, incluida la Community Edition). Por otro lado, también podremos ahora utilizar la cobertura de código incluida en Visual Studio sin tener que depender de herramientas de terceros como NCover (aunque la cobertura de código sólo está disponible en las versiones Premium y Ultimate de Visual Studio).

image

Por último, si tenemos Resharper instalado, no tendremos que instalar ninguna otra herramienta puesto que Resharper reconoce a NUnit y nos brindará la posibilidad de ejecutar/depurar los tests de forma muy amigable y desde el propio IDE. Además, Resharper incorpora 2 ventanas relativas a pruebas unitarias que nos darán información de los test descubiertos y del resultado de la ejecución de los tests.

image

image

Ahora que ya has visto qué es NUnit, como agregarlo a un proyecto y cómo ejecutarlo, en siguientes posts indagaremos más en que atributos es importante conocer, que modelos de ejecución propone NUnit y como extenderlo para sacarle el mayor jugo posible.

Mas posts de esta serie:

Un saludo!

9 comentarios:

  1. Sergio ¿Por qué has elegido NUnit y no cualquiera de los otros que has comentado? ¿Ventajas?

    ResponderEliminar
  2. Hola Mookie,
    La verdad es que he elegido NUnit porque parece una opción muy extendida en el mundo .NET. Me ha gustado que es un proyecto vivo (algo que siempre es muy importante) y que tiene buena documentación. Si hablamos de ventajas, ahora mismo no te sabría decir. Mas allá de ventajas/desventajas me gustaría transmitir conceptos. Esto es como elegir un contenedor de IoC ¿AutoFac, Unity, Ninject? Al final (mejor o peor) todos hacen casi lo mismo, lo importante es entender porqué quieres DI.
    De todas formas, ahora mismo parece que el framework más valorado es xUnit.Net http://xunit.codeplex.com/. Cuando pueda (y al hilo de los posts) intentaré mostrar similitudes con otros frameworks (aunque eso sí, no será muy exhaustiva la comparación).
    Un saludo.

    ResponderEliminar
  3. Como dice Sergio, son todos más o menos iguales, pero el framework "de moda" en .NET es Fixie que se basa todo en convenciones y no hay que andar poniendo atributos en las clases (que conste que no lo he probado):

    https://github.com/plioi/fixie

    ResponderEliminar
  4. Hola Juanma,
    Gracias por la info, lo voy a mirar.
    Está claro que las convenciones están de moda (p. ej. ASP.NET MVC). Facilitan la toma de decisiones sobre dónde y cómo escribir las cosas. Lo único que me echa para atrás es la integración que pueda tener con herramientas de terceros (es uno de los motivos por los que optamos en la empresa por NUnit)
    Un ejemplo de integración más es Selenium, del que @MookieFumie acaba de escribir un post en su blog http://mookiefumidev.wordpress.com/2014/02/06/introduccion-a-selenium-automatizar-pruebas/
    Gracias por comentar!

    ResponderEliminar
  5. Hola Sergio,

    si yo tuviese que quedarme con un framework de testing para .net, también me quedaría con NUnit. He mirado en varias ocasiones xUnit, pero aunque hay una o dos cosas que me gustan, hay otras que no me convencen.

    Para mi, NUnit lo tiene todo y aunque quedó un poco abandonado (cuando se inició xUnit), hace ya un tiempo ha revivido con renovada fuerza.

    Al hilo de tu post y ya que hablamos de los "tests runners", es interesante añadir que hay paquete de Nuget con los Tests Runners: "NUnit Test Adapter for VS2012 and VS2013".

    Con ellos, ya no necesitas instalar ninguna extensión para integrar Nunit en el runner de Visual Studio. Simplemente añades el paquete de Nuget y a funcionar. Los compañeros que compartan codigo contigo ya no tienen que instalar nada y los tests pasarán como por "arte de magia". :-)

    Pero no solo eso, si usas un servidor de Integración Continua, tampoco tienes ya que instalar nada en él, pues el CI se bajará el paquete y ejecutará los tests de NUnit sin ningún problema.

    Saludos.

    PS: Voy a mirar Fixie :-)

    ResponderEliminar
    Respuestas
    1. Qué bueno! Lo acabo de probar y va de maravilla. Gracias por el aporte y por tu opinión!
      Actualizo post con mención :-)
      Un saludo.

      Eliminar
  6. Sergio, después de tu experiencia con los test unitarios ¿por cual de las tres posiblidades te decantas? (Test runner que instaló NUnit, NUnit Test Adapter o ReSharper)




    ResponderEliminar
    Respuestas
    1. Sin dudarlo con R#
      Tengo que reconocer que R# me genera dependencia de una herramienta de pago, pero hoy por hoy no concibo VS sin ella. Ejecutar los test es muy sencillo (también lo es con NUnit Test Adapter). Descarto los runners de NUnit porque para depurar es más complicado y además están fuera del entorno.
      Lo dicho, Resharper al poder!! :)

      Eliminar
  7. I really appreciate information shared above. It’s of great help. If someone want to learn Online (Virtual) instructor lead live training in Nunit, kindly contact us http://www.maxmunus.com/contact
    MaxMunus Offer World Class Virtual Instructor led training Nunit . We have industry expert trainer. We provide Training Material and Software Support. MaxMunus has successfully conducted 100000+ trainings in India, USA, UK, Australlia, Switzerland, Qatar, Saudi Arabia, Bangladesh, Bahrain and UAE etc.
    For Demo Contact us:
    Name : Arunkumar U
    Email : arun@maxmunus.com
    Skype id: training_maxmunus
    Contact No.-+91-9738507310
    Company Website –http://www.maxmunus.com



    ResponderEliminar