我正在使用CTest,并希望在运行时将命令行参数传递给底层测试。我知道有一些方法可以将命令行参数硬编码到CMake/CTest脚本中,但我希望在运行时指定命令行参数,并将这些参数通过CTest传递给底层测试。这可能吗
kxeu7u2r1#
我已经找到了一种方法来做到这一点(使用Fundamental theorem of software engineering)。事情没我想的那么简单,但就是这样.首先,创建一个文件**${CMAKE_SOURCE_REQ}/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所说,You can't always get what you want。
WILL_FAIL
ctest -- --custom-arguments
c3frrgcw2#
我不确定我是否完全理解您想要的,但我仍然可以给予一种方法,在运行时将参数传递给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"
告诉我是否有用。
axr492tv3#
马修的回答给了我一个线索让它为我工作。对于我的代码,我做了以下事情:输入命令ctest -V -R TestMembraneCellCrypt -N以获得输出:
ctest -V -R TestMembraneCellCrypt -N
... 488: Test command: path/to/ctest/executable/TestMembraneCellCrypt Labels: Continuous_project_ChasteMembrane Test #488: TestMembraneCellCrypt ...
然后我复制了Test command并在那里提供了参数:
Test command
path/to/ctest/executable/TestMembraneCellCrypt -e 2 -em 5 -ct 10
我会注意到,我使用的包(Chaste),是相当大的,所以可能有一些事情,我不知道。
bcs8qyzn4#
我也遇到了类似的问题,在测试中进行了大量的测试运行。如果设置了环境变量,则使用值,否则使用常量默认值。诀窍是使用shell运行测试可执行文件并使用参数扩展。与
a=${VAR:-20}
如果设置了VAR,shell将为“a”分配VAR的值,否则将为其分配默认值20 --这也可以是表达式的结果。使用CMake代码的Sniper如下:
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,人们请求转发命令行参数来测试可执行文件。
4条答案
按热度按时间kxeu7u2r1#
我已经找到了一种方法来做到这一点(使用Fundamental theorem of software engineering)。事情没我想的那么简单,但就是这样.
首先,创建一个文件**${CMAKE_SOURCE_REQ}/cmake/RunTests.cmake**,其中包含
然后,在添加测试时,使用
最后,您可以使用
注意,如果使用bash,可以将其简化为
这种方法存在一些问题,例如:它忽略测试的
WILL_FAIL
属性。当然,我希望它可以像调用ctest -- --custom-arguments
一样简单,但是,正如Stones所说,You can't always get what you want。c3frrgcw2#
我不确定我是否完全理解您想要的,但我仍然可以给予一种方法,在运行时将参数传递给CTest中的测试。
我将给你一个给予CTK(通用工具包,https://github.com/commontk/CTK)的例子:
在构建目录中(例如:CTK-build/CTK-build,它是一个超级构建),如果我运行:(“-V”表示详细,“-N”仅表示视图模式)
我得到:
您可以在终端中复制粘贴“测试命令”:
并添加参数,例如“-I”用于交互式测试:
告诉我是否有用。
axr492tv3#
马修的回答给了我一个线索让它为我工作。
对于我的代码,我做了以下事情:
输入命令
ctest -V -R TestMembraneCellCrypt -N
以获得输出:然后我复制了
Test command
并在那里提供了参数:我会注意到,我使用的包(Chaste),是相当大的,所以可能有一些事情,我不知道。
bcs8qyzn4#
我也遇到了类似的问题,在测试中进行了大量的测试运行。如果设置了环境变量,则使用值,否则使用常量默认值。
诀窍是使用shell运行测试可执行文件并使用参数扩展。
与
如果设置了VAR,shell将为“a”分配VAR的值,否则将为其分配默认值20 --这也可以是表达式的结果。
使用CMake代码的Sniper如下:
使用CTest运行测试:
默认情况下,使用相同的运行次数:
请参阅commit,它向CTest添加了一些测试运行。
值得一提的是,CMake中有一个issue,人们请求转发命令行参数来测试可执行文件。