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

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

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

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

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

и я написал еще один основной метод для запуска тестовых функций. Eclipse это не понравилось, потому что в одном проекте у меня было два основных метода. Я порылся в свойствах проекта и не нашел ничего полезного для отделения моего производственного кода от тестового кода при сборке (действительно, линковке). Мое временное решение заключалось в том, чтобы просто использовать g++ в терминале и специально скомпилировать только мой «тестовый» код.

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

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

Изменить: я нашел В этой статье представлена ​​вводная информация о тестировании ускорения, но в ней не обсуждается, как это можно сделать в среде IDE.


person Joshua Detwiler    schedule 27.06.2017    source источник


Ответы (1)


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

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

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

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

Щелкните «Проект», «Создать конфигурации», «Управление ...», выберите «Создать ...» и назовите его «Тест» (или что-то другое, кроме test). Выберите существующую конфигурацию, чтобы мы унаследовали свойства от производственной сборки.

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

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

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

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

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

Нажмите «Выполнить», «Выполнить конфигурации ...» и, глядя на текущую конфигурацию запуска, объедините эти параметры, присвоив, например, отладочной сборке имя «Debug Build», приложению C / C ++ «Debug / Artifact_Name» и Конфигурация сборки «Отладка». Затем создайте новую конфигурацию запуска и назовите ее что-то вроде «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 есть fixtures, которые позволяют многократно вызывать ранее существовавшее состояние объекта.
  • struct - это то, что группирует эти приспособления, и это подразумевает, что ваш объект должен иметь четко определенные конструктор и деструктор для автоматического определения области видимости (если вы не вызывали new, вам не нужно delete в разборке)
  • наборы тестов - это просто способ логически сгруппировать ваши тестовые примеры (я еще не тестировал его, но вы, вероятно, можете разбить свои наборы на несколько файлов для лучшего логического разделения)

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

person Joshua Detwiler    schedule 29.06.2017