unit testing - tests - Externas externas no resueltas al compilar pruebas unitarias para Visual C++ 2012
visual studio generate unit tests (1)
Aquí hay una descripción paso a paso sobre cómo agregar un EXE como un objetivo de prueba de unidad.
El punto clave es "exportar" las funciones / clases que desea probar ... Puede descargar la muestra completa aquí: http://blog.kalmbachnet.de/files/CPP_UnitTestApp.zip (No cambié la configuración de ningún proyecto) , por lo que todos los cambios que puede ver en el código fuente, por supuesto, algunas partes se pueden hacer en la configuración del proyecto).
Cree una aplicación Win32 (Consola o MFC o Windows, no importa);
CPP_UnitTestApp
un proyecto de consola llamadoCPP_UnitTestApp
:Agregue una función que quiera probar (también puede agregar clases). Por ejemplo:
int Plus1(int i) { return i+1; }
Agregue un archivo de cabecera para las funciones que desea probar:
CPP_UnitTestApp.h
Coloque la declaración de los métodos en el archivo de encabezado y también exporte estas funciones.
#pragma once #ifdef EXPORT_TEST_FUNCTIONS #define MY_CPP_UNITTESTAPP_EXPORT __declspec(dllexport) #else #define MY_CPP_UNITTESTAPP_EXPORT #endif MY_CPP_UNITTESTAPP_EXPORT int Plus1(int i);
Incluya este archivo de encabezado en main-cpp (aquí CPP_UnitTestApp.cpp) y defina
EXPORT_TEST_FUNCTIONS
antes de incluir el encabezado:#define EXPORT_TEST_FUNCTIONS #include "CPP_UnitTestApp.h"
Ahora agregue un nuevo proyecto (proyecto de prueba de unidad nativa: UnitTest1)
Incluya el encabezado y la lib en el archivo "unittest1.cpp" (adopte las rutas de acceso como desee):
#include "../CPP_UnitTestApp.h" #pragma comment(lib, "../Debug/CPP_UnitTestApp.lib")
Vaya a la configuración del proyecto de prueba agregue agregue una referencia al proyecto "UnitTest1" (Proyecto | Propiedades | Propiedades comunes | Agregar nueva referencia ...: Seleccione en "Proyectos" el "Proyecto CPP_UnitTestApp")
Crea la función de prueba de la unidad:
TEST_METHOD(TestMethod1) { int res = Plus1(12); Assert::AreEqual(13, res); }
Ejecute su prueba de unidad;)
Como puede ver, ¡el punto principal era exportar la declaración de la función! Esto se hace a través de __declspec(dllexport)
incluso si es un EXE.
Como dije, el proyecto de demostración se puede descargar aquí: http://blog.kalmbachnet.de/files/CPP_UnitTestApp.zip
Quiero crear pruebas unitarias para un proyecto de Visual C ++. Intenté seguir estas instrucciones de MSDN . Encontré páginas donde diferencian entre código no administrado / mixto / puro, pero no entiendo completamente esos conceptos. Mi código no usa .NET y probablemente compilará en MinGW con algunos ajustes de código.
Mi proyecto principal crea un archivo ejecutable, por lo que seguí los pasos en Para referenciar las funciones exportadas del proyecto de prueba . Para empezar, obtuve diferentes opciones de proyectos:
Fui con Native Unit Test Project . Agregué una referencia a mi proyecto principal y establecí Include Directories en $(SolutionDir)/Cubes;$(IncludePath)
. Escribí mi código y lo obtuve al compilar:
1>Creating library C:/Users/Pieter/Dropbox/Unief/TTUI/TTUIproject/Cubes/Debug/CubesTest.lib and object C:/Users/Pieter/Dropbox/Unief/TTUI/TTUIproject/Cubes/Debug/CubesTest.exp
1>LayoutTest.obj : error LNK2019: unresolved external symbol "public: __thiscall Room::Room(void)" (??0Room@@QAE@XZ) referenced in function "public: void __thiscall CubesTest::LayoutTest::NumOfRoomsConsistency(void)" (?NumOfRoomsConsistency@LayoutTest@CubesTest@@QAEXXZ)
1>LayoutTest.obj : error LNK2019: unresolved external symbol "public: __thiscall Layout::Layout(class Room *,int)" (??0Layout@@QAE@PAVRoom@@H@Z) referenced in function "public: void __thiscall CubesTest::LayoutTest::NumOfRoomsConsistency(void)" (?NumOfRoomsConsistency@LayoutTest@CubesTest@@QAEXXZ)
1>LayoutTest.obj : error LNK2019: unresolved external symbol "public: void __thiscall Layout::add(int,int,class Room *)" (?add@Layout@@QAEXHHPAVRoom@@@Z) referenced in function "public: void __thiscall CubesTest::LayoutTest::NumOfRoomsConsistency(void)" (?NumOfRoomsConsistency@LayoutTest@CubesTest@@QAEXXZ)
1>LayoutTest.obj : error LNK2019: unresolved external symbol "public: void __thiscall Layout::clear(int,int,bool)" (?clear@Layout@@QAEXHH_N@Z) referenced in function __catch$?NumOfRoomsConsistency@LayoutTest@CubesTest@@QAEXXZ$0
1>C:/Users/Pieter/Dropbox/Unief/TTUI/TTUIproject/Cubes/Debug/CubesTest.dll : fatal error LNK1120: 4 unresolved externals
Si no me equivoco, esto significa que el compilador encuentra los archivos de encabezado, pero no los archivos de origen. ¿Qué me estoy perdiendo?