IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Boost C++ Discussion :

Boost.Test : organisation en modules


Sujet :

Boost C++

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2008
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Janvier 2008
    Messages : 28
    Points : 19
    Points
    19
    Par défaut Boost.Test : organisation en modules
    Bonjour,
    J'ai un projet organisé comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    +com
    |+masociete
    ||+buisness
    |||-Classes1
    |||-Classes2
    |||...
    ||+support
    |||-Classes3
    |||-Classes4
    |||...
    ||...
    Je shouaite écrire les tests de chacune de mes classe dans un fichier séparé avec pour chaque fichier une 'test suite' regroupant tous les 'test case' applicables à la classe en question.

    Je souhaite également définir une test suite au niveau de chaque package pour regrouper les test suites de niveau inférieur pour n'avoir au final qu'une suite au niveau du projet qui lance récursivement tous les tests.

    Les essais que j'ai fait en utilisant les macros BOOST_AUTO_TEST_SUITE et BOOST_AUTO_TEST_CASE provoquent des erreurs de link dès que j'ai des tests dans plus d'un fichier.

    Voici un exemple de ce que j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //Classe1Tests.cpp
    #define BOOST_TEST_MODULE allTests
    #include <boost/test/unit_test.hpp>
     
    BOOST_AUTO_TEST_SUITE(Classe1TestsSuite);
    BOOST_AUTO_TEST_CASE( test1 ){
    	BOOST_CHECK(1 == 2-1);
    }
    BOOST_AUTO_TEST_SUITE_END();
    Tant que je n'ai que ce qui précède dans mon projet, tout va.
    Par contre, si j'ajoute ce qui suit, rien ne va plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //Classe2Tests.cpp
    #define BOOST_TEST_MODULE allTests
    #include <boost/test/unit_test.hpp>
     
    BOOST_AUTO_TEST_SUITE(Classe2TestsSuite);
    BOOST_AUTO_TEST_CASE( test2 ){
    	BOOST_CHECK(1 != 2);
    }
    BOOST_AUTO_TEST_SUITE_END();
    Voici ce que j'ai au link :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    In function `Z20init_unit_test_suiteiPPc':
    C:/dev/boost_1_34_1/boost/test/unit_test_suite.hpp:184: multiple definition of `init_unit_test_suite(int, char**)'
    tests\main.o(.text+0x12):C:/dev/boost_1_34_1/boost/test/unit_test_suite.hpp:184: first defined here
    Build error occurred, build is stopped
    Qu'est-ce que je fais mal ?

    P.S. Je suis sous Windows XP, Eclipse CDT, BOOST 1.34.1 compilé avec MinGW

  2. #2
    Membre à l'essai
    Inscrit en
    Janvier 2008
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Janvier 2008
    Messages : 28
    Points : 19
    Points
    19
    Par défaut
    J'ai trouvé un contournement basé sur la version "heders only" (sans lib compilée) de boost_unit_test_framwork. Mon projet a donc le répertoire boost dans son "include path", mais ne link aucune librairie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //Classe1Tests.cpp
    #include <boost/test/included/unit_test.hpp>
    BOOST_AUTO_TEST_CASE( totoTestCase ){
    	BOOST_CHECK_EQUAL(1, 2-1);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //Classe2Tests.cpp
    #include <boost/test/included/unit_test.hpp>
    BOOST_AUTO_TEST_CASE( tutuTestCase ){
    	BOOST_CHECK(1 == 2-1);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    //main.cpp
    #define BOOST_TEST_MAIN
    #include <boost/test/included/unit_test.hpp>
    BOOST_AUTO_TEST_CASE( titiTestCase ){
    	BOOST_CHECK(3 == 2+1);
    }
    Il serait plus propre de faire un include de <boost/test/unit_test.hpp> (et pas <boost/test/included/unit_test.hpp>) et un link sur libboost_unit_test_framwork.a, mais je n'y arrive pas (du moins pas encore )

    Mes investigations de ces derniers jour m'ont appris que les #define à faire varient suivant le type de la librairie sur laquelle ont link.
    Dans le cas d'une liaison statique (cas des deux solutions du paragraphe précédent), il faut que BOOST_TEST_MAIN ne soit défini qu'une fois lors des différents include de "unit_test.hpp" pour un exécutable.

  3. #3
    Membre à l'essai
    Inscrit en
    Janvier 2008
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Janvier 2008
    Messages : 28
    Points : 19
    Points
    19
    Par défaut
    çà y'est, çà marche aussi en linkant
    C'est ma librairie statique qui ne plaisait pas à mon compilo.

    Solution en bref :
    - récupération de boost
    - récupération et installation de MinGW
    - récupération des sources de bjam
    - compilation de bjam en spécifiant le "toolset" en argument (build.bat mingw)
    - compilation de boost en spécifiant le "toolset" en argument (bjam --toolset=gcc-3.4.5 stage). Attention c'est un peu long ...
    - pour ne pas avoir à ajouter d'include directory dans chacun des projets eclipse, copier le sous repertoire boost de la distrib boost (C:\dev\boost_1_34_1\boost dans mon cas) dans le répertoire include de MinGW (C:\dev\msys\MinGW\include chez moi)
    - dans eclipse, création d'un projet C++ (exécutable windows avec la toolchain MinGW gcc)
    - dans les propriétés du projet -> C/C++ build -> MinGW C++ linker -> Libraries : ajouter le répertoire stage de boost au search path et une version fraichement compilée de boost_unit_testing_framework (boost_unit_test_framework-mgw34-d-1_34_1 dans mon cas) à la liste des lib.
    - création d'un et un seul fichier contenant #define BOOST_TEST_MAIN (le fichier contenant la racine des tests
    - inclusion de <boost/test/unit_test.hpp> dans chacun des fichiers de test


Discussions similaires

  1. [1.x] Organisations des modules
    Par Ryo_Saeba dans le forum Symfony
    Réponses: 2
    Dernier message: 11/04/2008, 12h20
  2. Comment faire des test avec boost::test
    Par cdm1024 dans le forum Boost
    Réponses: 5
    Dernier message: 19/02/2008, 18h37
  3. boost test : comment ajouter du code au main ?
    Par ch4mp dans le forum Boost
    Réponses: 2
    Dernier message: 15/02/2008, 13h59
  4. [vba Excel ] Organisation Des Modules
    Par CIBOOX dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 26/01/2007, 11h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo