我有一个非常相似的问题,但这里提出的解决方案并不令人满意。
像原始海报一样,我想基于 boost::test 运行单元测试。
我有多个测试项目,一个针对我们产品的每个主要组件。
必须在每次测试之前运行安装目标意味着重新编译整个东西只是为了运行属于核心组件的测试。这就是我想要避免的。
如果我更改核心组件中的某些内容,我想编译该核心组件和相关的测试。然后运行测试。当测试成功时,我才想编译并最终安装它的其余部分。
为了在调试器中运行测试,我在以下位置找到了一些非常有用的 cmake 脚本:
https://github.com/rpavlik/cmake-modules
有了这个,我可以指定所需dll的所有目录,并为新进程设置PATH环境变量:
# for debugging
INCLUDE(CreateLaunchers)
create_target_launcher(PLCoreTests
ARGS "--run-test=Core1"
RUNTIME_LIBRARY_DIRS ${PL_RUNTIME_DIRS_DEBUG} ${PROJECT_BINARY_DIR}/bin/Debug
WORKING_DIRECTORY ${PL_MAIN_DIR}/App/PL/bin
)
其中 ${PL_RUNTIME_DIRS_DEBUG} 包含可以找到来自 boost 和所有其他库的 dll 的目录。
现在我正在寻找如何使用 ADD_CUSTOM_COMMAND() 实现类似的功能
更新:
ADD_CUSTOM_COMMAND() 可以有多个 cmake 写入批处理文件的命令。因此,您可以先设置所有运行时目录的路径,然后执行测试可执行文件。为了能够轻松地手动执行测试,我让 cmake 在构建目录中创建了一个额外的批处理文件:
MACRO(RunUnitTest TestTargetName)
IF(RUN_UNIT_TESTS)
SET(TEMP_RUNTIME_DIR ${PROJECT_BINARY_DIR}/bin/Debug)
FOREACH(TmpRuntimeDir ${PL_RUNTIME_DIRS_DEBUG})
SET(TEMP_RUNTIME_DIR ${TEMP_RUNTIME_DIR} ${TmpRuntimeDir})
ENDFOREACH(TmpRuntimeDir)
ADD_CUSTOM_COMMAND(TARGET ${TestTargetName} POST_BUILD
COMMAND echo "PATH=${TEMP_RUNTIME_DIR};%PATH%" > ${TestTargetName}_script.bat
COMMAND echo ${TestTargetName}.exe --result_code=no --report_level=no >> ${TestTargetName}_script.bat
COMMAND ${TestTargetName}_script.bat
WORKING_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Debug
)
ENDIF(RUN_UNIT_TESTS)
ENDMACRO()
这样,单元测试可以尽快捕获错误,而无需先编译全部内容。