如何在cmake中嵌入单元测试框架
创建时间: 2016年5月14日
工程的目录结构会有两部分:源文件(在 src
子文件夹中)以及测试(在 test
子文件夹中)。我使用CMake来构建这个工程。如果您从没用使用过cmake并且不打算在近期使用它,请直接按 Ctrl/Cmd+W
。
我选择的测试框架是Catch,不过选择其他诸如CppUnit、Boost Test Library、googletest的框架的流程应该差不多。
首先, 我把除了 main.cpp
以外的所有源代码构建到一个叫做 CommonSourceCode
的库中,并且同时在主程序和测试程序中链接这个库。
CMakeLists.txt
cmake_minimum_required (VERSION 2.8)
project (MyAwesomeProject)
...
add_subdirectory (src)
...
add_library (CommonSourceCode ${SRC_LIST})
add_executable(MyAwesomeProject src/main.cpp)
target_link_libraries (MyAwesomeProject CommonSourceCode)
add_subdirectory (test)
src/CMakeLists.txt
set(SRC_LIST ${SRC_LIST} a.hpp a.cpp b.hpp PARENT_SCOPE)
注意这里我加入的 PARENT_SCOPE
,因为我没有打算在这个目录构建可执行程序。
我使用Catch的文档中的脚本来自动从github上获取我使用Catch,并把它设置成一个external project:
test/CMakeLists.txt
include(ExternalProject)
find_package(Git REQUIRED)
ExternalProject_Add(
catch
PREFIX ${CMAKE_BINARY_DIR}/test/catch
GIT_REPOSITORY https://github.com/philsquared/Catch.git
TIMEOUT 10
UPDATE_COMMAND ${GIT_EXECUTABLE} pull
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
INSTALL_COMMAND ""
LOG_DOWNLOAD ON
)
# Expose required variable (CATCH_INCLUDE_DIR) to parent scope
ExternalProject_Get_Property(catch source_dir)
set(CATCH_INCLUDE_DIR ${source_dir}/include CACHE INTERNAL "Path to include folder for Catch")
add_library(Catch INTERFACE)
target_include_directories(Catch INTERFACE ${CATCH_INCLUDE_DIR})
add_executable (Test testmain.cpp testA.cpp testB.cpp)
target_link_libraries(Test Catch CommonSourceCode)
add_test (NAME MyTest COMMAND Test)
我省略了我的几个CMakeFile中包括c++11支持在内的部分内容,因为它们和我这里讲的东西没有关系。