单元测试作为构建的一部分

Unit testing as part of the build

我有一个分为三部分的 CMake 项目:

  1. 我的库的编译
  2. 许多单元测试程序的编译,测试这些库的每个精确子部分
  3. 使用这些库编译程序示例

我的问题是关于第 2nd 部分。我的单元测试可执行文件是带有 main return 的短二进制程序,成功时为 0,失败时为 1。我想将他们的 运行ning 作为构建的一部分进行集成。

是否可以使用 CMake 来执行这两种解决方案之一:

我不是在寻找完整的 CMake 脚本代码,通过 link 对相应文档的简单说明就足够了。

看到一个类似的问题和我的回答

主要是我的建议是向运行 ctest 的单元测试目标添加一个 POST_BUILD 步骤。如果 POST_BUILD 步骤失败(return 代码不为 0),构建将失败。

类似于:

set(UNIT_TEST MyLibUnitTestTargetName)
add_test(NAME ${UNIT_TEST} COMMAND ${UNIT_TEST})
add_custom_command(
     TARGET ${UNIT_TEST}
     COMMENT "Run tests"
     POST_BUILD 
     WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
     COMMAND ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION> -R "^${UNIT_TEST}$" --output-on-failures
)

这样做的好处是它的运行方式与您调用 ctest.

的方式相同

没有 add_test() / ctest 的简短版本是:

set(UNIT_TEST MyLibUnitTestTargetName)
add_custom_command(
     TARGET ${UNIT_TEST}
     COMMENT "Run tests"
     POST_BUILD 
     COMMAND ${UNIT_TEST}
)

参考文献:

如果你想保留你的测试二进制文件,即使测试失败,你可以尝试这样的事情:

set(UNIT_TEST MyLibUnitTestTargetName)
add_test(NAME ${UNIT_TEST} COMMAND ${UNIT_TEST})
add_custom_target(run_unit_test ALL
    COMMAND ${CMAKE_CTEST_COMMAND} --output-on-failure
    DEPENDS ${UNIT_TEST})

这将创建一个始终运行单元测试的目标。但是,因为它是一个单独的目标,所以该命令的失败将导致构建失败,但不会删除原始 UNIT_TEST 目标生成的二进制文件。