运行 Google 在构建时使用 CMake 生成的系统进行测试

Running Google test at build time with CMake generated system

我的配置有 CMake 3.6、Visual Studio 2015 和来自 GitHub 的最新 Google 测试。我通过我的一个 cmake 函数 addGtest 添加我的单元测试并进行构建。在此之后,我可以 运行 从我的 RUN_TESTS 目标或使用 ctrl + F5 在 VS 中进行测试并按预期工作.

最终目标是 运行 使用 CMake 依赖管理在构建时进行单元测试。现在,作为第一步,我增强了创建 custom_target 的功能(包括整个功能,以防工作部分出现不可预见的问题),但没有构建它:

function (addGtest)
  # vvvv this part works as explained vvvv #
  set (optBOOLS)
  set (optSINGLES EXE)
  set (optLISTS DLL_LIST)
  cmake_parse_arguments (myARGS
    "${optBOOLS}" "${optSINGLES}" "${optLISTS}" ${ARGN})

  # addExecutable is a function that adds target executables
  set(myARGS_DLL_LIST gtest_main gtest "${myARGS_DLL_LIST}")
  addExecutable (EXE ${myARGS_EXE} DLL_LIST ${myARGS_DLL_LIST} ${myARGS_UNPARSED_ARGUMENTS})
  add_test (NAME ${myARGS_EXE} COMMAND ${myARGS_EXE} WORKING_DIRECTORY
    ${CMAKE_INSTALL_PREFIX}/$<$<CONFIG:Release>:Release>$<$<CONFIG:Debug>:Debug>/bin
  ) # so it can be run using ctest
  # ^^^^ this part works as explained ^^^^ #

  add_custom_target (${myARGS_EXE}.tgt DEPENDS ${myARGS_EXE}
    COMMAND ${myARGS_EXE} --gtest_output="xml:${myARGS_EXE}.xml"
    WORKING_DIRECTORY ${CMAKE_INSTALL_PREFIX}/$<$<CONFIG:Release>:Release>$<$<CONFIG:Debug>:Debug>/bin
  )
endfunction (addGtest)

正如我预期的那样,当我执行构建时,一个新的目标,比如 utMyTest.tgt 被添加到 VS,但它没有被构建。现在,当我在 VS 中手动构建这个新目标时,我预计测试将是 运行。但它没有并给出以下错误:

1>  The filename, directory name, or volume label syntax is incorrect.

我尝试提供 COMMAND 选项的完整路径,删除 --gtest_output 值周围的双引号,但无济于事。另一方面,当我在命令行 window 中 cd 到工作目录并调用 exe 时,它​​工作正常!

第一个问题是如何通过构建这个新目标将其修复到 运行 测试?之后,我打算add_custom_target (${myARGS_EXE}.run)add_dependencies (${myARGS_EXE}.run ${myARGS_EXE}.tgt)。每当 exe 更改时,这会 运行 进行测试吗?还是我应该做点别的?谢谢你的帮助。

无法在评论中添加如此多的细节,因此给出了这个答案。

1.原题答案

由于我需要add_custom_target命令的WORKING_DIRECTORY选项中的配置依赖路径,但是不能将生成器表达式传递给它,我的想法是使用 CMAKE_CFG_INTDIR 变量,所以:

add_custom_target (${myARGS_EXE}.tgt
  DEPENDS ${myARGS_EXE}
  COMMAND ${myARGS_EXE} --gtest_output=xml:${myARGS_EXE}.xml
  WORKING_DIRECTORY ${CMAKE_INSTALL_PREFIX}/${CMAKE_CFG_INTDIR}/bin
)

现在,当您构建上述目标时,单元测试是 运行 在 WORKING_DIRECTORY 中,这并不完全合乎需要,因为那是 libs 和 exes 的安装目录。真的很高兴...

2。 运行 构建目录中的单元测试

同时,从 Visual Studio 中获取 DLL 路径,并将 Gtest 生成的 .xml 文件存储在构建目录中。这是解决方案:

在 CMake 版本 3.10 CMAKE_MSVCIDE_RUN_PATH property was added. In the project wide CMakeLists.txt, set(CMAKE_MSVCIDE_RUN_PATH ${CMAKE_INSTALL_PREFIX}/${CMAKE_CFG_INTDIR}/bin) - thanks to this #3 中,我们可以附加 PATH 以指向我们的安装目录。然后将上面的 add_custom_target 命令替换为:

add_custom_command (
  TARGET ${myARGS_EXE} POST_BUILD
  COMMAND ${myARGS_EXE} --gtest_output=xml:${myARGS_EXE}.xml
  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}
)

这个解决方案避免了创建额外目标的混乱。明明只有建myARGS_EXE的时候,单元测试是运行。显然 myARGS_EXE 对其他 DLL 的传递依赖也包括在内。

如果您有其他优雅的解决方案,请post。