Вопрос: Как добиться организации тестовых комплектов и корпусов с помощью Boost?


Предисловие

Я новичок в Unit Testing и довольно новичок в C ++. Недавно у меня был некоторый опыт разработки тестов в Ruby с использованием RSpec. Теперь я пытаюсь получить аналогичную работу на C ++ с модульной модуляцией тестирования Boost.

сценарий

Я собираю заголовок и исходные файлы приложения в каталоге /src в корневой папке проекта. Как я видел это несколько раз в других программах на C ++, имея тесты в каталоге /tests в корневом каталоге проекта представляется разумным.

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

/src
  /controller
    controller_class.h
    controller_class.cpp
  /model
    model_a.h
    model_a.cpp
    model_b.h
    model_b.cpp
  /view
    simple_view.h
    simple_view.cpp

И таким образом, тесты организованы следующим образом

/tests
  TestRunner.cpp
  /controller
    controller_class_test.cpp
  /model
    model_a_test.cpp
    model_b_test.cpp
  /view
    simple_view_test.cpp

Для TestRunner.cpp Я привел пример из это сообщение в блоге :

#define BOOST_TEST_DYN_LINK
#define BOOST_TEST_MODULE "MyProgram Unit Tests"
#include <boost/test/unit_test.hpp>

проблема

Теперь я думал продолжить TestRunner.cpp с созданием базовых тестов (для контроллера, модели и представления) следующим образом

BOOST_AUTO_TEST_SUITE ( controller )
  //some stuff here
BOOST_AUTO_TEST_SUITE_END()

BOOST_AUTO_TEST_SUITE ( model )
  //some stuff here
BOOST_AUTO_TEST_SUITE_END()

BOOST_AUTO_TEST_SUITE ( view )
  //some stuff here
BOOST_AUTO_TEST_SUITE_END()

Желание

Но как я могу теперь интегрировать дополнительные вложенные тестовые пакеты и случаи в эти тестовые костюмы высшего уровня? Я, наконец, хочу, чтобы фактические тестовые примеры появлялись только в *_test.cpp файлы. Хотя каждый из этих файлов завершает тестовые примеры в один дополнительный набор тестов:

  • Главный тестовый модуль ( TestRunner.cpp)
    • Контрольный комплект для тестирования ( TestRunner.cpp)
      • Контрольный набор для контрольных классов ( controller_class_test.cpp)
        • Контрольные испытания класса контроллера ( controller_class_test.cpp)
    • Модельный тестовый комплект ( TestRunner.cpp)
      • Модельный тестовый комплект ( model_a_test.cpp)
        • Модельные испытательные корпуса ( model_a_test.cpp)
      • Модель B Test Suite ( model_b_test.cpp)
        • Испытательные корпуса модели B ( model_B_test.cpp)
    • Просмотр тестового набора ( TestRunner.cpp)
      • Простой просмотр тестового набора ( simple_view_test.cpp)
        • Простой просмотр тестовых случаев ( simple_view_test.cpp)

Вопрос

Как мне включить вложенные костюмы и дела в соответствующий пакет более высокого уровня? Я не мог найти ничего в документации Boost, хотя Структурная схема тестирования> Руководство пользователя> Организация тестирования> Набор тестов> Автоматическая регистрация  пришел довольно близко.
В Ruby с RSpec нужно просто поместить тестовые файлы (читай: *_spec.rb), как я это сделал, и его автоматически повторяя их. Думаю, с Boost я должен явно заявить об этом.


6


источник


Ответы:


Набор тестов Boost.Test аналогичен пространствам имен C ++. Вы можете перезапустить их в любое время. Каждый из ваших тестовых файлов просто должен разместить тестовые примеры в правильных наборах тестов:

controller_class_a_test.cpp:

 BOOST_AUTO_TEST_SUITE( controller )

 BOOST_AUTO_TEST_CASE( test_class_a )
 {
 }

 BOOST_AUTO_TEST_SUITE_END()


controller_class_b_test.cpp:

 BOOST_AUTO_TEST_SUITE( controller )

 BOOST_AUTO_TEST_CASE( test_class_b )
 {
 }

 BOOST_AUTO_TEST_SUITE_END()

Эта же концепция применима к тестовому дереву любой глубины. Также вам не нужен тестовый уровень TestRunner.cpp. Просто объедините все тестовые файлы в один тестовый модуль, и Boost.Test позаботится обо всем остальном.


7