如何使用CMake对头文件进行阴影处理以进行单元测试

时间:2017-04-12 08:40:11

标签: c++ unit-testing cmake

这是我的简化文件夹结构:

+ production
+-- ClassToTest.cpp (contains '#includes "DragonHeader.h"')
+-- ClassToTest.h
+-- DragonHeader.h (has a lot of dependencies, ClassToTest only need one simple static function with no dependencies at all.)
+ tests
+-- tst_ClassToTest.cpp
+-- DragonHeader.h (which defines and implements the needed simple function)

因此,对于测试用例,我喜欢测试/ DragonHeader.h阴影制作/ DragonHeader.h。 => ClassToTest.cpp包含tests / DragonHeader.h。怎么能实现呢? (如果相关,我正在与MSVC 2015合作......)

tests文件夹中的CMakeLists.txt看起来像

project( tst_ClassToTest )
set( ${PROJECT_NAME}_SOURCES tst_ClassToTest.cpp DragonHeader.h ../production/ClassToTest.cpp )
# How to force ClassToTest.cpp to use DragonHeader.h, not production/DragonHeader.h?
add_executable( ${PROJECT_NAME} WIN32 ${${PROJECT_NAME}_SOURCES} )

谢谢!

免责声明:我寻求的解决方案不需要我触及ClassToTest.cpp或触摸生产中的代码,包括相关的CMakeLists.txt文件。但是,一种解决方案是使用CMake将ClassToTest.cpp / h复制到tests文件夹中,但我认为它不是最佳的。

1 个答案:

答案 0 :(得分:0)

我的第一个想法是对生产和单元测试使用不同的include_directory语句。但在这种情况下,其他头文件ClassToTest.h必须位于不同的文件夹中。或者您必须将DragonHeader.h移动到另一个文件夹中。

# CMake for production
include_directory(production)
include_directory(production_dragon)

#CMake for test
include_directory(production)
include_directory(test_dragon)

另一种方式可能是

#ifndef USE_TEST_HEADERS
#include "DragonHeaderTest.h"
#else
#include "DragonHeader.h"
#endif
ClassToTest.cpp中的

。要将定义添加到test/CMakeLists.txt文件中,请将字符串-DUSE_TEST_HEADERS设置为编译器标志。

第三种解决方案是将production/DragonHeader.h替换为先进的test/DragonHeader.h副本。这仅适用于production/DragonHeader.h可以恢复的情况。来自文件系统副本或来自配置管理。系统。这可以通过将bild包装成脚本来实现。不知道MSVC 2015是否可以触发这样的脚本而不是构建。

rem Build for tests
rem Run cmake 
cmake PARAMETERS
rem Prepare unit test
cp WHATEVER
rem nmake
name PARAMETERS