Подтвердить что ты не робот

Boost.Test: поиск рабочего нетривиального тестового набора Пример/учебник

Документация Boost.Test и примеры на самом деле не содержат каких-либо нетривиальных примеров, и до сих пор два учебника, которые у меня есть здесь здесь и здесь, хотя полезные оба являются довольно базовыми.

Я хотел бы иметь мастер-тестовый набор для всего проекта, при этом поддерживая каждый набор модулей модульных тестов и приборов, которые можно запускать независимо. Я также буду использовать макетный сервер для тестирования различных случаев с сетью.

Я на Ubuntu 8.04, но я возьму любой пример Linux или Windows, так как я пишу свои собственные make файлы в любом случае.

Edit

В качестве теста я сделал следующее:

// test1.cpp
#define BOOST_TEST_MODULE Regression
#include <boost/test/included/unit_test.hpp>

BOOST_AUTO_TEST_SUITE(test1_suite)

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

BOOST_AUTO_TEST_SUITE_END()

// test2.cpp
#include <boost/test/included/unit_test.hpp>

BOOST_AUTO_TEST_SUITE(test2_suite)

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

BOOST_AUTO_TEST_SUITE_END()

Затем я скомпилирую его: g++ test1.cpp test2.cpp -o tests

Это дает мне о bazillion "множественном определении" ошибок при связывании.

Когда все в одном файле работает нормально.

4b9b3361

Ответ 1

С++ Unit Testing с Boost.Test

Вышеупомянутая статья является блестящей и лучше, чем фактическая документация Boost.

Изменить:

Я также написал Perl script, который будет автоматическое создание make файла и проекта скелет из списка имен классов, включая тест "все-в-одном" набор и самостоятельный набор тестов для каждый класс. Он назвал makeSimple и может быть загружен от Sourceforge.net.

Я обнаружил, что основная проблема заключается в том, что если вы хотите разделить свои тесты на несколько файлов, вам нужно связать их с предварительно скомпилированной тестовой версией, а не использовать версию Boost.Test только с заголовками. Вы должны добавить #define BOOST_TEST_DYN_LINK к каждому файлу, а при включении заголовков Boost используйте <boost/test/unit_test.hpp> вместо <boost/test/included/unit_test.hpp>.

Итак, чтобы скомпилировать как один тест:

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

или для компиляции индивидуального теста:

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 <boost/test/unit_test.hpp>

// test1.cpp
#define BOOST_TEST_DYN_LINK
#ifdef STAND_ALONE
#   define BOOST_TEST_MODULE Main
#endif
#include <boost/test/unit_test.hpp>

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/test/unit_test.hpp>

BOOST_AUTO_TEST_SUITE(test2_suite)

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

BOOST_AUTO_TEST_SUITE_END()

Ответ 2

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

Одна вещь, которую вы можете просить, - это возможность иметь более одного файла .cpp в вашей тестовой программе. Это так просто, как только определение BOOST_TEST_MODULE в одном из этих .cpp файлов. У нас есть файл "driver.cpp" во всех наших тестовых программах, которые просто определяют это и включают заголовок unit test. Все остальные .cpp файлы (с областью действия модуля или концепции) включают только заголовок unit test, они не определяют эту переменную.

Если вы хотите, чтобы оба могли скомпилировать их вместе и скомпилировать их отдельно, вы можете использовать свою собственную переменную -D для определения BOOST_TEST_MODULE или нет.

Если вы ищете способ запустить кучу тестовых программ за один прогон и получить отчет, вы можете посмотреть на метод automake для проведения тестов или, еще лучше, метод CMake (CTest). Довольно уверен, что вы можете использовать CTest из своего собственного файла makefile, если вы настаиваете.