2016-04-08 8 views
3

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

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

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

ответ

2

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

/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 

Так подведению:

  • Испытывают ли различные бинарные файлы из самого приложения? - Да, это возможно и конечно полезно.
  • Если это один двоичный код, как его запустить? - В этом случае: ./mylib_test_runner
  • Должен ли я создать тестовый файл для каждого тестируемого класса? - Я предлагаю вам это сделать.
  • Насколько меняются мои CMakeLists, чтобы отразить эту интеграцию? - См. Пример.
  • Можно ли отделить тестирование от приложения так, чтобы я мог создать мое приложение на платформе, где я не устанавливал boost? - Проверка для Boost_FOUND позаботится об этом, вы также можете добавить опцию к вашему CMakeLists.txt и проверить на это. Я лично считаю, что это еще лучше.
+0

Не следует ли добавлять файлы «src» и «inc» в mylib_test_runner? – bisthebis

+0

@bisthebis. Ваши тестовые файлы, конечно, будут включать заголовки классов. Но разрешение символа будет обрабатываться компоновщиком. – ToniBig