2010-05-25 17 views
32

Gli esempi Boost.Test documentation non sembrano contenere esempi non banali e finora i due tutorial che ho trovato here e here mentre utili sono entrambi abbastanza semplici.Boost.Test: ricerca di una suite di test non banale di lavoro Esempio/Tutorial

Mi piacerebbe avere una suite di test master per l'intero progetto, pur mantenendo per suite di unità di test unitari e dispositivi che possono essere eseguiti in modo indipendente. Userò anche un server simulato per testare vari casi limite di networking.

Sono su Ubuntu 8.04, ma prendo qualsiasi esempio Linux o Windows poiché sto scrivendo comunque i miei makefile.

Modifica

Come test ho fatto la seguente:

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

Poi compilo che: g++ test1.cpp test2.cpp -o tests

questo mi dà circa un bazillion "Definizione multiplo di" errori durante il collegamento .

Quando è tutto in un singolo file, funziona correttamente.

+0

Il _single intestazione variant_ di UTF, che si sta utilizzando, funziona solo per singolo file. Questo "piccolo dettaglio" è [documentato] (http://www.boost.org/doc/libs/1_56_0/libs/test/doc/html/utf/user-guide/usage-variants/single-header-variant. html): _Questa variante non può essere utilizzata con il modulo di test multi-file ._ –

risposta

42

C++ Unit Testing With Boost.Test

Quanto sopra è un articolo brillante e meglio di quanto la documentazione effettiva Boost.

Edit:

Ho anche scritto uno script Perl che generare automaticamente il makefile e del progetto scheletro da un elenco di nomi di classi, che comprende sia il "all-in-one" prova suite e una suite di test indipendente per ogni classe. Si chiama makeSimple e può essere scaricato da Sourceforge.net.

Quello che ho trovato per essere il problema di fondo è che se si desidera dividere i test in più file è necessario collegare contro il runtime di test pre-compilati e non utilizzare la versione "solo le intestazioni" di Boost.Test . È necessario aggiungere #define BOOST_TEST_DYN_LINK a ciascun file e quando si includono le intestazioni Boost, ad esempio, utilizzare <boost/test/unit_test.hpp> anziché <boost/test/included/unit_test.hpp>.

Quindi per compilare come un singolo test:

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

o per compilare un singolo test:

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

.

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

Sarebbe bello se potessi modificare il tuo link in modo che punti verso la parte superiore della pagina, non i commenti. – danio

+0

@danio: modificato il collegamento e aggiunto un collegamento a uno script Perl che genererà automaticamente il makefile, lo scheletro del progetto e le suite di test delle unità. –

+0

Penso che anche questo sia buono: http://www.ibm.com/developerworks/aix/library/au-ctools1_boost/index.html – zack

8

Non so cos'altro si ha realmente bisogno di quello che è nel tutorial successivo. Ho fatto tutto il necessario in questo modo. Non sono sicuro di aver compreso la tua descrizione.

Una cosa che potrebbe essere richiesta è la possibilità di avere più di un file .cpp nel programma di test. È semplice come definire solo BOOST_TEST_MODULE in uno di questi file .cpp. Abbiamo un file "driver.cpp" in tutti i nostri programmi di test che lo definisce e include l'intestazione del test dell'unità. Tutti gli altri file .cpp (con scope per modulo o concetto) includono solo l'intestazione test unità, non definiscono quella variabile.

Se si desidera sia possibile compilarli insieme e compilarli separatamente, è possibile utilizzare la propria variabile -D per definire BOOST_TEST_MODULE o no.

Se si sta cercando un modo per eseguire una serie di programmi di test in un'unica esecuzione e ottenere un report, è possibile esaminare il metodo automake di eseguire test o, meglio ancora, il metodo CMake (CTest). Abbastanza sicuro che puoi usare CTest dal tuo makefile se insisti.

+0

Come test ho creato 2 file con suite di test automatico e casi di test automatico e definito 'BOOST_TEST_MODULE' in uno solo dei file. Durante il collegamento ho avuto circa un errore di "definizione multipla" di miliardi. Tutto funziona bene quando è tutto in un unico file. –

+0

Prova senza le definizioni BOOST_AUTO_TEST_SUITE(). Io non lo uso Può darsi che ci siano passaggi leggermente diversi che sono necessari se si utilizza quella macro. Provare a rimuoverli risolverà il tuo errore di compilazione, se questo è il caso, e se ne avrai bisogno saranno necessari ulteriori esperimenti. Inoltre, non nominare entrambi i test Test1. Ho avuto problemi con questo quando due test in file diversi hanno lo stesso nome. In effetti, prova a risolverlo per primo. –

+0

Sì, dopo aver esaminato il collegamento pubblicato di seguito nel commento che include il codice simile al codice di modifica (e ha due definizioni Test1), penso che questa definizione multipla di un test sia il problema. L'esercitazione collegata non condivide questa funzione e utilizza nomi diversi anche all'interno di suite diverse. –

Problemi correlati