Помощь в начале использования Boost.Test - PullRequest
11 голосов
/ 08 июня 2009

Я пытаюсь начать модульное тестирование. Я смотрю на несколько C ++ фреймворков и хочу попробовать 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? Может кто-нибудь помочь детально? Большое вам спасибо.

Ответы [ 5 ]

12 голосов
/ 08 июня 2009

В ваши 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 на крючке. Во-вторых форма, возвращаемое значение - новый мастер набор тестов.

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

5 голосов
/ 08 июня 2009

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

#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
3 голосов
/ 08 июня 2009

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

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

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

0 голосов
/ 28 июня 2010

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

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

0 голосов
/ 08 июня 2009

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

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

...