Cómo configurar las pruebas unitarias para Visual Studio C ++

93

Tengo problemas para averiguar cómo configurar y usar el marco de prueba en Visual Studio 2008 para C++, presumiblemente, con la suite integrada en la unidad de prueba.

Se agradecería cualquier enlace o tutorial.

DShook
fuente
Google lanza C ++ Test Framework, que es muy similar a los frameworks xUnit. http://code.google.com/p/googletest/
popopome
¿Qué marco terminaste usando?
Joakim Karlsson
de hecho, todavía no he usado ninguno de ellos. Decidí que las pruebas unitarias en las que estaba trabajando no eran el uso más eficaz del tiempo.
DShook

Respuestas:

56

Esta página puede ayudar, revisa bastantes marcos de pruebas unitarias de C ++:

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

Consulte CPPUnitLite o CPPUnitLite2 .

CPPUnitLite fue creado por Michael Feathers, quien originalmente portó JUnit de Java a C ++ como CPPUnit (CPPUnit intenta imitar el modelo de desarrollo de JUnit, pero C ++ carece de las características de Java [por ejemplo, la reflexión] para facilitar su uso).

CPPUnitLite intenta hacer un verdadero marco de prueba al estilo C ++, no uno de Java adaptado 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.

También me encontré con UnitTest ++ que incluye cosas de CPPUnitLite2 y algún otro marco.

Microsoft ha lanzado WinUnit .

También verifique Catch o Doctest

Cerdo hormiguero
fuente
2
Googletest es muy similar a boost :: test pero un poco más fácil de integrar en VS
Martin Beckett
3
Me sorprende que Catch no se mencione aquí. También verifique doctest - mi reimplementación de Catch con un gran enfoque en la velocidad de compilación - consulte las preguntas frecuentes para ver qué es diferente entre los dos
onqtam
1
@onqtam, no se sorprenda demasiado, ¡esta pregunta / respuesta fue de 2008! Agregó los enlaces sugeridos.
Aardvark
24

Existe una forma de probar C ++ no administrado utilizando el marco de prueba integrado en Visual Studio 2008 . Si crea un proyecto de prueba de C ++, utilizando C ++ / CLI, puede realizar llamadas a una DLL no administrada. Tendrá que cambiar el soporte de Common Language Runtime a / clr desde / clr: safe si desea probar el código escrito en C ++ no administrado.

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

Jared
fuente
1
Esto impone ciertas restricciones a su código C ++. Tengo al menos una base de código en la que intentar incluir sus encabezados en el código C ++ / CLI fue más problemático de lo que valía la pena. El gran beneficio para mí de usar C ++ / CLI es que puede usar las pruebas parametrizadas funky con atributos como RowTest en mbUnit / NUnit / xUnit.Net
Andy Dent
9

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

  1. Asegúrese de que sus archivos de encabezado sean consumibles moviendo el código fuente a archivos cpp y usando la declaración de avance si es necesario.
  2. Compile su código para probarlo como biblioteca (.lib)
  3. Cree su proyecto UnitTest como C ++ con soporte CLR.
  4. Incluya sus archivos de encabezado.
  5. Incluya sus archivos .lib.
  6. Agregue una referencia a Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll
  7. Use una clase realmente pequeña para declarar su prueba unitaria y salte de código administrado a C ++ / nativo como este (puede tener errores tipográficos):

Aquí hay 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 sobre C ++ / CLI, toda la prueba real se realizará en C ++ nativo y la clase TestShim se usará para 'publicar' la prueba en MSTest.exe (o hacerla visible ).

Para agregar nuevas pruebas, simplemente declare un nuevo método [TestMethod] void NewTest () {:: NewTest ();} y una nueva función nativa void NewTest (). Sin macros, sin trucos, sencillo.

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

Aquí hay 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

aracntido
fuente
6

Personalmente, prefiero WinUnit ya que no requiere que escriba nada excepto mis pruebas (construyo un .dll como prueba, no un exe). Acabo de construir un proyecto, apunto WinUnit.exe a mi directorio de salida de prueba y ejecuta todo lo que encuentra. Puede descargar el proyecto WinUnit aquí . (MSDN ahora requiere que descargue el número completo, no el artículo. WinUnit está incluido).

Moswald
fuente
4

El marco incluido con VS9 es .NET, pero puede escribir pruebas en C ++ / CLI, por lo que siempre que se sienta cómodo aprendiendo algunos ismos de .NET, debería poder probar la mayoría de los códigos de C ++.

boost.test y googletest parecen ser bastante similares, pero adaptados para usos ligeramente diferentes. 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 usamos es CxxTest , que es mucho más ligero; son solo encabezados, y utiliza un script Perl (!) para extraer información de la suite de pruebas de sus encabezados (las suites heredan de CxxTest :: Base, todos los nombres de sus métodos de prueba comienzan con "test"). Obviamente, esto requiere que obtenga Perl de una fuente u otra , lo que agrega sobrecarga a la configuración de su entorno de compilación.

Ben Straub
fuente
CxxTest puede usar python en lugar de perl
Martin Beckett
También debe tener cuidado con las DLL que requiere su código: he tenido problemas con NUnit y mbUnit probando el código C ++ / CLI, tratando de cargar las DLL.
Andy Dent
2

Yo uso UnitTest ++ .

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

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

graham.reeds
fuente
2

Las herramientas que se han mencionado aquí son todas 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 unitarias de C / C ++. Es bastante similar a TestDriven.Net, pero para C / C ++ (no administrado) en lugar de .NET.

Peter Mortensen
fuente
1

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

colgur
fuente
1

No estoy 100% seguro acerca de VS2008, pero sé que el marco de pruebas unitarias que Microsoft envió en VS2005 como parte de su Team Suite era solo para .NET, no C ++

También usé CppUnit y estuvo bien. Muy parecido a NUnit / JUnit / etc.

Si ha usado boost, también tienen una biblioteca de pruebas unitarias

Los chicos detrás de boost tienen algunas habilidades de codificación serias , por lo que diría que su marco debería ser bastante bueno, pero puede que no sea el más fácil de usar :-)

Orion Edwards
fuente
1

También me gusta el CxxTest por las mismas razones. Es solo un archivo de encabezado, por lo que no se requieren enlaces. No está atascado con Perl, ya que también hay un corredor de Python. Pronto revisaré la biblioteca de Google. Las cosas de Boost arrastran demasiado equipaje.

ZebZiggle
fuente
1

El probador de unidades para Visual Studio 2008 es solo para código .NET que yo sepa.

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

Por lo que recuerdo, la configuración fue relativamente indolora. Solo asegúrese de que en sus proyectos de prueba el vinculador (Vinculador → Entrada → Dependencias adicionales) incluya cppunitd.lib.

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

Luego, puede seguir los pasos en http://cppunit.sourceforge.net/doc/1.11.6/cppunit_cookbook.html para que su clase de prueba funcione.

Lehane
fuente
1

Estaba sufriendo para implementar pruebas unitarias para una aplicación C ++ no administrada en un entorno Windows con Visual Studio. Así que logré superar y escribí una publicación como una guía paso a paso para las pruebas unitarias de aplicaciones C ++ no administradas. Espero que te ayude.

Prueba unitaria para C ++ no administrado en Visual Studio

Nayana Adassuriya
fuente