问题 使用多个命令进行CTest


我正在使用CTest构建一些测试。通常,我可以通过以下行来设置测试:

ADD_TEST(Test_Name executable args)

但是,我遇到了一个问题,我有一些测试需要运行两个命令才能使它工作,有什么方法我可以在一个ctest中运行两个程序,或者我需要创建一个新的测试每个?

谢谢。


13108
2018-06-17 20:06


起源



答案:


add_test 命令只接受一个可执行文件,但您可以运行任何真正的脚本可执行文件。要以跨平台的方式执行此操作,请在CMake中编写脚本。 CMake有 -P 运行时运行任意CMake脚本语言块的选项 make 要么 make test而不是在Makefile生成时间。

可悲的是,你无法将参数传递给这样的脚本。但是你可以将变量设置为值,这同样好。

你可以调用这个脚本 runtests.cmake,它运行命令CMD1和CMD2,并检查每个命令的非零返回码,如果发生这种情况,则返回CMake本身,并返回错误:

macro(EXEC_CHECK CMD)
    execute_process(COMMAND ${CMD} RESULT_VARIABLE CMD_RESULT)
    if(CMD_RESULT)
        message(FATAL_ERROR "Error running ${CMD}")
    endif()
endmacro()
exec_check(${CMD1})
exec_check(${CMD2})

...然后添加你的测试用例如下:

add_executable(test1 test1.c)
add_executable(test2 test2.c)
add_test(NAME test
    COMMAND ${CMAKE_COMMAND}
            -DCMD1=$<TARGET_FILE:test1>
            -DCMD2=$<TARGET_FILE:test2>
    -P ${CMAKE_CURRENT_SOURCE_DIR}/runtests.cmake)

$<TARGET_FILE:test1> 在构建文件生成时扩展到可执行文件的完整路径。当你跑步 make test 或等效的,这将运行“cmake -P runtests.cmake”将CMD1和CMD2变量设置为适当的测试程序。然后,脚本将按顺序执行您的2个程序。如果任一测试程序失败,则整个测试失败。如果您需要查看测试的输出,则可以运行 make test ARGS=-V


14
2018-06-18 16:20



嗯......这看起来很不错,虽然我需要在测试时间内运行脚本,而不是构建时间或makefile生成时间。 - Leif Andersen
哦,通过“建立时间”我的意思是当你运行任何时候 make 命令,包括 make test。而不是你跑的时候 cmake 生成Makefile。我现在在答案中澄清了这一点。 - richq


答案:


add_test 命令只接受一个可执行文件,但您可以运行任何真正的脚本可执行文件。要以跨平台的方式执行此操作,请在CMake中编写脚本。 CMake有 -P 运行时运行任意CMake脚本语言块的选项 make 要么 make test而不是在Makefile生成时间。

可悲的是,你无法将参数传递给这样的脚本。但是你可以将变量设置为值,这同样好。

你可以调用这个脚本 runtests.cmake,它运行命令CMD1和CMD2,并检查每个命令的非零返回码,如果发生这种情况,则返回CMake本身,并返回错误:

macro(EXEC_CHECK CMD)
    execute_process(COMMAND ${CMD} RESULT_VARIABLE CMD_RESULT)
    if(CMD_RESULT)
        message(FATAL_ERROR "Error running ${CMD}")
    endif()
endmacro()
exec_check(${CMD1})
exec_check(${CMD2})

...然后添加你的测试用例如下:

add_executable(test1 test1.c)
add_executable(test2 test2.c)
add_test(NAME test
    COMMAND ${CMAKE_COMMAND}
            -DCMD1=$<TARGET_FILE:test1>
            -DCMD2=$<TARGET_FILE:test2>
    -P ${CMAKE_CURRENT_SOURCE_DIR}/runtests.cmake)

$<TARGET_FILE:test1> 在构建文件生成时扩展到可执行文件的完整路径。当你跑步 make test 或等效的,这将运行“cmake -P runtests.cmake”将CMD1和CMD2变量设置为适当的测试程序。然后,脚本将按顺序执行您的2个程序。如果任一测试程序失败,则整个测试失败。如果您需要查看测试的输出,则可以运行 make test ARGS=-V


14
2018-06-18 16:20



嗯......这看起来很不错,虽然我需要在测试时间内运行脚本,而不是构建时间或makefile生成时间。 - Leif Andersen
哦,通过“建立时间”我的意思是当你运行任何时候 make 命令,包括 make test。而不是你跑的时候 cmake 生成Makefile。我现在在答案中澄清了这一点。 - richq