Я использую Boost.Test для моего модульного тестирования. Я хотел бы, чтобы весь тестовый код находился в отдельной dll, чтобы тестовый код не доставлялся, и мой производственный код не раздулся.
Для этого я рассмотрел наличие ручных тестовых случаев в dll и иметь dll экспортировать метод
// Test cases DLL code
// exported method
__declspec(dllexport) test_suite *GetTestSuite()
{
test_suite* ts1 = BOOST_TEST_SUITE( "manual_test_suite1" );
ts1->add( BOOST_TEST_CASE( &manual_test_case1 ) );
ts1->add( BOOST_TEST_CASE( &manual_test_case2 ) );
return ts1;
}
От моего тестового участника я могу вызвать этот метод внутри моего init_unit_test_suite как
bool init_unit_test_suite()
{
test_suite * ts = GetTestSuite();
framework::master_test_suite().add( ts );
return true;
}
Но контрольные примеры не подобраны. Тем не менее, тестовые случаи, которые у меня есть в тестовом центре, локально подбираются.
Я связываюсь со статической библиотекой BOOST и имею свой собственный основной, определяя
// Test runner app code
#define BOOST_TEST_NO_LIB
#define BOOST_TEST_NO_MAIN
в моем тесте бегуна.
Что не так с этой комбинацией? Как я могу добиться разделения тестовых случаев в отдельных библиотеках, а также иметь внешний тестер?
РЕДАКТИРОВАТЬ: командная строка, которую я использую для вызова тестовых случаев:
char *myargv[] = {"", "--log_level=test_suite", "report_level=detailed", "output_format=xml", "--run_test=manual_test_suite1"};
argc = _countof(myargv);
unit_test_main((init_unit_test_func) &init_unit_test_suite, argc, myargv );
Ошибка, которую я получаю с приведенной выше командной строкой:
Test setup error: no test cases matching filter
Я нашел проблему. Мой тестраннер динамически связывался с Boost.Test. Но мой тестовый dll статически связывался с Boost. Я изменил его на динамическое связывание, и теперь все работает нормально.
Других решений пока нет …