Я пытаюсь настроить раструб 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. Можно ли использовать ускоренную регистрацию вручную и динамическую привязку к усилению?
Либо BOOST_TEST_MODULE, либо BOOST_TEST_MAIN в сочетании с BOOST_TEST_DYN_LINK приводят к ошибке выше.«Ошибка установки теста: тестовое дерево пуста» – toftis
@ user867377 см. Edit –
Я не пробовал это. Поскольку нам удалось заставить его работать с решением, которое я предложил, это не так срочно, но я проверю его, если я получу время – toftis