2008-08-06 22 views
85

Tengo problemas para descubrir cómo configurar el marco de prueba configurado y utilizable en Visual Studio 2008 para C++, presumiblemente con el conjunto de pruebas de unidad incorporado.Cómo configurar las pruebas unitarias para Visual Studio C++

Cualquier enlace o tutorial sería apreciado.

+0

¿Qué marco acabaste usando? –

+0

en realidad todavía no he usado ninguno de ellos. Decidí que lo que estaba trabajando en pruebas unitarias no era el uso más eficaz del tiempo. – DShook

+0

Google lanza C++ Test Framework que es muy similar con xUnit frameworks. [http://code.google.com/p/googletest/](http://code.google.com/p/googletest/) – popopome

Respuesta

55

This page puede ayudar, revisa bastantes C pocos ++ marcos de prueba de unidad:

  • CPPUnit
  • Boost.Test
  • CppUnitLite
  • NanoCppUnit
  • Unidad ++
  • CxxTest

Salida CPPUnitLite o CPPUnitLite2.

CPPUnitLite fue creado por las plumas Michael, que originalmente portado JUnit de Java para C++ como cppunit (tries CPPUnit imitan el modelo de desarrollo de JUnit - pero C++ carece de características de Java [por ejemplo reflexión] para que sea fácil de usar).

CPPUnitLite intenta hacer un verdadero marco de prueba de estilo C++, no un Java uno portado a C++. (Estoy parafraseando del libro Working Effectively with Legacy Code de Feather). CPPUnitLite2 parece ser otra reescritura, con más funciones y correcciones de errores.

Asimismo, sólo encontré con UnitTest++ que incluye cosas de CPPUnitLite2 y algún que otro marco.

Microsoft ha publicado WinUnit.

también comprobación Catch o Doctest

+2

http: //winunit.codeplex.com/ – inazaruk

+2

Googletest es muy similar a boost :: test pero un poco más fácil de integrar en VS –

+3

Me sorprende [Catch] (https://github.com/philsquared/Catch) no se menciona aquí. También checkout [doctest] (https://github.com/onqtam/doctest) - mi reimplementación de Catch con un gran enfoque en la velocidad de compilación - consulte las [preguntas frecuentes] (https://github.com/onqtam/doctest/blob /master/doc/markdown/faq.md#how-is-doctest-different-from-catch) para ver cuál es diferente entre los dos – onqtam

2

Yo uso UnitTest++.

En los años transcurridos desde que hice esta publicación, la fuente se mudó de SourceForge a github. Además, el example tutorial es ahora más agnóstico: no entra en ninguna configuración o configuración del proyecto.

Dudo que todavía funcione para Visual Studio 6 ya que los archivos del proyecto ahora se crean a través de CMake. Si aún necesita la versión anterior de soporte, puede obtener la última versión disponible en la rama SourceForge.

1

He usado CppUnit con VS2005 y Eclipse. La wiki es muy minuciosa (especialmente si estás familiarizado con JUnit).

1

no estoy 100% seguro de VS2008, pero sé que el marco de pruebas unitarias que Microsoft enviado en VS2005 como parte de su suite del equipo era sólo para .NET, C++ no

He usado CPPUnit también y estaba bien. Casi lo mismo que NUnit/JUnit/etc.

Si ha utilizado impulso, ellos also have a unit testing library

Los chicos detrás impulso tienen algunos chuletas de codificación graves, así que diría que su marco debe ser bastante bueno, pero podría no ser el más fácil de usar :-)

4

El marco incluye con VS9 es .NET, pero se puede escribir pruebas en C++/CLI, por lo que el tiempo que usted se sienta cómodo aprendiendo algunos ismos .NET, debe ser capaz de probar la mayoría de cualquier Código C++

boost.test y googletest vistazo a ser bastante similar, pero ligeramente adaptadas para diferentes usos. Ambos tienen un componente binario, por lo que necesitará un proyecto adicional en su solución para compilar y ejecutar las pruebas.

El marco que utilizamos es CxxTest, que es mucho más ligero; son solo encabezados, y usa una secuencia de comandos Perl (!) para raspar la información de la suite de prueba de sus encabezados (las suites heredan de CxxTest :: Base, todos los nombres de sus métodos de prueba comienzan con "prueba"). Obviamente, esto requiere que obtenga Perl de one source o another, lo que agrega gastos generales a la configuración de su entorno de compilación.

+0

CxxTest puede usar python en lugar de perl –

+0

También debe tener cuidado con los archivos DLL requerido por su código: he tenido problemas con NUnit y mbUnit para probar el código C++/CLI, tratando de cargar las DLL. –

1

El probador de unidades para Visual   Studio   2008 es solo para el código .NET hasta donde yo sé.

Utilicé CppUnit en Visual   Studio   2005 y me pareció bastante bueno.

Por lo que recuerdo, la configuración fue relativamente fácil. Solo asegúrese de que en sus proyectos de prueba, el enlazador (Enlazador → Entrada → Dependencias Adicionales) incluya cppunitd.lib.

Luego, #include <cppunit/extensions/HelperMacros.h> en el encabezado.

A continuación, puede seguir los pasos en http://cppunit.sourceforge.net/doc/1.11.6/cppunit_cookbook.html para que la clase de prueba funcione.

1

También me gusta el CxxTest por los mismos motivos. Es solo un archivo de encabezado, por lo que no es necesario un enlace. No estás atascado con Perl, ya que también hay un corredor de Python. Voy a revisar la biblioteca de Google pronto. Las cosas de Boost atraen demasiados equipajes.

6

Personalmente, prefiero WinUnit ya que no me requiere a write anything except for my tests (construyo un .dll como la prueba, no un exe). Solo construyo un proyecto y apunto WinUnit.exe a mi directorio de salida de prueba y ejecuta todo lo que encuentra. Puede download the WinUnit project here. (MSDN ahora requiere que descargue el problema completo, no el artículo. WinUnit está incluido en.)

+0

Tenga en cuenta que WinUnit se ha movido a CodePlex http://winunit.codeplex.com/ –

24

Hay una manera de probar C++ no administrado utilizando el marco de prueba incorporado en Visual Studio 2008. Si crea un Proyecto de prueba C++, utilizando C++/CLI, puede realizar llamadas a una DLL no administrada. Deberá cambiar el soporte de Common Language Runtime a/clr desde/clr: safe si desea probar el código que se escribió en C++ no administrado.

que tienen detalles paso a paso en mi blog aquí: http://msujaws.wordpress.com/2009/05/06/unit-testing-mfc-with-mstest/

+0

Genial, me alegro de que esto sea posible, gracias :) – DanDan

+1

Esto pone ciertas restricciones en su código C++, tengo al menos uno base de código donde tratar de incluir sus encabezados en el código C++/CLI era más problemático de lo que valía. El gran beneficio para mí de usar C++/CLI es que puede usar la funky prueba parametrizada con atributos como RowTest en mbUnit/NUnit/xUnit.Net –

2

Las herramientas que han sido mencionados aquí son todas las herramientas de línea de comandos. Si busca una solución más integrada, eche un vistazo a cfix studio, que es un complemento de Visual Studio para pruebas de unidades C/C++. Es bastante similar a TestDriven.Net, pero para C/C++ (no administrado) en lugar de .NET.

+0

Ahora se llama VisualAssert, pero el enlace aún funciona. – newenglander

9

Aquí es el enfoque que utilizo para probar el módulo de IIS reescritura de URL de Microsoft (que está basado en línea de comandos, pero debe trabajar para VS también):

  1. Asegúrese de que sus archivos de cabecera son consumibles moviendo código fuente de los archivos cpp y utilizando la declaración de envío si es necesario.
  2. Compila tu código para probar como biblioteca (.lib)
  3. Crea tu proyecto UnitTest como C++ con soporte CLR.
  4. Incluya sus archivos de encabezado.
  5. Incluya sus archivos .lib.
  6. agregar una referencia a Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll
  7. Usar una muy pequeña clase para declarar su prueba de unidad y saltar desde conseguido C++/código nativo como esto (puede tener errores tipográficos):

Aquí se muestra un ejemplo:

// Example 
#include "stdafx.h" 
#include "mstest.h" 

// Following code is native code. 
#pragma unmanaged 
void AddTwoNumbersTest() { 
    // Arrange 
    Adder yourNativeObject; 
    int expected = 3; 
    int actual; 
    // Act 
    actual = yourNativeObject.Add(1, 2); 
    // Assert 
    Assert::AreEqual(expected, actual, L"1 + 2 != 3"); 
} 

// Following code is C++/CLI (Managed) 
#pragma managed 
using namespace Microsoft::VisualStudio::TestTools::UnitTesting; 
[TestClass] 
public ref class TestShim { 
public: 
    [TestMethod] 
    void AddTwoNumbersTest() { 
    // Just jump to C++ native code (above) 
    ::AddTwoNumbersTest(); 
    } 
}; 

con este enfoque, las personas no tienen que aprender demasiado C++/cosas CLI, toda la prueba real será hecho en C++ nativo y la clase TestShim será utilizado para 'publicar' la prueba en MSTest.exe (o hacerla visible).

Para agregar nuevas pruebas, solo declara un nuevo método [TestMethod] void NewTest() {:: NewTest();} y una nueva función nativa NewTest() vacía. Sin macros, sin trucos, directo.

Ahora, el archivo heade es opcional, pero puede usarse para exponer los métodos de la clase Assert con firmas C++ nativas (por ejemplo, wchar_t * en lugar de Stirng ^), por lo que puede mantenerlo cerca de C++ y lejos de C++/CLI:

Aquí se muestra un ejemplo:

// Example 
#pragma once 
#pragma managed(push, on) 
using namespace System; 
class Assert { 
public: 
    static void AreEqual(int expected, int actual) { 
     Microsoft::VisualStudio::TestTools::UnitTesting::Assert::AreEqual(expected, actual); 
    } 

    static void AreEqual(int expected, int actual, PCWSTR pszMessage) { 
     Microsoft::VisualStudio::TestTools::UnitTesting::Assert::AreEqual(expected, actual, gcnew String(pszMe 
ssage)); 
    } 

    template<typename T> 
    static void AreEqual(T expected, T actual) { 
     Microsoft::VisualStudio::TestTools::UnitTesting::Assert::AreEqual(expected, actual); 
    } 

    // Etcetera, other overloads... 
} 
#pragma managed(pop) 

HTH

1

estaba sufriendo para implementar la unidad de pruebas para una aplicación C++ no administrado en un entorno Windows con Visual Studio. Así que me las arreglé para superar y escribí una publicación como una guía paso a paso para las pruebas de unidades de aplicaciones C++ no administradas. Espero que te pueda ayudar.

Unit test for unmanaged C++ in Visual Studio

Cuestiones relacionadas