【问题标题】:How to run ctest after building my project with cmake使用 cmake 构建我的项目后如何运行 ctest
【发布时间】:2013-02-13 10:28:10
【问题描述】:

我希望每次成功构建项目时启动我的测试。如果某些测试被破坏,我希望我的构建也被破坏。默认情况下,我需要通过运行ctest 命令手动运行测试。 CTest 实际上可以构建项目,但我使用调用 make 的 IDE 来构建源代码。而make 不运行测试。

我将此命令添加到我的根 CMakeLists.txt 文件中,但它不起作用。

add_custom_command(OUTPUT tests.txt 
                   POST_BUILD
                   COMMAND ctest --output-on-failure)

CMake 不返回任何错误,一切正常,但我的自定义命令没有调用。在 CMake 中每次成功构建后如何运行某些东西?

更新:

我的最终解决方案是创建这个宏:

macro(add_unit_test target target_test)
    set(UNIT_TEST_TARGETS ${UNIT_TEST_TARGETS} ${target_test} PARENT_SCOPE)
    add_test(target ${CMAKE_CURRENT_BINARY_DIR}/${target_test})
endmacro(add_unit_test)

它调用add_test 并在列表中记住测试目标。此宏添加的项目中的每个测试。在根 CMakeLists.txt 我有这个代码:

add_custom_target( all_tests ALL
                   DEPENDS ${UNIT_TEST_TARGETS}
)
add_custom_command(TARGET all_tests
                   COMMENT "Run tests"
                   POST_BUILD COMMAND ctest ARGS --output-on-failure
                   WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
)

它创建依赖于项目中所有单元测试的自定义目标。自定义命令在 all_tests 目标构建后运行。

【问题讨论】:

  • 感谢您的回答 - 在您的宏中,在 add_test 中,我认为您需要 ${target_test} 而不是 target_test
  • 您对答案的评论是什么意思,关于您的“更新”部分,关于避免运行“陈旧的测试”?起初,我以为您想出了一种只运行新建测试的方法。但是,我现在看到它在所有测试中都运行 ctest

标签: cmake ctest


【解决方案1】:

这种形式的add_custom_command 只会在另一个 CMake 目标依赖于“tests.txt”时才会执行。我假设没有其他目标将“tests.txt”作为输入文件,因此自定义命令永远不会运行。

我认为您可以使用add_custom_command 的第二种形式来实现您的目标;类似:

add_custom_command(TARGET MainTest
                   POST_BUILD
                   COMMAND ctest -C $<CONFIGURATION> --output-on-failure)

【讨论】:

  • 感谢您的回答,不胜感激!我找到了类似的解决方案。我创建了依赖于项目中每个单元测试的自定义目标,然后我将add_custom_command 与我的自定义目标一起用作 TARGET 参数。这是必不可少的,因为我不想运行陈旧的测试。而且我还发现无法枚举cmake项目中的所有目标,因此需要手动维护目标列表。
  • 我有一个关于运行测试的问题。目前我有一个sh-script 在单独的构建目录中构建项目。在cmake . &amp;&amp; make 完成后在脚本中添加ctest 调用是否常见?
  • 有点错误的例子。 $ 可能未设置。在这种情况下,--output-on-failure 将成为-C 的参数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-02
  • 1970-01-01
  • 2012-04-30
  • 1970-01-01
相关资源
最近更新 更多