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

xvw2m8pv  于 12个月前  发布在  其他
关注(0)|答案(4)|浏览(147)

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

kxeu7u2r

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

c3frrgcw

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"

告诉我是否有用。

axr492tv

axr492tv3#

马修的回答给了我一个线索让它为我工作。
对于我的代码,我做了以下事情:
输入命令ctest -V -R TestMembraneCellCrypt -N以获得输出:

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

然后我复制了Test command并在那里提供了参数:

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

我会注意到,我使用的包(Chaste),是相当大的,所以可能有一些事情,我不知道。

bcs8qyzn

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,人们请求转发命令行参数来测试可执行文件。

相关问题