Pruebas unitarias en C++ no manejado

Más de una vez me han preguntado sobre si es posible realizar pruebas unitarias con Visual Studio para código C++ no manejado y si entre cosas, es posible obtener la cobertura de código.

En más de un sitio ya he leído que no se puede, cosas que no es cierta.

Eso sí, cierto es que dentro de las nuevas funcionalidades que ha ido surgiendo en cada nueva versión de Visual Studio, C++ no manejado es muchas veces uno de los grandes olvidados..y muchas de las características no son soportadas para este lenguaje…pero bueno, contra esta situación poco se puede hacer.

Bien, el primer paso que vamos a hacer es crearnos nuestra primera dll de C++, a la que posteriormente le añadiremos una prueba unitaria. Yo el ejemplo lo haré con Visual Studio 2010, aunque sería igual para las versiones 2005 y 2008.

Nuevo Proyecto>Visual C++>Win32>Win32 Console Application.

image

image 

Una vez hecho esto, ya tenemos nuestra dll creada y salvo que le hayáis indicado que os lo genere vacío, tendréis un método y clase de ejemplo…Nosotros haremos una prueba unitaria sobre uno de estos métodos que se crean por defecto:

// This is an example of an exported function.
GEEKSDLL_API int fnGeeksDll(void)
{
    return 42;
}

Si esto fuera código manejado y os pusierais sobre el método y sacarais el menú contextual, os saldría una opción para crear una pruebas unitaria….acción que crearía un nuevo proyecto de Test, una clase y una primera unitaria con el esqueleto de llamada al método.

Esta acción no existe para C++ no manejado. Tenemos que crear nosotros el proyecto de Test y el TestMethod para hacer la prueba unitaria.

Aunque hay alguna otra forma de crear pruebas unitarias para C++ no manejado, considero que la opción más cómoda es usar C++/CLI a la hora de crear el proyecto de Test, ya que desde este lenguaje manejado podremos hacer llamadas a nuestro código no manejado sin mucho esfuerzo.

Add New Proyect>Visual C++>Test>TestProject

image

Al crear el proyecto de test no creada una clase de test (TestClass) y una prueba unitaria de ejemplo (TestMethod), prueba que usaremos para el ejemplo.

        [TestMethod]

        void TestMethod1()

        {

            //

            // TODO: Add test logic here

            //

        };

Por defecto, el proyecto no va a permitir hacer llamadas a código no manejado. Para permitir esta acción tenemos que ir a las propiedades del proyecto de Test, a las opciones generales y cambiar la propiedad “Common Language Runtime Support”, estableciendo su valor a “/clr”.

image

Una vez hecho esto, en el proyecto de test tenemos que añadir una referencia al proyecto a testear.

 image

Una vez hecho esto, en la clase de test, dónde tenemos nuestra prueba unitaria, tendremos que incluir el h que contiene los métodos de nuestra dll a testear, métodos a los que llamaremos desde la prueba unitaria.

#include "..GeeksDllGeeksDll.h"

Ya está, ya podemos hacer la llamada al método a testear:

        [TestMethod]
        void TestMethod1()
        {
            int expected = 42;
            int actual = fnGeeksDll();
            Assert::AreEqual(expected, actual);
        };

Haciéndolo de esta manera, con un proyecto de C++/CLI, nos podemos beneficiar del framework de pruebas unitarias de Visual Studio y tener testeados nuestros desarrollos en C++ no manejado.

Para aquellos que no conozcan lo que el framework ofrece os pongo este enlace con información.

Pero…y la cobertura?? Tengo que hacer algo especial para poder obtener la cobertura??? Pues sí, también hay que tener en cuenta una pequeña cosa.

Para poder tener cobertura, es necesario activar la opción Profile en el proyecto de C++.

Esta opción se activa en las propiedades del proyecto, dentro de las opciones avanzadas del linker.

 

image

Una vez hecho esto, activamos la cobertura de código en los settings (Local.testsettings) y volvemos a ejecutar el test unitario.

image

Eso sí, el código no se colorea en función de si el código esta cubierto por la prueba o no 🙁

Ibon Landa

bon Landa lleva más de 15 años dedicado al desarrollo de software. Durante este tiempo ha trabajado en diferentes empresas en las cuáles ha podido trabajar en diferentes entornos y tecnologías. Actualmente está focalizado principalmente en tareas de desarrollo, arquitectura, en las herramientas del ciclo de vida y en todo lo relacionado con la plataforma de Cloud Computing Microsoft Azure, área en el que ha sido reconocido como MVP. Participa de forma activa en la comunidad, escribiendo su blog, manteniendo un portal sobre Microsoft Azure y colaborando con Microsoft y grupos de usuarios en eventos de formación, talleres y giras de producto.

5 comentarios en “Pruebas unitarias en C++ no manejado”

  1. Hola.
    Es curioso, pero la opción /PROFILE no funciona con los proyectos que son librerías. ¿Alguna idea de cómo solucionarlo?
    El tema de que no se coloree el código con el coverage es un verdadero problema. ¿Sabes si lo solucionarán en el próximo service pack?

    Gracias por el artículo.

  2. Hola:
    ME gustaria saber la diferencia entre c++ no manejado y c++ manejado, he estado buscando en la web pero no han esta muy claroo, graciass…

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *