36 votes

Boost.Test: À la recherche d'un exemple / tutoriel de suite de tests non trivial fonctionnel

La documentation de Boost.Test et les exemples ne semblent pas vraiment contenir d'exemples non triviaux jusqu'à présent les deux tutoriels que j'ai trouvés ici et ici bien utiles, sont tous deux assez basiques.

J'aimerais avoir une suite de tests principale pour l'ensemble du projet, tout en maintenant des suites de tests unitaires et de fixtures par module pouvant être exécutées de manière indépendante. Je vais également utiliser un serveur factice pour tester divers cas de bord en matière de réseau.

Je suis sous Ubuntu 8.04, mais je prendrai tout exemple Linux ou Windows étant donné que j'écris mes propres makefiles de toute façon.

Édition

Comme test, j'ai fait ce qui suit:

// test1.cpp
#define BOOST_TEST_MODULE Regression
#include 

BOOST_AUTO_TEST_SUITE(test1_suite)

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

BOOST_AUTO_TEST_SUITE_END()

// test2.cpp
#include 

BOOST_AUTO_TEST_SUITE(test2_suite)

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

BOOST_AUTO_TEST_SUITE_END()

Ensuite, je le compile : g++ test1.cpp test2.cpp -o tests

Cela me donne environ un bazillion d'erreurs "définition multiple de" pendant la liaison.

Quand tout est dans un seul fichier, ça fonctionne bien.

0 votes

La variante de en-tête unique de UTF que vous utilisez fonctionne uniquement pour un seul fichier. Ce 'petit détail' est documenté : Cette variante ne peut pas être utilisée avec le module de test multi-fichier.

46voto

Robert S. Barnes Points 17244

Test d'unité C++ avec Boost.Test

(lien permanent: http://web.archive.org/web/20160524135412/http://www.alittlemadness.com/2009/03/31/c-unit-testing-with-boosttest/)

L'article ci-dessus est brillant et meilleur que la documentation actuelle de Boost.

Modifier:

J'ai également écrit un script Perl qui auto-génère le makefile et le squelette du projet à partir d'une liste de noms de classes, incluant à la fois la suite de tests "tout-en-un" et une suite de tests autonome pour chaque classe. Il s'appelle makeSimple et peut être téléchargé depuis Sourceforge.net.

Ce que j'ai trouvé être le problème de base est que si vous souhaitez diviser vos tests en plusieurs fichiers, vous devez lier contre le runtime de test précompilé et ne pas utiliser la version "headers only" de Boost.Test. Vous devez ajouter #define BOOST_TEST_DYN_LINK à chaque fichier et lors de l'inclusion des en-têtes de Boost par exemple utiliser au lieu de .

Donc pour compiler en tant que test unique :

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

ou pour compiler un test individuel :

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 

// test1.cpp
#define BOOST_TEST_DYN_LINK
#ifdef STAND_ALONE
#   define BOOST_TEST_MODULE Main
#endif
#include 

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_AUTO_TEST_SUITE(test2_suite)

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

BOOST_AUTO_TEST_SUITE_END()

0 votes

Ce serait génial si vous pouviez modifier votre lien pour qu'il pointe vers le haut de la page, pas vers les commentaires.

0 votes

@danio : Édité le lien et ajouté un lien vers un script Perl qui générera automatiquement le makefile, le squelette du projet et les suites de tests unitaires.

0 votes

8voto

Crazy Eddie Points 23778

Je ne sais pas ce dont vous avez vraiment besoin en dehors de ce qui est expliqué dans le tutoriel ultérieur. J'ai fait tout ce dont j'ai besoin exactement de cette manière. Je ne suis pas sûr de comprendre non plus votre description.

Une chose que vous pourriez demander est la capacité d'avoir plus d'un fichier .cpp dans votre programme de test. C'est aussi simple que de définir BOOST_TEST_MODULE uniquement dans l'un de ces fichiers .cpp. Nous avons un fichier "driver.cpp" dans tous nos programmes de test qui définit simplement cela et inclut l'en-tête du test unitaire. Tous les autres fichiers .cpp (restreints par module ou concept) n'incluent que l'en-tête du test unitaire, ils ne définissent pas cette variable.

Si vous souhaitez à la fois pouvoir les compiler ensemble et les compiler séparément, vous pourriez utiliser votre propre variable -D pour définir BOOST_TEST_MODULE ou non.

Si vous cherchez un moyen d'exécuter plusieurs programmes de test en une seule exécution et d'obtenir un rapport, vous pouvez regarder la méthode automake pour les tests ou, encore mieux, la méthode CMake (CTest). Je suis sûr que vous pouvez utiliser CTest à partir de votre propre makefile si vous insistez.

0 votes

En tant que test, j'ai créé 2 fichiers avec des suites de tests automatiques et des cas de test automatiques et j'ai défini BOOST_TEST_MODULE dans un seul des fichiers. Lors de l'assemblage, j'ai reçu environ un bazillion d'erreurs "définition multiple de". Tout fonctionne correctement lorsque tout est dans un seul fichier.

0 votes

Essayez sans les définitions BOOST_AUTO_TEST_SUITE(). Je n'utilise pas cela. Il est possible qu'il y ait des étapes légèrement différentes nécessaires si vous utilisez ce macro. En essayant de les supprimer, vous résoudrez votre erreur de construction si c'est le cas, puis si vous en avez besoin, des expérimentations supplémentaires seront nécessaires. De plus, ne nommez pas les deux tests Test1. J'ai eu des problèmes avec cela lorsque deux tests dans des fichiers différents ont le même nom. En fait, essayez de corriger cela en premier.

0 votes

Oui, après avoir examiné le lien posté ci-dessous dans le commentaire qui inclut du code semblable à votre code modifié (et contient deux définitions de Test1), je pense que cette définition multiple d'un seul test est le problème. Le tutoriel lié ne partage pas cette caractéristique et utilise des noms différents même au sein de différentes suites.

3voto

Hindu Points 21

Quand j'ai commencé seulement avec Boost.Test, l'article suivant avec le code source était très utile : Configuration et utilisation de Boost test

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X