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

时间:2015-10-02 06:33:41

标签: unit-testing cmake automated-tests

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

  1. 我的图书馆汇编
  2. 编译测试这些库的每个精确子部分的许多单元测试程序
  3. 使用这些库编制程序样本
  4. 我的问题是2 nd 部分。我的单元测试可执行文件是短二进制程序,成功时main返回0,失败时返回1。我想将他们的运行集成为构建的一部分。

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

    • 运行每个单元测试程序并检查返回值,如果失败则生成错误。
    • 生成一个测试脚本,该脚本将运行并检查每个单元测试程序,并检查返回值以在出现任何故障时产生错误。

    我不是在寻找一个完整的CMake脚本代码,只需简单说明链接到相应文档的内容就足够了。

2 个答案:

答案 0 :(得分:4)

查看类似问题和我的回答here

我的建议主要是向运行POST_BUILD的单元测试目标添加ctest步骤。如果POST_BUILD步骤失败(返回代码不为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}
)

参考文献:

答案 1 :(得分:0)

如果您希望保留测试二进制文件,即使测试失败,也可以尝试执行以下操作:

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目标产生的二进制文件。