C++ Boost Test, структура пакета и настройки проекта Eclipse

Я использую C++98, и, кроме стандартной библиотеки, у меня есть доступ только к старой версии Boost (которая, к счастью, имеет Boost Test). Документация хотя и устрашающая, длинная, и я просто не знаю, с чего начать.

У меня есть некоторый опыт выполнения модульного тестирования в Java (и я ищу модульное тестирование в C++), и я видел test пакеты, содержащие код модульного теста отдельно от src пакет, и я также увидел, где вы положили свой модульный тест? а также модульное тестирование с Boost и Eclipse. Их предложения различаются и приводят обоснование различных структур упаковки для отделения тестового кода от производственного кода или их объединения.

Еще до того, как я начал изучать Boost Test, я создал эту структуру в Eclipse (возможно, ошибочно):

-- ProjectName
   |-- Debug
   |-- src
   |-- test

и я написал другой основной метод для запуска тестовых функций. Затмению это не понравилось, потому что у меня было два основных метода в одном проекте. Я покопался в Project Properties и не нашел ничего полезного для отделения моего производственного кода от тестового кода при сборке (на самом деле, связывание). Мое временное решение было просто использовать g++ в терминале и ad hoc скомпилируйте только мой "тестовый" код.

Я нашел что-то, предлагающее на Boost::Test - генерация Main()? этот Boost фактически сгенерировал свой собственный основной метод, так что в настоящее время это мой план атаки на модульное тестирование, особенно за то, что уже имеется библиотека инструментов тестирования.

  • Каков обычный способ организации модульных тестов для C++?
  • Как начать работу с Boost Test? (Boost уже установлен)
  • Есть ли что-то, что мне нужно изменить в Eclipse, чтобы иметь возможность запускать мои модульные тесты Boost отдельно от моего производственного кода в IDE? (Одна из замечательных особенностей IntelliJ с Java - это то, что он автоматически запускает любой основной метод, который вам нравится, одним щелчком мыши). Цель здесь - создать и запустить мои тесты в Eclipse.
  • Должны ли мои тесты быть в отдельном проекте Eclipse? (это было предложено в ответе на второй вопрос, который я связал)

Изменить: я нашел эту статью для введения в Boost Test, но он не обсуждает, как он может быть обработан в настройке IDE.

1 ответ

Решение

Я выяснил, как это сделать самостоятельно, и запишу свое решение для тех, кто только начинает работать с C++ и нуждается в тестировании своего кода. Там в настоящее время нет хорошего введения где-либо, что я мог бы найти. Вот ресурсы, которые я использовал (и нашел полезными):

Соглашение C++ для тестирования такое же, как и в других языках кодирования, просто напишите свои тесты в каталоге с именем test по проекту. Использование Boost Test требует, чтобы вы связали структуру модульного теста: -l boost_unit_test_framework который в Eclipse:

Щелкните правой кнопкой мыши по своему проекту, перейдите в Свойства, Сборка C/C++, Настройки, Настройки инструмента, GCC C++ Linker, Библиотеки и добавьте имя библиотеки. boost_unit_test_framework (добавлять -mt на имя, если вам требуется многопоточность; Кроме того, после того, как тестовая конфигурация сборки существует, вы можете вернуться и выбрать именно эту конфигурацию для связи с библиотекой - это уменьшит размер вашего исполняемого файла для других ваших сборок).

Чтобы иметь возможность запускать модульные тесты в Eclipse отдельно от вашего основного метода, нам нужно установить новую конфигурацию сборки. Таким образом, Eclipse знает, как исключить ваш исходный файл основным методом при выполнении ваших тестов.

Нажмите на Project, Build Configurations, Manage... и выберите New... и назовите его Test (или что-то другое, кроме test). Выберите существующую конфигурацию, чтобы мы наследовали свойства из производственной сборки.

Далее нам нужно отличить конфигурации сборки друг от друга, чтобы при их создании они фактически соответствовали производственной и тестовой сборкам.

Щелкните правой кнопкой мыши на test, Конфигурации ресурсов, Исключить из сборки... и выберите сборки, которые представляют вашу производственную сборку (например, Отладка и / или Выпуск). Сделав это, щелкните правой кнопкой мыши по исходному файлу с помощью метода main и исключите его из тестовой сборки.

Есть еще кое-что, что нам нужно изменить. У нас пока нет тестового кода, но мы все еще не можем запустить нашу тестовую сборку, и наша тестовая сборка не будет знать о ресурсах, существующих в src потому что Eclipse не будет автоматически включать эти исходные файлы. Они практически невидимы для вашего тестового кода в test,

Щелкните правой кнопкой мыши по своему проекту, перейдите в Свойства, Сборка C/C++, Настройки, Настройки инструментов, Компилятор GCC C++, Включает, и добавьте путь /.../workspace/ProjectName,

Теперь, чтобы иметь возможность запустить тестовую сборку в Eclipse, ему нужно знать, какой исполняемый файл вы ожидаете запустить в среде IDE.

Нажмите Run, Run Configurations... и, глядя на текущую конфигурацию run, объедините эти параметры, указав, например, отладочную сборку с именем Debug Build, приложение C/C++ "Debug/Artifact_Name" и Конфигурация сборки "Debug". Затем создайте новую конфигурацию запуска и назовите ее чем-то вроде "Test Build", установите для приложения C/C++ значение "Test/Artifact_Name" и убедитесь, что для конфигурации сборки выбрано "Test".

Теперь вы сможете переключаться между запуском рабочего кода и тестового кода, выбрав "активную" конфигурацию сборки или запустив правильную конфигурацию запуска.

Наконец, вот пример модульного теста с Boost Test после того, как все это настроено:

//unit_tests.cpp
#define BOOST_TEST_DYN_LINK
#define BOOST_TEST_MODULE someModuleName
#include <boost/test/unit_test.hpp>
#include <src/some_object.h>

struct template_objects {
    some_object x;
    template_objects() {
        BOOST_TEST_MESSAGE("Setting up testing objects");
    }
    ~template_objects() {
        BOOST_TEST_MESSAGE("Tearing down testing objects");
    }
}

BOOST_FIXTURE_TEST_SUITE(testSuiteName, template_objects)

BOOST_AUTO_TEST_CASE(testCase1) {
    x.update();
    BOOST_CHECK(x.is_up_to_date());
}
BOOST_AUTO_TEST_CASE(testCase2) {
    BOOST_CHECK(x.is_not_up_to_date());
}

BOOST_AUTO_TEST_SUITE_END()

Это демонстрирует некоторые важные вещи об использовании Boost Test:

  • определяющий BOOST_TEST_DYN_LINK Рекомендовано; вам нужно определить способ связывания инфраструктуры тестирования, прежде чем включать любую из библиотек Boost
  • Вы должны назвать "модуль" как-то, не обязательно имя файла
  • для автоматической настройки и демонтажа объектов перед вводом тестовых примеров в Boost Test есть приспособления, которые позволяют несколько раз вызывать ранее существовавшее состояние объекта
  • struct это то, что группирует эти приборы, и подразумевается, что ваш объект должен иметь четко определенный конструктор и деструктор для автоматического определения области действия (если вы не вызывали newтебе не нужно delete в сносе)
  • тестовые наборы - это просто способ логически сгруппировать ваши тестовые примеры (я еще не тестировал их, но вы можете разбить ваши наборы на несколько файлов для лучшего логического разделения)

Дополнительная подсказка: чтобы сделать Boost Test более подробным, перейдите к конфигурации запуска для сборки теста и добавьте аргумент --log_level=test_suite,

Другие вопросы по тегам