2013-02-27 144 views
16

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

我将此命令添加到我的根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目标被构建后运行。

+1

感谢您的答案 - 在您的宏,在'add_test',我认为你需要的''而不是target_test' – experquisite 2016-03-08 16:25:11

回答

12

这种形式的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) 
+0

谢谢回答'$ {} target_test,明白这一点!我找到类似的解决方案我创建了依赖于项目中每个单元测试的自定义目标,并且将自定义目标的'add_custom_command'用作TARGET参数。这很重要,因为我不想运行陈旧的测试。而且我还发现,无法枚举'cmake'项目中的所有目标,因此需要手动维护目标列表。 – Lazin 2013-02-28 06:29:39

相关问题