2014-02-12 2 views
4

Я пытаюсь настроить раструб unittest с динамической компоновкой и ручной настройкой (Not BOOST_AUTO_TEST_CASE). Я сделал тривиальный пример, чтобы воспроизвести мои ошибки:Boost unittest framework с динамическим связыванием и ручной настройкой

//SomeLib.cpp 
#define BOOST_TEST_DYN_LINK 
#include "SomeLib.h" 
int getImportantNumber(){return 1729;} 
int increaseNumber(int number){return number+1;} 

//SomeTests.cpp 
#define BOOST_TEST_DYN_LINK 
#include <boost/test/unit_test.hpp> 
#include "lib/SomeLib.h" 
#include "SomeTests.h" 
using namespace boost::unit_test; 

void SomeTests::numberIs1729(){ 
    BOOST_CHECK(getImportantNumber() == 1729); 
} 
void SomeTests::increase(){ 
    BOOST_CHECK(increaseNumber(1) == 2); 
} 

//ChainedInc.cpp 
#define BOOST_TEST_DYN_LINK 
#include <boost/test/unit_test.hpp> 
#include "lib/SomeLib.h" 
#include "ChainedInc.h" 
using namespace boost::unit_test; 

void ChainedInc::incinc(){ 
    BOOST_CHECK(increaseNumber(increaseNumber(1)) == 3); 
} 
void ChainedInc::incincinc(){ 
    BOOST_CHECK(increaseNumber(increaseNumber(increaseNumber(1))) == 4); 
} 

//Master.cpp 
#define BOOST_TEST_DYN_LINK 
#include <boost/bind.hpp> 
#include <boost/smart_ptr.hpp> 
#include <boost/test/unit_test.hpp> 
#include "SomeTests.h" 

using namespace boost::unit_test; 
test_suite* init_unit_test_suite(int, char**) 
{ 
    test_suite* ts1 = BOOST_TEST_SUITE("Suite1"); 

    boost::shared_ptr<SomeTests> test1 (new SomeTests()); 
    ts1->add(BOOST_TEST_CASE(boost::bind(&SomeTests::numberIs1729, test1))); 
    ts1->add(BOOST_TEST_CASE(boost::bind(&SomeTests::increase, test1))); 

    framework::master_test_suite().add(ts1); 
    return 0; 
} 

Когда я запускаю этот код, я получаю следующее сообщение об ошибке:

/usr/bin/g++ test/ChainedInc.cpp.1.o test/Master.cpp.1.o test/SomeTests.cpp.1.o lib/SomeLib.cpp.2.o -o /home/mto/src/manualBoost/build/test/app -Wl-Bdynamic -L/usr/lib64 -lboost_unit_test_framework 

/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64/crt1.o: In function `_start': 
(.text+0x20): undefined reference to `main' 
collect2: ld returned 1 exit status 

Это Usally решается путем добавления

#define BOOST_TEST_DYN_LINK 

в все тестовые файлы и

#define BOOST_TEST_MODULE something 

до одного произвольного тестового файла. Однако последнее определение не работает хорошо, когда тесты ускорения регистрируются вручную. Если я пытаюсь запустить свои тесты после того, как с помощью этого определения я получаю

build/test/app 

Test setup error: test tree is empty 

См Boost test does not init_unit_test_suite. Можно ли использовать ускоренную регистрацию вручную и динамическую привязку к усилению?

ответ

0

Мне удалось получить ручную настройку теста для работы с динамической компоновкой для повышения, когда я использовал только библиотеки заголовков.

-#include <boost/test/unit_test.hpp> 
+#include <boost/test/included/unit_test.hpp> 
1

Обязательный параметр: #define BOOST_TEST_MAIN согласно вашему связанному вопросу.

Ваш код, представленный не содержит этого определения (ни BOOST_TEST_MODULE)

Как я понимаю the docs, вам нужно BOOST_TEST_MAIN при определении init_unit_test_suite себя и использовать BOOST_TEST_MODULE, если вы используете автоматический материал:

BOOST_TEST_MODULE -- Define this flag to generate the test module initialization function, which uses the defined value to name the master test suite. In case of dynamic library variant default function main() implementation is generated as well


Также, old example from the boost docs показывает это:

test_suite* 
init_unit_test_suite(int argc, char* argv[]) 
{ 
    test_suite* test = BOOST_TEST_SUITE("Master test suite"); 

    test->add(BOOST_TEST_CASE(&my_test_function)); 

    return test; //++++++++++++++ 
} 

который является то, что мы делаем для мастер набора тестов настройки (мы на Boost, 1,44 атм.)

Но ваш код выше показывает, что это:

... 
    framework::master_test_suite().add(ts1); 
    return 0; 
} 

, который, кажется, от некоторых более новых часть документов Boost.Test.

Возможно, вам нужно вернуть мастер-набор тестов (один раз) в функцию init_unit_test_suite? Вы пробовали это?

+0

Либо BOOST_TEST_MODULE, либо BOOST_TEST_MAIN в сочетании с BOOST_TEST_DYN_LINK приводят к ошибке выше.«Ошибка установки теста: тестовое дерево пуста» – toftis

+0

@ user867377 см. Edit –

+0

Я не пробовал это. Поскольку нам удалось заставить его работать с решением, которое я предложил, это не так срочно, но я проверю его, если я получу время – toftis

3

BOOST_TEST_MAIN должен быть определен только в одном модуле. Он тянет определение основного. Если вы определите его в нескольких модулях, вы будете иметь многократно определенный основной.

См. Мой documentation rewrite для объяснения этих макросов конфигурации.

+0

, спасибо за перезапись документов Boost - гораздо проще читать и понимать. Большая помощь! –

Смежные вопросы