15 Stimmen

Unit-Tests für ein ausführbares Projekt

Vielleicht denke ich nicht richtig darüber nach. Ich beginne gerade mein zweites Projekt mit Unit-Tests. Mein erstes Projekt rollte ich meine eigenen, für dieses Projekt bin ich versuchen, Boost::test.

Meine Frage ist, was sind die richtigen Verfahren für Unit-Tests Projekte, die in ausführbare Dateien kompilieren? Es scheint, wie alles, was ich sehe da draußen ist für Bibliotheken und Abhängigkeiten. Ich möchte, dass mein Exe-Projekt unitgetestet wird, aber ich möchte nicht, dass ein Bündel von Unit-Test-Funktionen in der Binärdatei herumfliegen, noch möchte ich zu tun

#ifdef _DEBUG
    BOOST_AUTO_TEST_CASE( my_func )
    {
    }
#endif

um alle meine Tests.

Ich dachte über die Erstellung eines separaten Projekts für Unit-Tests, aber das funktioniert nicht wirklich für ausführbare.. es sei denn, ich möchte einige ausgefallene Pre-Build-Operation Kopieren von meinem anderen Projekt in das Testprojekt zu tun.

Irgendwelche Gedanken oder Ideen?

9voto

philant Punkte 32877

Das Projekt kann als Bibliothek kompiliert und diese Bibliothek, möglicherweise statisch, in zwei separate ausführbare Dateien gelinkt werden: das "Projekt", das ausgeliefert wird, und die Unit-Tests.

Nun scheint das Problem von Ihrer IDE auszugehen, welche ist es? Ist es möglich, zwei Binärdateien für ein Projekt zu erstellen?

6voto

codencandy Punkte 1671

Ich benutze cppunit um meine ausführbaren Dateien in einem zusätzlichen Projekt zu testen, das einfach auf die *.obj-Dateien verweist, die aus dem Code der ausführbaren Dateien erzeugt wurden. Auf diese Weise haben Sie keine Testlogik in der ursprünglichen Codebasis und können eine separate Konsolen- oder Windows-Anwendung für Ihre Tests schreiben.

Prost Holger

3voto

Georg Fritzsche Punkte 95256

Die eigentliche Idee ist, ein separates Projekt zu erstellen, in dem Sie verschiedene Einheiten des Codes für das erwartete Verhalten, unabhängig davon, ob ein Debug-Build erstellt wurde oder nicht (einige Probleme tauchen aufgrund von Code-Unterschieden nicht einmal in Debug-Builds auf).
Sie bauen es als Binärdatei und führen es aus, um zu sehen, ob Ihre Änderungen nichts kaputt gemacht haben - oft ist es sogar als automatische Post-Build-Aktion eingerichtet.

Wenn Sie Ihre Anwendung von außen testen wollen - es gibt wahrscheinlich einige Test-Frameworks, die Sie verwenden können, je nach Bereich/Framework/etc. der Anwendung... Aber Boost.Test und all die anderen Unit-Test-Frameworks sind nicht für das Testen von ausführbaren Dateien gedacht.

2voto

Tom Punkte 10491

Das Unit-Testing einer ausführbaren Datei kann eine großartige Idee sein - aber man sollte sich darüber im Klaren sein, dass dies ein ganz anderes Monster ist als das Unit-Testing von Code. Sobald Sie eine ausführbare Datei haben, gibt es kein C++ oder Boost mehr. Es ist einfach ein Programm. Sie müssen in der Lage sein, es auszuführen und Ihre Eingaben mit einem anderen Mechanismus zu analysieren/kontrollieren:

Eingabe:

  • Argumente
  • stdin
  • Umgebungsvariablen (vielleicht)
  • Konfigurationsdateien (vielleicht)

Ausgabe:

  • Rückgabewert
  • stdout
  • Ausgabedateien (eventuell)

Es ist wahrscheinlich am einfachsten, es innerhalb einer Shell laufen zu lassen. bash wird in einer Linux-Umgebung Wunder wirken (Pipe zu/von Dateien, Ausführen sed / awk / grep auf die Ausgabe, um die Korrektheit zu analysieren). Sie könnten Perl oder Python und ihre jeweiligen Unit-Testing-Frameworks verwenden, mit dem Vorbehalt, dass Sie den Aufruf Ihres Programms in eine andere Funktion verpacken müssen: Beide Sprachen unterstützen das Konzept der Pipes von Unterprozessen, Python mit der subprocess Modul und Perl mit seinem Standardmechanismus zum Öffnen von Dateien.

Was auch immer Sie tun, Sie tun no versuchen wollen, eine gesamte ausführbare Datei aus C++ zu testen.

1voto

Sie können die erforderliche .cpp-Datei aus Ihrem Unit-Test-Projekt einbinden und testen.

Das habe ich auch getan:

Tests \GameServer\PVESettingsTest.cpp :

#include "../../sources/GameServer/PVESettings.cpp"

Alles funktioniert gut...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X