CMake: Projektstruktur mit Unit-Tests
Ich versuche mein Projekt so zu strukturieren, dass die Produktionsquellen (insrc
Unterordner) und Tests (intest
Unterordner). Ich benutze CMake, um dies zu erstellen. Als minimales Beispiel habe ich folgende Dateien:
CMakeLists.txt:
cmake_minimum_required (VERSION 2.8)
project (TEST)
add_subdirectory (src)
add_subdirectory (test)
src / CMakeLists.txt:
add_executable (demo main.cpp sqr.cpp)
src / sqr.h
#ifndef SQR_H
#define SQR_H
double sqr(double);
#endif // SQR_H
src / sqr.cpp
#include "sqr.h"
double sqr(double x) { return x*x; }
src / main.cpp - verwendet sqr, spielt keine Rolle
test / 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 / 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));
}
Ein paar Fragen:
Ist diese Struktur sinnvoll? Was sind die Best Practices beim Strukturieren dieses Codes? (Ich komme aus C # und Java, und dort ist es in gewissem Sinne einfacher)Mir gefällt die Tatsache nicht, dass ich alle Dateien aus der Liste auflisten musssrc
Ordner in dertest/CMakeLists.txt
Datei. Wenn dies ein Bibliotheksprojekt wäre, würde ich nur die Bibliothek verlinken. Gibt es eine Möglichkeit zu vermeiden, alle CPP-Dateien aus dem anderen Projekt aufzulisten?Was sind die Zeilenenable_testing()
undadd_test(MyTest test)
tun? Ich habe keine Wirkung gesehen. Wie kann ich die Tests von CMake (oder CTest) ausführen?Bisher bin ich nur geranntcmake .
im Stammordner, aber dies führte überall zu einem Durcheinander mit temporären Dateien. Wie kann ich die Zusammenstellungsergebnisse in einer vernünftigen Struktur erhalten?