如何在运行时在CTest中传递命令行参数

jlc*_*lin 12 command-line cmake ctest

我正在使用CTest并希望在运行时将命令行参数传递给基础测试.我知道有很多方法可以将命令行参数硬编码到CMake/CTest脚本中,但我想在运行时指定命令行参数,并将这些参数通过CTest传递给基础测试.

这甚至可能吗?

Kev*_*vin 6

我想出了一种方法来做到这一点(使用软件工程基本定理)。这并不像我想要的那么简单,但就是这样。

首先,创建一个包含内容的文件${CMAKE_SOURCE_DIR}/cmake/RunTests.cmake

if(NOT DEFINED ENV{TESTS_ARGUMENTS})
    set(ENV{TESTS_ARGUMENTS} "--default-arguments")
endif()
execute_process(COMMAND ${TEST_EXECUTABLE} $ENV{TESTS_ARGUMENTS} RESULT_VARIABLE result)
if(NOT "${result}" STREQUAL "0")
    message(FATAL_ERROR "Test failed with return value '${result}'")
endif()
Run Code Online (Sandbox Code Playgroud)

然后,当您添加测试时,请使用

add_test(
    NAME MyTest
    COMMAND ${CMAKE_COMMAND} -DTEST_EXECUTABLE=$<TARGET_FILE:MyTest> -P ${CMAKE_SOURCE_DIR}/cmake/RunTests.cmake
)
Run Code Online (Sandbox Code Playgroud)

最后,您可以使用自定义参数运行测试

if(NOT DEFINED ENV{TESTS_ARGUMENTS})
    set(ENV{TESTS_ARGUMENTS} "--default-arguments")
endif()
execute_process(COMMAND ${TEST_EXECUTABLE} $ENV{TESTS_ARGUMENTS} RESULT_VARIABLE result)
if(NOT "${result}" STREQUAL "0")
    message(FATAL_ERROR "Test failed with return value '${result}'")
endif()
Run Code Online (Sandbox Code Playgroud)

请注意,如果您使用 bash,则可以将其简化为

add_test(
    NAME MyTest
    COMMAND ${CMAKE_COMMAND} -DTEST_EXECUTABLE=$<TARGET_FILE:MyTest> -P ${CMAKE_SOURCE_DIR}/cmake/RunTests.cmake
)
Run Code Online (Sandbox Code Playgroud)

这种方法存在一些问题,例如它忽略WILL_FAIL了测试的属性。我当然希望它可以像打电话一样简单ctest -- --custom-arguments,但是,正如石头所说,你不可能总是得到你想要的

  • 我在这里向 CMake 提出了功能要求:https://gitlab.kitware.com/cmake/cmake/issues/20470 (3认同)

mat*_*ieu 0

我不确定我完全理解你想要什么,但我仍然可以为你提供一种在运行时将参数传递给 CTest 中的测试的方法。

我给你举一个例子,使用 CTK(通用工具包,https://github.com/commontk/CTK):

在构建目录中(例如:CTK-build/CTK-build,它是超级构建),如果我运行:(“-V”表示详细,“-N”仅表示查看模式)

ctest -R ctkVTKDataSetArrayComboBoxTest1 -V -N
Run Code Online (Sandbox Code Playgroud)

我得到:

UpdateCTestConfiguration  from : /CTK-build/CTK-build/DartConfiguration.tcl
Parse Config file:/CTK-build/CTK-build/DartConfiguration.tcl
 Add coverage exclude regular expressions.
 Add coverage exclude: /CMakeFiles/CMakeTmp/
 Add coverage exclude: .*/moc_.*
 Add coverage exclude: .*/ui_.*
 Add coverage exclude: .*/Testing/.*
 Add coverage exclude: .*/CMakeExternals/.*
 Add coverage exclude: ./ctkPixmapIconEngine.*
 Add coverage exclude: ./ctkIconEngine.*
UpdateCTestConfiguration  from :/CTK-build/CTK-build/DartConfiguration.tcl
Parse Config file:/CTK-build/CTK-build/DartConfiguration.tcl
Test project /CTK-build/CTK-build
Constructing a list of tests
Done constructing a list of tests

178: Test command: /CTK-build/CTK-build/bin/CTKVisualizationVTKWidgetsCppTests "ctkVTKDataSetArrayComboBoxTest1"
Labels: CTKVisualizationVTKWidgets
  Test #178: ctkVTKDataSetArrayComboBoxTest1

Total Tests: 1
Run Code Online (Sandbox Code Playgroud)

您可以将“测试命令”复制粘贴到终端中:

/CTK-build/CTK-build/bin/CTKVisualizationVTKWidgetsCppTests "ctkVTKDataSetArrayComboBoxTest1"
Run Code Online (Sandbox Code Playgroud)

并添加参数,例如用于交互式测试的“-I”:

/CTK-build/CTK-build/bin/CTKVisualizationVTKWidgetsCppTests "ctkVTKDataSetArrayComboBoxTest1" "-I"
Run Code Online (Sandbox Code Playgroud)

告诉我是否有帮助。