Помочь начать работу с Boost.Test

Я пытаюсь начать модульное тестирование. Я рассматриваю несколько фреймворков С++ и хочу попробовать Boost.Test. Документация кажется очень тщательной, и она немного подавляющая, особенно кто-то новый для модульного тестирования. Итак, вот ситуация, в которой я хочу:

Скажем, у меня есть 2 класса, Foo и Bar. Я хочу написать набор тестов для Foo и набор тестов для Bar, желательно в разных файлах. Я хочу запускать тесты только в том случае, если я запускаю программу с параметром командной строки. Поэтому мой main() должен выглядеть примерно так:

int main(int argc, const char* argv[])
{
    if (argc == 1 && strcmp(argv[0], "-test") == 0)
        run_all_tests();
    else
        return program_main(argc, argv);
}

Я думаю, что test_foo.cpp должен выглядеть примерно так:

#include "foo.hpp"
#define BOOST_TEST_MODULE Foo test
#include <boost/test/unit_test.hpp>

BOOST_AUTO_TEST_SUITE( Foo_Test )

BOOST_AUTO_TEST_CASE( Foo1 )
{
    Foo f;
    BOOST_CHECK( f.isValid() );
}

BOOST_AUTO_TEST_CASE( Foo2 )
{
    Foo f;
    BOOST_CHECK( f.baz() == 5 );
}

BOOST_AUTO_TEST_SUITE_END()

Однако я не знаю (1), какова фактическая команда для запуска тестов, и (2) как фактически сказать библиотеке, что я хочу запустить КАЖДЫЙ тест.

Итак, у кого есть опыт работы с Boost.Test? Может ли кто-нибудь помочь детально? Большое вам спасибо.

Ответ 1

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

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

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

Ответ 2

В вашем test_foo.cpp макросы добавляют тестовые пакеты и тестовые примеры в в глобальный список: master_testsuite, который является корнем всех тестов узлы. Вам просто нужно скомпилировать все тестовые файлы, например test_foo.cpp, test_boo.cpp и бегун, а затем соединить все их в исполняемый файл.

Функция unit_test_main используется для запуска тестов в master_testsuite.

boost::unit_test::unit_test_main(
    &init_unit_test,
    argc,
    argv
)

На основе макроса, который вы определили до включения <boost/test/unit_test.h>, Boost.Test уже может генерировать main для вас. [1] Сгенерированный main просто вызывается unit_test_main с argc и argv в main. Он рекомендовал используйте unit_test_main, потому что он может обрабатывать некоторые аргументы консоли, например запустить тест по имени.

Первый аргумент unit_test_main - это крючок. В зависимости от BOOST_TEST_ALTERNATIVE_INIT_API, он имеет другое определение.

#ifdef BOOST_TEST_ALTERNATIVE_INIT_API
typedef bool        (*init_unit_test_func)();
#else
typedef test_suite* (*init_unit_test_func)( int, char* [] );
#endif

Вы можете настроить master_testsuite на крючок. В секунду form, возвращаемое значение - это новый master testuite.

[1], если BOOST_TEST_MAIN и BOOST_TEST_MAIN определены, но BOOST_TEST_NO_MAIN нет.

Ответ 3

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

#ifdef DEBUG

#undef main
#define BOOST_TEST_MAIN
#include <boost/test/included/unit_test.hpp>

int DoUnitTests()

{
    char *args[] = {"", "--log_level=all", "--auto_start_dbg=yes"};

    bool result = ::boost::unit_test::unit_test_main(&init_unit_test_suite, sizeof(args) / sizeof(char*), args);

    MessageDlog("Unittests result: %s", result ? "ERRORS in Unittests" :  "Goooood!");
    return result;
}

#else
int DoUnitTests()

{
}
#endif

Ответ 4

нет автономного тестового бегуна, как в NUnit

вы просто создаете тестовые примеры как одно приложение .exe(если вы находитесь в Windows) и запускаете его

Ответ 5

Попробуйте это script Я написал, который, учитывая имя программы и список классов, будет генерировать make файл, скелет проекта и скелеты тестового набора для каждого класса/модуля. Он также устанавливает все, чтобы тестовый набор для каждого класса можно запускать как индивидуально, так и в рамках глобального набора "все-в-одном".

Он вызывает makeSimple и доступен на sourceforge.