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

31

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

这个能做到吗?


你最终找到解决方案了吗? - simon
4
@simon 不,我没有。 - jlconlin
3
我已在此处向CMake提出了一个功能请求:https://gitlab.kitware.com/cmake/cmake/issues/20470 - AMA
4个回答

9
我已经找到了一种方法来实现它(使用软件工程基本定理)。虽然不像我想的那么简单,但是这就是方法。
首先,创建一个文件${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()

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

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

最后,您可以使用自定义参数运行测试,方法如下:

cmake -E env TESTS_ARGUMENTS="--custom-arguments" ctest

请注意,如果您使用的是bash,则可以简化此过程。
TESTS_ARGUMENTS="--custom-arguments" ctest

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

4
我在这里向CMake提出了一个功能请求:https://gitlab.kitware.com/cmake/cmake/issues/20470 - AMA

0

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

我将用CTK(通用工具包,https://github.com/commontk/CTK)为例:

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

ctest -R ctkVTKDataSetArrayComboBoxTest1 -V -N

我得到:
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

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

/CTK-build/CTK-build/bin/CTKVisualizationVTKWidgetsCppTests "ctkVTKDataSetArrayComboBoxTest1"

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

/CTK-build/CTK-build/bin/CTKVisualizationVTKWidgetsCppTests "ctkVTKDataSetArrayComboBoxTest1" "-I"

告诉我这是否有帮助。

0

Matthieu的回答给了我启示,让我成功地解决了问题。

对于我的代码,我做了以下操作:

输入命令ctest -V -R TestMembraneCellCrypt -N以获取输出:

...
488: Test command: path/to/ctest/executable/TestMembraneCellCrypt
Labels: Continuous_project_ChasteMembrane
  Test #488: TestMembraneCellCrypt
...

然后我复制了测试命令并在那里提供了参数:

path/to/ctest/executable/TestMembraneCellCrypt -e 2 -em 5 -ct 10

我要注意一下,我正在使用的软件包(Chaste)非常庞大,所以可能会发生我不知道的事情。


然而,这并不会在与 ctest 相同的环境中执行测试,例如如果必须设置环境变量。 - David Faure
取决于CMakeLists.txt的编写方式。在我们的项目中,测试命令还包含设置环境变量。这是为了使ctest -N更有用。 - user7610

0
我在测试中遇到了类似的问题,需要通过一系列的测试运行来进行测试。 如果环境变量被设置了,就使用该值,否则使用默认常量值。
关键是使用shell来运行测试可执行文件,并使用参数扩展。
使用
a=${VAR:-20}

如果VAR已设置,shell将为"a"分配VAR的值,否则将为其分配默认值20 - 这也可以是表达式的结果。

带有CMake代码的片段如下:

find_program(SHELL sh)

string(JOIN " " LIBFUZZER_OPTS
    -mutate_depth=20
    -runs=$\{RUNS:-${DEFAULT_RUNS_NUMBER}\}
    -artifact_prefix=${test_name}_
)
add_test(NAME ${test_name}
         COMMAND ${SHELL} -c "$<TARGET_FILE:${test_name}> ${LIBFUZZER_OPTS}"
)

使用CTest运行测试:
$ RUNS=10 ctest -R luaL_gsub_test --verbose
<snipped>
1: Done 10 runs in 0 second(s)

默认情况下,使用相同数量的运行次数:
$ ctest -R luaL_gsub_test --verbose
<snipped>
1: Done 5 runs in 0 second(s)

看到commit,它增加了将多个测试运行传递给CTest的功能。
值得一提的是,CMake中存在一个issue,人们要求将命令行参数转发给测试可执行文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接