Unit testing cmake:如何分别编译生产代码和测试代码
我读过关于如何将Google测试与CMake集成的文章。该项目的大纲如下所示:Unit testing cmake:如何分别编译生产代码和测试代码,unit-testing,cmake,googletest,Unit Testing,Cmake,Googletest,我读过关于如何将Google测试与CMake集成的文章。该项目的大纲如下所示: +-- CMakeLists.txt +-- main | +-- CMakeLists | +-- main.cpp | +-- test | +-- CMakeLists.txt | +-- testfoo | +-- CMakeLists.txt | +-- main.cpp | +-- testfoo.h | +-- testfoo.cp
+-- CMakeLists.txt
+-- main
| +-- CMakeLists
| +-- main.cpp
|
+-- test
| +-- CMakeLists.txt
| +-- testfoo
| +-- CMakeLists.txt
| +-- main.cpp
| +-- testfoo.h
| +-- testfoo.cpp
| +-- mockbar.h
|
+-- libfoo
| +-- CMakeLists.txt
| +-- foo.h
| +-- foo.cpp
|
+-- libbar
+-- CMakeLists.txt
+-- bar.h
+-- bar.cpp
(对于感兴趣的用户,可以从中签出此示例项目的整个代码)
顶级CMakeLists.txt包含(除其他外)语句enable\u testing()
和add\u子目录(test)
。编译和运行测试用例非常适合这种设置,只需运行
mkdir build && cd build
cmake ..
make
make test
但是我如何将这个项目编译成生产代码,即只有组件test
、libfoo
和libbar
,而没有所有的单元测试
我是否应该让语句
enable_testing()
和add_子目录(test)
以某种方式依赖于某些构建配置变量?或者这方面的最佳实践是什么?我要做的是为单元测试创建创建一个自定义宏,该宏执行以下操作:
set_target_properties(${NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/test)
然后,您的测试将在一个特殊目录(
test
)中结束,而不是在常规目录(通常是bin
)中结束。然后,对于生产,您只需复制常规目录,而不复制测试目录。要仅根据请求构建测试,我采用以下方式:
选项(上的构建测试“构建单元测试”)
if(构建测试)
添加_子目录(测试)
endif()
在您的情况下,您可以将其修改为testfoo
当您要求进行生产时,您可以使用以下选项来仅在调试模式下生成:
if(“${CMAKE\u BUILD\u TYPE}”STREQUAL“Debug”)
添加_子目录(测试)
endif()。我想知道你们是否知道目标属性?所以你们说你们通常总是同时构建生产代码和测试代码?好的,我想得越多,我就越同意它(虽然在这种情况下,构建测试代码有时可能有点繁重,因为它也下载和构建googletest——但有解决方案)。实际上,到不同输出目录的分离已经完成。我不太确定你发布的命令会带来什么好处。