【问题标题】:How to pass command-line arguments in CTest at runtime如何在运行时在 CTest 中传递命令行参数
【发布时间】:2015-03-02 14:44:42
【问题描述】:

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

这可能吗?

【问题讨论】:

标签: command-line cmake ctest


【解决方案1】:

我已经找到了一种方法(使用Fundamental theorem of software engineering)。这并不像我想的那么简单,但就是这样。

首先,创建一个包含内容的文件${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 所说,You can't always get what you want。

【讨论】:

【解决方案2】:

我不确定我是否完全理解您想要什么,但我仍然可以为您提供一种在运行时将参数传递给 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"

如果有帮助,请告诉我。

【讨论】:

    【解决方案3】:

    matthieu 的回答为我提供了让它为我工作的线索。

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

    键入命令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) 非常大,所以可能会发生一些我不知道的事情。

    【讨论】:

    • 然而,这不会在与 ctest 完全相同的环境中执行测试,例如如果必须设置环境变量。
    • 取决于 CMakeLists.txt 的编写方式。在我们的项目中,测试命令还包含设置环境变量。这样做是为了让 ctest -N 更有用。
    猜你喜欢
    • 1970-01-01
    • 2019-08-28
    • 2011-08-22
    • 2016-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    相关资源
    最近更新 更多