【问题标题】:ctest run only existing testsctest 仅运行现有测试
【发布时间】:2018-08-03 20:08:56
【问题描述】:

我的构建中有一些可选的测试。我的 CMakeLists.txt 看起来大致如下:

add_custom_target(all-tests)

add_executable(A ...)
add_dependencies(all-tests A)
add_test(NAME A COMMAND ...)

add_executable(B ...)
add_dependencies(all-tests B)
add_test(NAME B COMMAND ...)

## optional
add_executable(C EXCLUDE_FROM_ALL ...)
add_test(NAME C COMMAND ...)

我可以跑步的想法

$ make all-tests
$ ctest

编译我所有的单元测试然后运行它们。问题是,由于C 是可选的,它不会构建(所有需要)。而且由于它没有构建,所以它不存在,并被报告为失败:

The following tests FAILED:
      6 - C (Not Run)
Errors while running CTest

有没有办法忽略这个失败/让 CTest 不尝试运行不存在的测试/以其他方式表达可选测试的想法?我有一类具有相似名称的这些可选测试,所以如果它们是构建的,那么能够使用ctest -R 来运行它们会很好,而不必配置一些脚本或其他方法。

【问题讨论】:

    标签: cmake ctest


    【解决方案1】:

    通过设置REQUIRED_FILES 属性使可选测试依赖于已构建的测试可执行文件的存在:

    add_test(NAME C COMMAND ...)
    add_executable(C EXCLUDE_FROM_ALL ...)
    set_property(TEST C PROPERTY REQUIRED_FILES "$<TARGET_FILE:C>")
    

    使用生成器表达式TARGET_FILE 需要 CMake 3.0 或更高版本。

    【讨论】:

    • 使用$&lt;TARGET_FILE:C&gt; 不起作用,我不知道它是否甚至扩展。我试过${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/C(这绝对是这个二进制文件的正确路径),但ctest 在不存在的文件上仍然失败。
    • 如果有帮助,我提出了一个新问题,其中包含一个极其简化的示例here
    • 好的 - 这似乎让 ctest 将测试设为“未运行”,但 ctest 本身仍会出于退出代码的目的将这些视为失败。 ctest自身成功的动力还是很大的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-16
    • 2018-04-09
    • 2020-01-27
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    相关资源
    最近更新 更多