So richten Sie Unit-Tests für Visual Studio C ++ ein

93

Ich habe Probleme , herauszufinden , wie der Test - Framework bekommen eingerichtet und geeignet für Visual Studio 2008 für C++vermutlich mit der Einbaugerät Test - Suite.

Alle Links oder Tutorials wäre dankbar.

DShook
quelle
Google veröffentlicht das C ++ Test Framework, das den xUnit-Frameworks sehr ähnlich ist. http://code.google.com/p/googletest/
Popopome
Welches Framework haben Sie letztendlich verwendet?
Joakim Karlsson
Eigentlich habe ich noch keinen von ihnen benutzt. Ich entschied, dass das, woran ich arbeitete, nicht die effektivste Zeitnutzung war.
DShook

Antworten:

56

Diese Seite kann hilfreich sein, da sie einige C ++ - Unit-Test-Frameworks überprüft:

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

Schauen Sie sich CPPUnitLite oder CPPUnitLite2 an .

CPPUnitLite wurde von Michael Feathers erstellt, der Javas JUnit ursprünglich als CPPUnit nach C ++ portierte (CPPUnit versucht, das Entwicklungsmodell von JUnit nachzuahmen - in C ++ fehlen jedoch die Funktionen von Java [z. B. Reflection], um die Verwendung zu vereinfachen).

CPPUnitLite versucht, ein echtes Testframework im C ++ - Stil zu erstellen, kein Java-Framework, das auf C ++ portiert ist. (Ich paraphrasiere aus Feathers Buch "Effektiv mit Legacy-Code arbeiten "). CPPUnitLite2 scheint ein weiteres Umschreiben mit mehr Funktionen und Fehlerkorrekturen zu sein.

Ich bin auch gerade auf UnitTest ++ gestoßen, das Inhalte von CPPUnitLite2 und einem anderen Framework enthält.

Microsoft hat WinUnit veröffentlicht .

Kasse auch Catch oder Doctest

Erdferkel
quelle
2
Googletest ist sehr ähnlich zu boost :: test, aber ein wenig einfacher in VS zu integrieren
Martin Beckett
3
Ich bin überrascht, dass Catch hier nicht erwähnt wird. Auch checkout doctest - meine Neuimplementierung von Catch mit einem großen Fokus auf Kompilierungsgeschwindigkeit - checkout die FAQ, um zu sehen, was zwischen den beiden unterschiedlich ist
onqtam
1
@onqtam nicht zu überrascht sein, diese Frage / Antwort war aus dem Jahr 2008! Sie haben Links vorgeschlagen.
Erdferkel
24

Es gibt eine Möglichkeit, nicht verwaltetes C ++ mithilfe des in Visual Studio 2008 integrierten Testframeworks zu testen . Wenn Sie ein C ++ - Testprojekt mit C ++ / CLI erstellen, können Sie eine nicht verwaltete DLL aufrufen. Sie müssen die Common Language Runtime-Unterstützung von / clr: safe auf / clr umstellen, wenn Sie Code testen möchten, der in nicht verwaltetem C ++ geschrieben wurde.

Ich habe Schritt für Schritt Details in meinem Blog hier: http://msujaws.wordpress.com/2009/05/06/unit-testing-mfc-with-mstest/

Jared
quelle
1
Dies stellt bestimmte Einschränkungen für Ihren C ++ - Code dar. Ich habe mindestens eine Codebasis, bei der der Versuch, die Header in C ++ / CLI-Code aufzunehmen, mehr Probleme bereitete, als es wert war. Der große Vorteil für mich bei der Verwendung von C ++ / CLI ist, dass Sie die funky parametrisierten Tests mit Attributen wie RowTest in mbUnit / NUnit / xUnit.Net
Andy Dent
9

Hier ist der Ansatz, mit dem ich das IIS URL Rewrite-Modul bei Microsoft teste (es ist befehlszeilenbasiert, sollte aber auch für VS funktionieren):

  1. Stellen Sie sicher, dass Ihre Header-Dateien konsumierbar sind, indem Sie den Quellcode in CPP-Dateien verschieben und bei Bedarf die Vorwärtsdeklaration verwenden.
  2. Kompilieren Sie Ihren Code, um ihn als Bibliothek zu testen (.lib)
  3. Erstellen Sie Ihr UnitTest-Projekt als C ++ mit CLR-Unterstützung.
  4. Fügen Sie Ihre Header-Dateien hinzu.
  5. Fügen Sie Ihre .lib-Dateien hinzu.
  6. Fügen Sie einen Verweis auf Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll hinzu
  7. Verwenden Sie eine wirklich kleine Klasse, um Ihren Komponententest zu deklarieren, und springen Sie von verwaltetem zu C ++ / Native-Code wie folgt (möglicherweise mit Tippfehlern):

Hier ist ein Beispiel:

// 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();
  }
};

Mit diesem Ansatz müssen die Benutzer nicht zu viel C ++ / CLI lernen, der gesamte eigentliche Test wird in C ++ native durchgeführt und die TestShim-Klasse wird verwendet, um den Test in MSTest.exe zu veröffentlichen (oder sichtbar zu machen) ).

Zum Hinzufügen neuer Tests deklarieren Sie einfach eine neue [TestMethod] void NewTest () {:: NewTest ();} Methode und eine neue void NewTest () native Funktion. Keine Makros, keine Tricks, geradlinig.

Die Heade-Datei ist jetzt optional, kann jedoch verwendet werden, um die Methoden der Assert-Klasse mit nativen C ++ - Signaturen (z. B. wchar_t * anstelle von Stirng ^) verfügbar zu machen, sodass Sie sie nahe an C ++ und weit entfernt von C ++ / CLI halten können ::

Hier ist ein Beispiel:

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

Persönlich bevorzuge ich WinUnit, da ich nur meine Tests schreiben muss (ich erstelle eine DLL als Test, keine Exe). Ich erstelle gerade ein Projekt und zeige WinUnit.exe auf mein Testausgabeverzeichnis und es führt alles aus, was es findet. Sie können das WinUnit-Projekt hier herunterladen . (Für MSDN müssen Sie jetzt die gesamte Ausgabe herunterladen, nicht den Artikel. WinUnit ist im Lieferumfang enthalten.)

Moswald
quelle
4

Das in VS9 enthaltene Framework ist .NET. Sie können jedoch Tests in C ++ / CLI schreiben. Solange Sie mit dem Erlernen einiger .NET-Ismen vertraut sind, sollten Sie in der Lage sein, fast jeden C ++ - Code zu testen.

boost.test und googletest sehen ziemlich ähnlich aus, sind jedoch für leicht unterschiedliche Verwendungszwecke geeignet. Beide haben eine binäre Komponente, sodass Sie in Ihrer Lösung ein zusätzliches Projekt benötigen, um die Tests zu kompilieren und auszuführen.

Das Framework, das wir verwenden, ist CxxTest , das viel leichter ist. Es handelt sich nur um Header und verwendet ein Perl (!) - Skript, um Informationen zur Testsuite aus Ihren Headern zu entfernen (Suites erben von CxxTest :: Base, alle Namen Ihrer Testmethoden beginnen mit "test"). Dies erfordert natürlich, dass Sie Perl von der einen oder anderen Quelle beziehen , was den Aufwand für die Einrichtung Ihrer Build-Umgebung erhöht.

Ben Straub
quelle
CxxTest kann Python anstelle von Perl verwenden
Martin Beckett
Sie müssen auch vorsichtig mit den für Ihren Code erforderlichen DLLs sein. Ich hatte Probleme mit NUnit und mbUnit, die C ++ / CLI-Code testen und versuchen, DLLs zu laden.
Andy Dent
2

Ich benutze UnitTest ++ .

In den Jahren, seit ich diesen Beitrag verfasst habe, ist die Quelle von SourceForge zu Github gewechselt. Auch das Beispiel-Tutorial ist jetzt agnostischer - es wird überhaupt keine Konfiguration oder kein Projekt eingerichtet.

Ich bezweifle, dass es für Visual Studio 6 weiterhin funktioniert, da die Projektdateien jetzt über CMake erstellt werden. Wenn Sie weiterhin die Unterstützung für ältere Versionen benötigen, können Sie die letzte verfügbare Version im SourceForge- Zweig herunterladen .

graham.reeds
quelle
2

Die hier erwähnten Tools sind alle Befehlszeilen-Tools. Wenn Sie nach einer stärker integrierten Lösung suchen, schauen Sie sich cfix studio an , ein Visual Studio AddIn für C / C ++ - Komponententests. Es ist TestDriven.Net ziemlich ähnlich, jedoch für (nicht verwaltetes) C / C ++ und nicht für .NET.

Peter Mortensen
quelle
1

Ich habe CppUnit mit VS2005 und Eclipse verwendet. Das Wiki ist sehr gründlich (besonders wenn Sie mit JUnit vertraut sind).

colgur
quelle
1

Ich bin mir bei VS2008 nicht 100% sicher, aber ich weiß, dass das Unit-Testing-Framework, das Microsoft in VS2005 als Teil seiner Team Suite ausgeliefert hat, nur für .NET und nicht für C ++ war

Ich habe auch CppUnit verwendet und es war in Ordnung. Ähnlich wie NUnit / JUnit / so weiter.

Wenn Sie Boost verwendet haben, verfügen sie auch über eine Unit-Testing-Bibliothek

Die Jungs hinter Boost haben einige ernsthafte Codierungsprobleme, daher würde ich sagen, dass ihr Framework ziemlich gut sein sollte, aber es ist möglicherweise nicht das benutzerfreundlichste :-)

Orion Edwards
quelle
1

Aus den gleichen Gründen gefällt mir auch der CxxTest. Es ist nur eine Header-Datei, daher ist keine Verknüpfung erforderlich. Sie sind nicht an Perl gebunden, da es auch einen Python-Runner gibt. Ich werde bald die Google-Bibliothek überprüfen. Das Boost-Zeug zieht zu viel anderes Gepäck ein.

ZebZiggle
quelle
1

Der Unit-Tester für Visual Studio 2008 ist meines Wissens nur für .NET-Code.

Ich habe CppUnit in Visual Studio 2005 verwendet und fand es ziemlich gut.

Soweit ich mich erinnere, war das Setup relativ schmerzlos. Stellen Sie einfach sicher, dass in Ihren Testprojekten der Linker (Linker → Eingabe → Zusätzliche Abhängigkeiten) cppunitd.lib enthält.

Dann #include <cppunit/extensions/HelperMacros.h>in Ihrem Header.

Sie können dann die Schritte unter http://cppunit.sourceforge.net/doc/1.11.6/cppunit_cookbook.html ausführen , damit Ihre Testklasse funktioniert.

Lehane
quelle
1

Ich hatte Probleme, Unit-Tests für eine nicht verwaltete C ++ - Anwendung in einer Windows-Umgebung mit Visual Studio zu implementieren. So gelang es mir, einen Beitrag zu überwinden und als schrittweise Anleitung zum Testen nicht verwalteter C ++ - Anwendungseinheiten zu schreiben. Ich hoffe es kann dir helfen.

Unit-Test für nicht verwaltetes C ++ in Visual Studio

Nayana Adassuriya
quelle