Какой физический макет для проектов с модульным тестированием?

На данный момент я изучаю модульное тестирование и хочу интегрировать тестирование в свой текущий (10 файлов экспериментов OpenGL) проект. Для этой цели я скачал Boost.Test, и хотя я могу понять, как он работает на примере одного файла, я понятия не имею, как интегрировать его в свой проект (я бы хотел использовать версию со статической ссылкой).

Отличается ли test двоичный файл от самого приложения? (если это один двоичный файл, как его запустить?) Должен ли я создавать тестовый файл для каждого тестируемого класса? Насколько должны измениться мои CMakeLists, чтобы отразить эту интеграцию? Можно ли отделить тестирование от приложения таким образом, чтобы я мог создать свое приложение на платформе, на которой я не устанавливал boost?

Я знаю, что у меня много вопросов, но проще говоря: как Boost.Test используется в реальной жизни?


person bisthebis    schedule 08.04.2016    source источник


Ответы (1)


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

/mylib
  CMakeLists.txt
  /inc
    ClassA.hpp
    ClassB.hpp
  /src
    ClassA.cpp
    ClassB.cpp
  /test
    ClassA_test.cpp
    ClassB_test.cpp
    main_test.cpp

Как видите, для каждого класса есть тестовый файл. Это имеет основное преимущество в уменьшении зависимостей компиляции. Затем в моем CMakeLists.txt я создаю свою библиотеку и связанный с ней тестовый бегун.

# Get Boost
find_package ( Boost COMPONENTS unit_test_framework )
# Here you set library sources, use file ( GLOB ... ) if you have many
set ( SOURCES ClassA.cpp ClassB.cpp )    
add_library ( mylib ${SOURCES} )

if (Boost_FOUND)
  # Here you set test sources, use file ( GLOB ... ) if you have many
  set ( TESTSOURCES ClassA_test.cpp ClassB_test.cpp )    
  # This creates the test runner
  add_executable (  mylib_test_runner ${TESTSOURCES} )
  # Here the tests of the runner are linked to the related library and Boost
  target_link_libraries ( mylib_test_runner mylib ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY} )
endif ( )

Файл main_test.cpp предназначен только для автоматической генерации основной функции для запуска тестов.

#define BOOST_TEST_MODULE MyTestSuite
#define BOOST_TEST_DYN_LINK
#include <boost/test/unit_test.hpp>

Тогда, например, ClassB_test.cpp может иметь следующий макет:

#include "../inc/ClassB.hpp"
#include <boost/test/unit_test.hpp>

BOOST_AUTO_TEST_SUITE ( ClassBTest )

BOOST_AUTO_TEST_CASE ( TestFoo )
{
  BOOST_CHECK(true);
}

...

BOOST_AUTO_TEST_SUITE_END() // ClassBTest

Итак, подведение итогов:

  • Отличается ли test двоичный файл от самого приложения? - Да, это возможно и, безусловно, полезно.
  • Если это один бинарник, как его запустить? - В этом случае: ./mylib_test_runner
  • Должен ли я создавать тестовый файл для каждого тестируемого класса? - Я предлагаю вам сделать.
  • Насколько должны измениться мои CMakeLists, чтобы отразить эту интеграцию? - Смотрите пример.
  • Можно ли отделить тестирование от приложения таким образом, чтобы я мог создать свое приложение на платформе, на которой я не устанавливал boost? - Об этом позаботится проверка Boost_FOUND, вы также можете добавить параметр в свой CMakeLists.txt и проверить его. Я лично думаю, что это даже лучше.
person ToniBig    schedule 09.04.2016
comment
Не следует ли мне также добавить файлы src и inc в mylib_test_runner? - person bisthebis; 09.04.2016
comment
@bisthebis Ваши тестовые файлы, конечно же, будут включать заголовки классов. Но разрешение символов будет обрабатываться компоновщиком. - person ToniBig; 09.04.2016