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.