如何在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支持在内的部分内容,因为它们和我这里讲的东西没有关系。