如何在使用cmake构建项目后运行ctest

如何在使用cmake构建项目后运行ctest,cmake,ctest,Cmake,Ctest,我希望在每次成功构建项目时启动测试。如果一些测试被破坏,我希望我的构建也被破坏。默认情况下,我需要通过运行ctest命令手动运行测试。CTest实际上可以构建项目,但我使用调用make的IDE来构建源代码。而make不运行测试 我将此命令添加到根CMakeLists.txt文件中,但它不起作用 add_custom_command(OUTPUT tests.txt POST_BUILD COMMAND ctest --

我希望在每次成功构建项目时启动测试。如果一些测试被破坏,我希望我的构建也被破坏。默认情况下,我需要通过运行
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}
)
它创建依赖于项目中所有单元测试的自定义目标。自定义命令在生成所有测试目标后运行。

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

我认为您可以使用第二种形式的
add\u custom\u命令
来实现您的目标;比如:

add_custom_command(TARGET MainTest
                   POST_BUILD
                   COMMAND ctest -C $<CONFIGURATION> --output-on-failure)
add_custom_命令(TARGET MainTest
后期构建
命令ctest-C$--失败时输出)

感谢您的回答,非常感谢!我找到了类似的解决方案。我创建依赖于项目中每个单元测试的自定义目标,然后使用
add_custom_命令
,将自定义目标作为目标参数。这很重要,因为我不想运行过时的测试。我还发现,不可能枚举
cmake
项目中的所有目标,因此需要手动维护目标列表。关于运行测试,我有一个问题。目前,我有一个
sh
-脚本在单独的构建目录中构建项目。在
cmake.&make
完成了吗?一个有点错误的示例。$可能未设置。在这种情况下,
--失败时的输出
将成为
-C
的一个参数。感谢您的回答-在您的宏中,在
添加测试
中,我认为您需要
${target\u test}
而不是
目标测试
您对答案的评论中关于避免运行的“更新”部分是什么意思“过时的测试”?起初,我以为你想出了一种只运行新构建的测试的方法。但是,我现在看到它在所有测试上运行
ctest