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.
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
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”.
Una vez hecho esto, en el proyecto de test tenemos que añadir una referencia al proyecto a testear.
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.
Una vez hecho esto, activamos la cobertura de código en los settings (Local.testsettings) y volvemos a ejecutar el test unitario.
Eso sí, el código no se colorea en función de si el código esta cubierto por la prueba o no 🙁
algunas utilidades para crear escenarios de pruebas para unit tests ?? salu2grz
Hola,
No entiendo muy bien tu pregunta…
Echa un ojo a los post que he escrito sobre el tema http://geeks.ms/blogs/ilanda/archive/2009/06/16/pruebas-unitarias-resumiendo.aspx
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.
Hola!
Le echaré un ojo, no conocía ese tema que de no funcione con liberías. Juararía que sí que he hecho pruebas de esta forma con liberías.
Un saludo,
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…