建立简单的带单元测试的CMake项目 | Blurred code

建立简单的带单元测试的CMake项目

panda

2019/03/24

Updated:2019/04/04

Categories: cpp

前言

Cmake是一个跨平台的C/C++项目组织管理工具,虽然许多IDE都有私有的项目管理工具,但是在现在2019年,各大IDE基本都支持了CMAKE的管理,所以如果有跨平台的需求,使用CMAKE管理是最方便的。

包含单元测试的简单工程

CMAKE支持gtest,cppunit这种单元测试框架,当然也可以使用断言自定义单元测试,我在一个小项目里用了一个纯c宏编写的小型单元测试 github/minunit,与Cmake的搭配很好。


一个典型的项目目录

│  .gitignore
│  CMakeLists.txt
├─include
│      xxxxx.h
├─src
│      main.cpp
├─build
│      ...          
└─test
        xxx_test.cpp
        CMakeLists.txt

其中test目录可以作为子项目,和主目录分开编译,避免main函数重复。

主目录的CMakeLists.txt

CMake主要通过分析CMakeLists.txt所规定的条件来生成对应平台的Makefile,所以CMakeLists.txt需要手动编写。

cmake_minimum_required(VERSION 2.8)
set(CXX_STANDARD_REQUIRED 11)
set(CMAKE_CXX_FLAGS   "-g")                     # 调试信息
set(CMAKE_CXX_FLAGS   "-Wall")                  # 开启所有警告
project(PDSTL)
set(PROJECT_BINARY_DIR ${CMAKE_SOURCE_DIR}/build)
aux_source_directory(${CMAKE_SOURCE_DIR}/src proj_src)
add_executable(${PROJECT_NAME} ${proj_src})
add_subdirectory(test)
enable_testing()
add_test(test_xxx ${CMAKE_SOURCE_DIR}/build/test/test_xxx)

下面来逐一解释

传递编译参数

如果需要向编译器传递参数,如传递优化级别,设置警告级别等,可以向CMAKE传递CMAKE_CXX_FLAGS参数。 细化的还有CMAKE_CXX_FLAGS_DEBUGCMAKE_CXX_FLAGS_RELEASE

建立构建目标

add_executable(${PROJECT_NAME} ${proj_src}) 其中的${}都是简单的宏替换,是根据project(xxx)中推出来的。这一步是传递给CMAKE编译的目标。

子项目

add_subdirectory(test),要求子目录里必须有一个子CMakeLists.txt,包含了子目录的编译信息。

单元测试

enable_testing() 这里提示cmake添加一个test的编译目标,调用make test会编译所有下列的add_test的目标并运行。 add_test(test_xxx ${CMAKE_SOURCE_DIR}/build/test/test_xxx)不难理解,add_test(test_name binary_location),前一个参数是某一个单元测试的名字,后一个参数是该单元测试的路径。

test目录的CMakeLists.txt

test作为子项目,主要要生成单元测试的二进制文件。

project(test)
cmake_minimum_required(VERSION 2.8)
INCLUDE_DIRECTORIES("${CMAKE_SOURCE_DIR}/include")
set(PROJECT_TEST_BINARY_DIR ${CMAKE_SOURCE_DIR}/build/test/)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_TEST_BINARY_DIR})
set(CMAKE_CXX_STANDARD 11)
add_executable(test_xxx xxx_test.cpp)

其中加入了一句 set(PROJECT_TEST_BINARY_DIR ${CMAKE_SOURCE_DIR}/build/test/),来控制test_xxx的输出路径。${CMAKE_SOURCE_DIR}是一个CMAKE的自带变量,代表着源码的根路径。

编译运行

Windows平台下打开powershell,输入cmake -G "MinGW Makefiles" .mingw-make.exe all,mingw-make.exe test,即可看见测试。IDE多数可以自动识别CMakeLists.txt