在单元测试时配置CMake重新编译源代码

时间:2015-06-02 10:31:37

标签: unit-testing cmake

我在下面定义了一个包含src和test目录的项目结构。

├── CMakeLists.txt
├── src
│   ├── CMakeLists.txt
│   ├── table.c
│   └── table.h
├── test
│   ├── CMakeLists.txt
│   └── test_table.c
├── build
    ├── src    [src build]
    └── test   [src + test build with UNIT_TESTING defined]

我想配置cmake,以便在构建测试(单元测试)目录时,它还使用UNIT_TESTING定义集编译./src目录中的文件,并将所有构建工件放入./build / test / directory。

这样,当UNIT_TESTING和真正的内存分配在正常构建时没有单元测试时,我可以通过使用malloc free等的包装函数来跟踪内存泄漏。

有谁知道如何让我入手?

2 个答案:

答案 0 :(得分:1)

首先,我建议out-of-source-build这样:

├── build
│   ├── src
│   └── test
└── code
    ├── CMakeLists.txt
    ├── src
    │   ├── CMakeLists.txt
    │   ├── table.c
    │   └── table.h
    └── test
        └── CMakeLists.txt
        └── test_table.c

code中的顶级CMakeLists.txt如下所示:

project(example)
set(BUILD_TESTS FALSE CACHE BOOL "Build unit tests")
if(BUILD_TESTS)
    add_definitions(-DUNIT_TESTING)
    add_subdirectory(test)
endif()
add_subdirectory(src)

然后将项目配置两次:

    build / src: cmake ../../code 构建/测试中 cmake -DBUILD_TESTS:BOOL=TRUE ../../code

    (2。)将使用附加src构建test#define,而(1.)仅构建src

答案 1 :(得分:1)

使用How to build a program with 2 different values of a variable in CMake进一步回答,您甚至可以在一个生成的构建环境中执行此操作。

<强>的CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
project(Example C)
add_subdirectory(src)
add_subdirectory(test)

<强>的src /的CMakeLists.txt

set(inFiles table.c table.h)
add_library(TableLib ${inFiles})
add_library(TestTableLib ${inFiles})
set_property(TARGET TestTableLib APPEND PROPERTY COMPILE_DEFINITIONS "UNIT_TESTING")

<强>测试/的CMakeLists.txt

add_executable(TestTableExe test_table.c)
add_dependencies(TestTableExe TestTableLib)
# add_test(NAME RunTableTest COMMAND ...)

CMake会注意TableLibTestTableLib的编译器输出最终会出现在不同的目录中。

唯一的缺点是您将拥有两个具有相同源文件的目标(TableLibTestTableLib)。但是你可以在一些具有FOLDER目标属性的IDE中对它们进行分组。

另一种方法是将您需要的文件直接编译到测试中。如果你有嘲笑/存根的东西并且你不想要,或者你无法链接所有的依赖关系,那么这有时会非常方便。&#34;代码会被测试&#34;。

test / CMakeLists.txt (包含所有来源的版本)

include_directories(../src)
add_definitions(-DUNIT_TESTING)
add_executable(TestTableExe test_table.c ../src/table.c ../src/table.h)
# add_test(NAME RunTableTest COMMAND ...)