2010-05-25 2 views
32

Die Boost.Test documentation und Beispiele scheinen nicht wirklich nicht-triviale Beispiele zu enthalten und so weit die beiden Tutorials und here hilfreich sind beide ziemlich einfach.Boost.Test: Auf der Suche nach einer funktionierenden nicht-Trivial Test Suite Beispiel/Tutorial

Ich würde gerne eine Master-Test-Suite für das gesamte Projekt haben, während pro Modul Suiten von Komponententests und Armaturen, die unabhängig voneinander ausgeführt werden können beibehalten. Ich werde auch einen Mock-Server verwenden, um verschiedene Netzwerk-Edge-Fälle zu testen.

Ich bin auf Ubuntu 8.04, aber ich nehme irgendein Beispiel Linux oder Windows, da ich sowieso meine eigenen Makefiles schreibe.

bearbeiten

Als Test habe ich die folgenden:

// test1.cpp 
#define BOOST_TEST_MODULE Regression 
#include <boost/test/included/unit_test.hpp> 

BOOST_AUTO_TEST_SUITE(test1_suite) 

BOOST_AUTO_TEST_CASE(Test1) 
{ 
    BOOST_CHECK(2 < 1); 
} 

BOOST_AUTO_TEST_SUITE_END() 

// test2.cpp 
#include <boost/test/included/unit_test.hpp> 

BOOST_AUTO_TEST_SUITE(test2_suite) 

BOOST_AUTO_TEST_CASE(Test1) 
{ 
    BOOST_CHECK(1<2); 
} 

BOOST_AUTO_TEST_SUITE_END() 

Dann habe ich es kompilieren: g++ test1.cpp test2.cpp -o tests

Das gibt mir über eine Unmenge von "multiple Definition von" Fehler beim Verlinken .

Wenn alles in einer einzigen Datei ist, funktioniert es gut.

+0

Der _Single Header variant_ von UTF, das Sie verwenden, nur für einzelne Datei funktioniert. Dieses 'kleine Detail' ist [dokumentiert] (http://www.boost.org/doc/libs/1_56_0/libs/test/doc/html/utf/user-guide/usage-variants/single-header-variant. html): _Diese Variante kann nicht mit dem Multi-File-Testmodul verwendet werden. _ –

Antwort

42

C++ Unit Testing With Boost.Test

Die oben ist ein brillanter Artikel und besser als die tatsächliche Boost-Dokumentation.

Edit:

ich auch einen Perl-Skript geschrieben, das wird automatisch generieren, die Make-Datei und Projekt Skelett aus einer Liste von Klassennamen, einschließlich dem "all-in-one" Test Suite und eine eigenständige Test-Suite für jeder Klasse. Es heißt makeSimple und kann von Sourceforge.net heruntergeladen werden.„Nur Kopfzeilen“ -Version von Boost.Test

Was ich das grundlegende Problem, dass ist erwiesen, wenn Sie Ihre Tests in mehrere Dateien aufteilen möchten Sie gegen die vorkompilierte Testlaufzeit zu verknüpfen haben und nicht verwenden . Sie müssen #define BOOST_TEST_DYN_LINK zu jeder Datei hinzufügen und wenn Sie die Boost-Header verwenden, verwenden Sie beispielsweise <boost/test/unit_test.hpp> anstelle von <boost/test/included/unit_test.hpp>.

So als einziger Test zu kompilieren:

g++ test1.cpp -DSTAND_ALONE -lboost_unit_test_framework -o test1 

:

g++ test_main.cpp test1.cpp test2.cpp -lboost_unit_test_framework -o tests 

oder einen einzelnen Test zu kompilieren.

// test_main.cpp 
#define BOOST_TEST_DYN_LINK 
#define BOOST_TEST_MODULE Main 
#include <boost/test/unit_test.hpp> 

// test1.cpp 
#define BOOST_TEST_DYN_LINK 
#ifdef STAND_ALONE 
# define BOOST_TEST_MODULE Main 
#endif 
#include <boost/test/unit_test.hpp> 

BOOST_AUTO_TEST_SUITE(test1_suite) 

BOOST_AUTO_TEST_CASE(Test1) 
{ 
    BOOST_CHECK(2<1); 
} 

BOOST_AUTO_TEST_SUITE_END() 

// test2.cpp 
#define BOOST_TEST_DYN_LINK 
#ifdef STAND_ALONE 
# define BOOST_TEST_MODULE Main 
#endif 
#include <boost/test/unit_test.hpp> 

BOOST_AUTO_TEST_SUITE(test2_suite) 

BOOST_AUTO_TEST_CASE(Test1) 
{ 
    BOOST_CHECK(1<2); 
} 

BOOST_AUTO_TEST_SUITE_END() 
+0

Es wäre großartig, wenn Sie Ihren Link so bearbeiten könnten, dass er auf den Anfang der Seite zeigt, nicht die Kommentare. – danio

+0

@danio: Bearbeitete den Link und fügte einen Link zu einem Perl-Skript hinzu, das die Makefile-, Projektskelett- und Unit-Testsuiten automatisch generiert. –

+0

Ich denke, das ist auch gut: http://www.ibm.com/developerworks/aix/library/au-ctools1_boost/index.html – zack

8

Ich weiß nicht, was Sie sonst noch brauchen, als was im späteren Tutorial ist. Ich habe alles getan, was ich brauche. Ich bin mir nicht sicher, ob ich deine Beschreibung verstehe.

Eine Sache, die Sie möglicherweise fragen, ist die Möglichkeit, mehr als eine CPP-Datei in Ihrem Testprogramm zu haben. Das ist so einfach wie nur BOOST_TEST_MODULE in einer dieser CPP-Dateien zu definieren. Wir haben eine "driver.cpp" -Datei in all unseren Testprogrammen, die das definiert und den Unit-Test-Header enthält. Alle übrigen CPP-Dateien (nach Modul oder Konzept) umfassen nur den Unit-Test-Header, sie definieren diese Variable nicht.

Wenn Sie beide zusammen kompilieren und separat kompilieren möchten, können Sie Ihre eigene -D-Variable verwenden, um BOOST_TEST_MODULE zu definieren oder nicht.

Wenn Sie nach einer Möglichkeit suchen, eine Reihe von Testprogrammen in einem einzigen Lauf auszuführen und einen Bericht zu erhalten, können Sie sich die automake-Methode zur Durchführung von Tests oder besser die CMake-Methode (CTest) ansehen. Ziemlich sicher, dass Sie CTest aus Ihrem eigenen Makefile verwenden können, wenn Sie darauf bestehen.

+0

Als Test habe ich 2 Dateien mit Auto-Test-Suites und Auto-Testfällen erstellt und 'BOOST_TEST_MODULE' in nur einer der Dateien definiert. Während der Verlinkung habe ich über eine Bazillion "Multiple Definition of" -Fehler. Alles funktioniert gut, wenn alles in einer Datei ist. –

+0

Versuchen Sie ohne die BOOST_AUTO_TEST_SUITE() -Definitionen. Ich benutze das nicht. Es kann sein, dass es leicht unterschiedliche Schritte gibt, die benötigt werden, wenn Sie dieses Makro verwenden. Der Versuch, sie zu entfernen, wird Ihren Build-Fehler lösen, wenn dies der Fall ist, und wenn Sie sie brauchen, werden einige weitere Experimente benötigt. Benennen Sie auch nicht beide Tests Test1. Ich hatte Probleme damit, wenn zwei Tests in verschiedenen Dateien den gleichen Namen haben. In der Tat, versuche das zuerst zu beheben. –

+0

Ja, nachdem ich den unten stehenden Link im Kommentar gelesen habe, der Code enthält, der Ihrem Bearbeitungscode ähnelt (und zwei Test1-Definitionen enthält), denke ich, dass diese mehrfache Definition eines Tests das Problem ist. Das verknüpfte Lernprogramm teilt diese Funktion nicht und verwendet verschiedene Namen sogar innerhalb verschiedener Suites. –

Verwandte Themen