我正在尝试构建项目以包括生产源(在src
子文件夹中)和测试(在test
子文件夹中)。我正在使用CMake构建它。作为最小的示例,我具有以下文件:
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-使用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 / 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));
}
几个问题:
- 这种结构有意义吗?构建此代码时的最佳做法是什么?(我来自C#和Java,从某种意义上讲,它更容易实现)
- 我不喜欢必须从
src
文件中的test/CMakeLists.txt
文件夹列出所有文件的事实。如果这是一个图书馆项目,我将链接图书馆。有没有办法避免列出另一个项目中的所有cpp文件? - 哪些线路
enable_testing()
和add_test(MyTest test)
在干什么?我没有看到任何效果。如何从CMake(或CTest)运行测试? - 到目前为止,我只是运行
cmake .
在根文件夹中,但是这到处都是临时文件。如何获得合理结构的编译结果?