Я пытаюсь структурировать мой проект, чтобы включить источники производства (в подпапку src
) и тесты (в подпапку test
). Я использую CMake для его создания. В качестве минимального примера у меня есть следующие файлы:
CMakeLists.txt:
cmake_minimum_required (VERSION 2.8)
project (TEST)
add_subdirectory (src)
add_subdirectory (test)
ЦСИ/CMakeLists.txt:
add_executable (demo main.cpp sqr.cpp)
ЦСИ/sqr.h
#ifndef SQR_H
#define SQR_H
double sqr(double);
#endif // SQR_H
ЦСИ/sqr.cpp
#include "sqr.h"
double sqr(double x) { return x*x; }
src/main.cpp - использует sqr, на самом деле не имеет значения
Тест/CMakeLists.txt:
find_package(Boost COMPONENTS system filesystem unit_test_framework REQUIRED)
include_directories (${TEST_SOURCE_DIR}/src)
ADD_DEFINITIONS(-DBOOST_TEST_DYN_LINK)
add_executable (test test.cpp ${TEST_SOURCE_DIR}/src/sqr.cpp)
target_link_libraries(test
${Boost_FILESYSTEM_LIBRARY}
${Boost_SYSTEM_LIBRARY}
${Boost_UNIT_TEST_FRAMEWORK_LIBRARY}
)
enable_testing()
add_test(MyTest test)
Тест/test.cpp:
#define BOOST_TEST_MODULE SqrTests
#include <boost/test/unit_test.hpp>
#include "sqr.h"
BOOST_AUTO_TEST_CASE(FailTest)
{
BOOST_CHECK_EQUAL(5, sqr(2));
}
BOOST_AUTO_TEST_CASE(PassTest)
{
BOOST_CHECK_EQUAL(4, sqr(2));
}
Несколько вопросов:
- Имеет ли смысл эта структура? Каковы наилучшие методы структурирования этого кода? (Я исхожу из С# и java, и там в каком-то смысле это проще)
- Мне не нравится тот факт, что я должен перечислить все файлы из папки
src
в файлеtest/CMakeLists.txt
. Если это был проект библиотеки, я бы просто связал библиотеку. Есть ли способ избежать перечисления всех файлов cpp из другого проекта? - Что делают линии
enable_testing()
иadd_test(MyTest test)
? Я не видел никакого эффекта. Как запустить тесты из CMake (или CTest)? - До сих пор я просто запускал
cmake .
в корневой папке, но это создавало беспорядок с временными файлами повсюду. Как я могу получить результаты компиляции в разумной структуре?