Ich versuche, mein Projekt so zu strukturieren, dass es die Produktionsquellen (im src
Unterordner) und Tests (im test
Unterordner) enthält. Ich benutze CMake, um dies zu erstellen. Als minimales Beispiel habe ich die folgenden 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 bei der Strukturierung dieses Codes? (Ich komme aus C # und Java, und dort ist es in gewissem Sinne einfacher)
- Mir gefällt nicht, dass ich alle Dateien aus dem
src
Ordner in dertest/CMakeLists.txt
Datei auflisten muss. Wenn dies ein Bibliotheksprojekt wäre, würde ich einfach die Bibliothek verknüpfen. Gibt es eine Möglichkeit zu vermeiden, dass alle CPP-Dateien aus dem anderen Projekt aufgelistet werden? - Was sind die Zeilen
enable_testing()
undadd_test(MyTest test)
tun? Ich habe keinen Effekt gesehen. Wie kann ich die Tests von CMake (oder CTest) ausführen? - Bisher bin ich nur
cmake .
im Stammordner gelaufen , aber dies hat überall zu einem Durcheinander mit temporären Dateien geführt. Wie kann ich die Kompilierungsergebnisse in einer vernünftigen Struktur erhalten?