Включение нескольких тестов в проект CMake

307
24 апреля 2018, 03:11

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

Vector2fTest.cpp

// Connects .cpp file, because don't need to
// create a library for testing with .h and .cpp files
#include "Math/Vectors/Vector2f.cpp"
#define BOOST_TEST_MODULE Vector2fTest
#include <boost/test/unit_test.hpp>
BOOST_AUTO_TEST_SUITE(suiteVectors2f)
BOOST_AUTO_TEST_CASE(addVectors2f)
{
    float x = 5.0f;
    float y = 10.0f;
    Math::Vector2f currVector2f(x, y);
    Math::Vector2f otherVector2f(x, y);
    currVector2f.add(otherVector2f);
    BOOST_CHECK_EQUAL(currVector2f.x, x + x);
    BOOST_CHECK_EQUAL(currVector2f.y, y + y);
}
BOOST_AUTO_TEST_CASE(subVectors2f)
{
    float x = 3.0f;
    float y = 7.0f;
    Math::Vector2f currVector2f(x, y);
    Math::Vector2f otherVector2f(x, y);
    currVector2f.sub(otherVector2f);
    BOOST_CHECK_EQUAL(currVector2f.x, x - x);
    BOOST_CHECK_EQUAL(currVector2f.y, y - y);
}
...
BOOST_AUTO_TEST_SUITE_END()

Vector3fTest.cpp

// Connects .cpp file, because don't need to
// create a library for testing with .h and .cpp files
#include "Math/Vectors/Vector3f.cpp"
#define BOOST_TEST_MODULE Vector3fTest
#include <boost/test/unit_test.hpp>
BOOST_AUTO_TEST_SUITE(suiteVectors3f)
BOOST_AUTO_TEST_CASE(addVectors3f)
{
    float x = 5.0f;
    float y = 10.0f;
    float z = 1.0f;
    Math::Vector3f currVector3f(x, y, z);
    Math::Vector3f otherVector3f(x, y, z);
    currVector3f.add(otherVector3f);
    BOOST_CHECK_EQUAL(currVector3f.x, x + x);
    BOOST_CHECK_EQUAL(currVector3f.y, y + y);
    BOOST_CHECK_EQUAL(currVector3f.z, z + z);
}
BOOST_AUTO_TEST_CASE(subVectors3f)
{
    float x = 3.0f;
    float y = 7.0f;
    float z = 1.0f;
    Math::Vector3f currVector3f(x, y, z);
    Math::Vector3f otherVector3f(x, y, z);
    currVector3f.sub(otherVector3f);
    BOOST_CHECK_EQUAL(currVector3f.x, x - x);
    BOOST_CHECK_EQUAL(currVector3f.y, y - y);
    BOOST_CHECK_EQUAL(currVector3f.z, z - z);
}
...
BOOST_AUTO_TEST_SUITE_END()

CMakeLists.txt

make_minimum_required (VERSION 3.8)
include_directories (${CMAKE_SOURCE_DIR}/Sources)
set (TESTS Vector3fTest.cpp Vector2fTest.cpp) #MovableObjectTest.cpp)
add_definitions (-DBOOST_TEST_DYN_LINK)
find_package (Boost COMPONENTS unit_test_framework REQUIRED)
add_executable (Test${PROJECT_NAME} ${TESTS})
target_include_directories (${PROJECT_NAME} PRIVATE 
${Boost_INCLUDE_DIRS})
target_link_libraries (Test${PROJECT_NAME} ${Boost_LIBRARIES})
add_test (NAME Vector2fTest COMMAND addVectors2f subVectors2f mulVectors2f divVectors2f)
add_test (NAME Vector3fTest COMMAND addVectors3f subVectors3f mulVectors3f divVectors3f)

Ошибка

CMakeFiles/TestFastEngine.dir/Vector2fTest.cpp.o: In function `init_unit_test()':
/usr/include/boost/test/unit_test_suite.hpp:338: multiple definition of `init_unit_test()'

CMakeFiles/TestFastEngine.dir/Vector3fTest.cpp.o:/usr/include/boost/test/unit_test_suite.hpp:338: first defined here CMakeFiles/TestFastEngine.dir/Vector2fTest.cpp.o: In function main': /usr/include/boost/test/unit_test.hpp:62: multiple definition ofmain' CMakeFiles/TestFastEngine.dir/Vector3fTest.cpp.o:/usr/include/boost/test/unit_test.hpp:62: first defined here collect2: error: ld returned 1 exit status

Answer 1

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

сmake_minimum_required (VERSION 3.8)
find_package (Boost COMPONENTS unit_test_framework REQUIRED)
add_definitions (-DBOOST_TEST_DYN_LINK)
include_directories ( ${CMAKE_SOURCE_DIR}/Sources
                      ${Boost_INCLUDE_DIRS})
set (TESTS Vector3fTest Vector2fTest) #MovableObjectTest)
foreach (_test ${TESTS})
  add_executable (${_test} ${_test}.cpp)
  target_link_libraries (${_test} ${Boost_LIBRARIES})
  add_test (NAME ${_test} COMMAND ${_test)
endforeach ()

Запускать все тесты пакетом можно с помощью make test (если добавить в CMakeLists.txt команду enable_testing ()) или с помощью утилиты ctest bp пакета cmake'а. Последняя кроме прочего умеет запускать только определённые тесты по регулярному выражению от имени и делать много-чего ещё.

READ ALSO
Как в QTableView добавить ссылку на файл?

Как в QTableView добавить ссылку на файл?

Возможно в ячейку добавить несколько ссылок на файлы? Допустим я QFileDialog выбираю несколько файлов и по нажатию добавить строку в таблицу, в ячейке...

311
Объяснения арифметики (код С++)

Объяснения арифметики (код С++)

Имеется кодЧто делает "typedef", "static const u256t1" и фрагменты "o1 += (o2^t1)

275
Как устно решить элементарную задачу с логическим выражением на делимость чисел

Как устно решить элементарную задачу с логическим выражением на делимость чисел

Добрый деньЕсть функция D(n, m), проверяющая, кратно ли натуральное число n натуральному числу m (пишу на C++ 11):

250
Ассемблер. Арифметика

Ассемблер. Арифметика

Найти целочисленное решение уравнения a*x+b=0, если оно существуетВопрос: как разделить -b на a

272