【问题标题】:How to shadow a header file with CMake for unit-testing如何使用 CMake 隐藏头文件以进行单元测试
【发布时间】:2017-04-12 08:40:11
【问题描述】:

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

+ 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 包括测试/DragonHeader.h。怎样才能做到这一点? (如果相关,我正在使用 MSVC 2015...)

测试文件夹中的 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 复制到测试文件夹中,但我认为它不是最佳的。

【问题讨论】:

  • DragonHeader.h 是否需要您不想在测试项目中重新指定的其他库?如果这是真的,请尝试使主项目成为一个带有链接它的小型可执行文件的库。然后测试也可以链接库。 CMake 使这变得非常简单,因为可执行文件从库中获取包含目录等,因此您只需提及一次。
  • 这个问题我也有些不清楚,你能补充一些关于你所面临问题的更多细节吗?
  • 我的问题的前提是我不能触及“生产”中的任何文件,也不能改变整个构建过程(这就是约瑟夫提出的)。我知道此时它有点理论化,但这就是我所追求的:如何防止 cpp 文件在其旁边获取头文件。相反,我想将另一个标题(具有相同的名称,但位置不同)“放入”cpp 文件中。在写作时,我意识到我想将 cpp 文件的 inlcude 目录顺序从“.tests”更改为“tests”。 (注意“。”)。

标签: c++ unit-testing cmake


【解决方案1】:

我的第一个想法是对生产和单元测试使用不同的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。要设置定义,请将字符串 -DUSE_TEST_HEADERS 添加到您的 test/CMakeLists.txt 文件中,并添加到编译器标志中。

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

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

【讨论】:

  • 感谢您的回答。我知道,这两种解决方案都可以正常工作,但关键是我既不能更改 ClassToTest.cpp,也不能更改任何现有的 CMakeLists.txt。把它当作一个学术问题:如何防止 C++ 预处理器/编译器在 ClassToTest.cpp 旁边取标题并说服编译器取 /an/arbitrary/other/header.h。
猜你喜欢
  • 1970-01-01
  • 2015-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-19
  • 2014-06-20
相关资源
最近更新 更多