Come configurare unit test per Visual Studio C ++


93

Sto avendo difficoltà a capire come ottenere il framework di test impostato e utilizzabile in Visual Studio 2008 per C++presumibilmente con la suite integrata Unit Testing.

Eventuali collegamenti o tutorial sarebbero apprezzati.


Google rilascia C ++ Test Framework che è molto simile ai framework xUnit. http://code.google.com/p/googletest/
— popopome il

Quale framework hai finito per utilizzare?
— Joakim Karlsson

in realtà non ne ho ancora usato nessuno. Ho deciso che quello che stavo lavorando sui test unitari non era l'uso più efficace del tempo.
— DShook

Risposte:


56

Questa pagina può essere d'aiuto, esamina alcuni framework di unit test C ++:

  • CppUnit
  • Boost.Test
  • CppUnitLite
  • NanoCppUnit
  • Unità ++
  • CxxTest

Dai un'occhiata a CPPUnitLite o CPPUnitLite2 .

CPPUnitLite è stato creato da Michael Feathers, che originariamente portò JUnit di Java in C ++ come CPPUnit (CPPUnit cerca di imitare il modello di sviluppo di JUnit - ma C ++ non ha le funzionalità di Java [ad esempio la riflessione] per renderlo facile da usare).

CPPUnitLite tenta di creare un vero framework di test in stile C ++, non uno Java portato in C ++. (Sto parafrasando dal libro Working Effectively with Legacy Code di Feather ). CPPUnitLite2 sembra essere un'altra riscrittura, con più funzionalità e correzioni di bug.

Mi sono anche imbattuto in UnitTest ++ che include materiale da CPPUnitLite2 e qualche altro framework.

Microsoft ha rilasciato WinUnit .

Controlla anche Catch o Doctest


2
Googletest è molto simile a boost :: test ma un po 'più facile da integrare in VS
— Martin Beckett

3
Sono sorpreso che Catch non sia menzionato qui. Controlla anche doctest - la mia reimplementazione di Catch con un'enorme attenzione alla velocità di compilazione - controlla le FAQ per vedere cosa c'è di diverso tra i due
— onqtam

1
@onqtam non essere troppo sorpreso, questa domanda / risposta era del 2008! Aggiunti i link suggeriti.
— Aardvark

24

Esiste un modo per testare C ++ non gestito utilizzando il framework di test integrato in Visual Studio 2008 . Se crei un progetto di test C ++, utilizzando C ++ / CLI, puoi quindi effettuare chiamate a una DLL non gestita. Dovrai cambiare il supporto di Common Language Runtime a / clr da / clr: safe se vuoi testare il codice scritto in C ++ non gestito.

Ho i dettagli passo passo sul mio blog qui: http://msujaws.wordpress.com/2009/05/06/unit-testing-mfc-with-mstest/


1
Questo pone alcune restrizioni al codice C ++, ho almeno una base di codice in cui provare a includere le sue intestazioni nel codice C ++ / CLI era più problematico di quanto valesse. Il grande vantaggio per me dell'utilizzo di C ++ / CLI è che puoi utilizzare il funky test parametrizzato con attributi come RowTest in mbUnit / NUnit / xUnit.Net
— Andy Dent

9

Ecco l'approccio che utilizzo per testare il modulo IIS URL Rewrite in Microsoft (è basato sulla riga di comando, ma dovrebbe funzionare anche per VS):

  1. Assicurati che i tuoi file di intestazione siano consumabili spostando il codice sorgente nei file cpp e utilizzando la dichiarazione in avanti se necessario.
  2. Compila il tuo codice per testarlo come libreria (.lib)
  3. Crea il tuo progetto UnitTest come C ++ con il supporto CLR.
  4. Includi i tuoi file di intestazione.
  5. Includi i tuoi file .lib.
  6. Aggiungi un riferimento a Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll
  7. Usa una classe davvero piccola per dichiarare il tuo unit test e passa dal codice gestito a C ++ / nativo come questo (potrebbe avere errori di battitura):

Ecco un esempio:

// 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 questo approccio, le persone non devono imparare troppe cose in C ++ / CLI, tutto il vero test verrà eseguito in C ++ nativo e la classe TestShim verrà utilizzata per 'pubblicare' il test su MSTest.exe (o renderlo visibile ).

Per aggiungere nuovi test è sufficiente dichiarare un nuovo metodo [TestMethod] void NewTest () {:: NewTest ();} e una nuova funzione nativa void NewTest (). Niente macro, niente trucchi, subito.

Ora, il file heade è facoltativo, ma può essere utilizzato per esporre i metodi della classe Assert con firme native C ++ (ad esempio wchar_t * invece di Stirng ^), quindi puoi tenerlo vicino a C ++ e lontano da C ++ / CLI :

Ecco un esempio:

// 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



4

Il framework incluso in VS9 è .NET, ma puoi scrivere test in C ++ / CLI, quindi finché sei a tuo agio nell'apprendimento di alcuni ismi .NET, dovresti essere in grado di testare quasi tutti i codici C ++.

boost.test e googletest sembrano abbastanza simili, ma adattati per usi leggermente diversi. Entrambi hanno un componente binario, quindi avrai bisogno di un progetto extra nella tua soluzione per compilare ed eseguire i test.

Il framework che usiamo è CxxTest , che è molto più leggero; è solo intestazioni e utilizza uno script Perl (!) per estrarre le informazioni sulla suite di test dalle intestazioni (le suite ereditano da CxxTest :: Base, tutti i nomi dei metodi di test iniziano con "test"). Ovviamente, questo richiede di ottenere Perl da una fonte o da un'altra , il che aggiunge un sovraccarico alla configurazione dell'ambiente di compilazione.


CxxTest può usare python invece di perl
— Martin Beckett,

È inoltre necessario fare attenzione a qualsiasi DLL richiesta dal codice: ho avuto problemi con NUnit e mbUnit che testavano il codice C ++ / CLI, cercando di caricare le DLL.
— Andy Dent

2

Uso UnitTest ++ .

Negli anni trascorsi da quando ho scritto questo post, i sorgenti si sono spostati da SourceForge a github. Inoltre, il tutorial di esempio è ora più agnostico: non entra affatto in nessuna configurazione o impostazione del progetto.

Dubito che funzionerà ancora per Visual Studio 6 poiché i file di progetto vengono ora creati tramite CMake. Se hai ancora bisogno del supporto per la versione precedente, puoi ottenere l'ultima versione disponibile nel ramo SourceForge .


2

Gli strumenti che sono stati menzionati qui sono tutti strumenti da riga di comando. Se cerchi una soluzione più integrata, dai un'occhiata a cfix studio , che è un componente aggiuntivo di Visual Studio per unit test C / C ++. È abbastanza simile a TestDriven.Net, ma per C / C ++ (non gestito) piuttosto che .NET.


1

Ho usato CppUnit con VS2005 ed Eclipse. Il wiki è molto completo (soprattutto se hai familiarità con JUnit).


1

Non sono sicuro al 100% di VS2008, ma so che il framework di Unit Testing fornito da Microsoft in VS2005 come parte della loro Team Suite era solo per .NET, non C ++

Ho usato anche CppUnit ed è andato tutto bene. Più o meno come NUnit / JUnit / così via.

Se hai usato boost, hanno anche una libreria di unit test

I ragazzi dietro Boost hanno alcune serie abilità di codifica, quindi direi che il loro framework dovrebbe essere abbastanza buono, ma potrebbe non essere il più facile da usare :-)


1

Mi piace anche il CxxTest per gli stessi motivi. È solo un file di intestazione, quindi non è richiesto alcun collegamento. Non sei bloccato con Perl in quanto esiste anche un runner Python. Esaminerò presto la libreria di Google. La roba Boost trascina troppo altro bagaglio.


1

Lo unit tester per Visual Studio 2008 è solo per il codice .NET per quanto ne so.

Ho usato CppUnit su Visual Studio 2005 e l'ho trovato abbastanza buono.

Per quanto ricordo, la configurazione era relativamente indolore. Assicurati solo che nei tuoi progetti di test il linker (Linker → Input → Additional Dependencies) includa cppunitd.lib.

Quindi, #include <cppunit/extensions/HelperMacros.h>nella tua intestazione.

È quindi possibile seguire i passaggi in http://cppunit.sourceforge.net/doc/1.11.6/cppunit_cookbook.html per far funzionare la classe di prova.


1

Stavo soffrendo per l'implementazione di unit test per un'applicazione C ++ non gestita in un ambiente Windows con Visual Studio. Quindi sono riuscito a superare e ho scritto un post come guida passo passo al test unitario dell'applicazione C ++ non gestito. Spero che ti possa aiutare.

Unit test per C ++ non gestito in Visual Studio

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.