Tôi đang cố gắng cấu trúc dự án của mình để bao gồm các nguồn sản xuất (trong src
thư mục con) và các thử nghiệm (trong test
thư mục con). Tôi đang sử dụng CMake để xây dựng cái này. Như một ví dụ tối thiểu tôi có các tệp sau:
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 - sử dụng sqr, không thực sự quan trọng
kiểm tra / 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)
kiểm tra / 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));
}
Một số câu hỏi:
- Liệu cấu trúc này có ý nghĩa? Các thực hành tốt nhất khi cấu trúc mã này là gì? (Tôi đến từ C # và java, và ở đó dễ hiểu hơn)
- Tôi không thích thực tế là tôi phải liệt kê tất cả các tệp từ
src
thư mục trongtest/CMakeLists.txt
tệp. Nếu đây là một dự án thư viện, tôi sẽ chỉ liên kết thư viện. Có cách nào để tránh liệt kê tất cả các tệp cpp từ dự án khác không? - Các dòng
enable_testing()
vàadd_test(MyTest test)
làm gì? Tôi chưa thấy hiệu quả. Làm cách nào tôi có thể chạy thử nghiệm từ CMake (hoặc CTest)? - Cho đến nay tôi chỉ chạy
cmake .
trong thư mục gốc, nhưng điều này tạo ra một mớ hỗn độn với các tệp tạm thời ở khắp mọi nơi. Làm thế nào tôi có thể nhận được kết quả biên dịch trong một cấu trúc hợp lý?