【问题标题】:CMake and CTest's default "test" command skips a specially named testCMake 和 CTest 的默认“测试”命令会跳过一个特别命名的测试
【发布时间】:2015-09-23 23:26:11
【问题描述】:

我正在使用 CTest 和 CMake 来运行一些测试。我使用enable_testing() 命令,它为我提供了make test 的默认命令。我的子目录中的所有测试都被计算在内(通过执行add_test 命令)并且make test 效果很好,除了一个问题。

有一个测试,我命名为skip_test,当我执行make test 时,我不想运行它。我想添加一个自定义目标,这样我就可以运行 make skip_test 并运行该测试。

我可以通过执行add_custom_target(skip_test ...) 并为CTest 提供-R 标志并告诉它查找名称中包含“skip_test”的文件来做到这一点。这似乎也有效。我现在的问题是:如何让make test 命令忽略skip_test

如果我尝试注释掉 enable_testing 并添加我自己的 add_custom_target(test ....),我会收到“未找到测试!!!”现在是make testmake skip_test。我还尝试制作自定义 CTest 文件并添加 set(CTEST_CUSTOM_TESTS_IGNORE skip_test)。这很有效,所以现在 make test 忽略了“skip_test”,但现在运行 make skip_test 会响应“没有找到测试!!!”。

任何建议将不胜感激!

【问题讨论】:

  • 我发现在CMake生成的Makefile中,定义了目标“make test”。它运行 ctest 并在末尾有一个额外的 $(ARGS) 标志。我发现我的问题的“解决方案”是手动输入“-E .*skip_test”,它会跳过我名为“skip_test”的测试。如何告诉 CMake 将此附加到自动定义的“make test”目标?

标签: unit-testing cmake googletest ctest


【解决方案1】:

我实际上使用了不同的解决方案。这就是我所做的。对于我想排除的测试,我在添加它们时使用了以下命令:

"add_test( ..... CONFIGURATIONS ignore_flag)" 其中 ignore_flag 是您想要的任何短语。然后,在我的 CMakeLists.txt 中,当我定义一个自定义目标时 add_custom_target(ignore_tests ...) 我给它 ctest .... -C ignore_flag

现在,make test 将跳过这些测试! make ignore_Tests 将运行忽略的测试+未忽略的测试,我可以接受。

【讨论】:

    【解决方案2】:

    我不确定完全通过 CTest 完成此操作的方法,但由于您已使用“googletest”标记此问题,我假设您将其用作您的测试框架。所以,你也许可以利用 Gtest 的能力来disable testsrun disabled tests

    通过将有问题的测试更改为在其名称中包含前导 DISABLED_,默认情况下这些测试不会在您执行 make test 时运行。

    然后您可以添加您的自定义目标,该目标将使用适当的 Gtest 标志调用您的测试可执行文件,以仅运行禁用的测试:

    add_custom_target(skip_test
        MyTestBinary --gtest_filter=*DISABLED_* --gtest_also_run_disabled_tests VERBATIM)
    

    这有点滥用 Gtest 功能 - 它实际上是用来暂时禁用测试,同时重构任何东西以使测试再次通过。这比仅仅注释掉测试要好,因为它会继续编译它,并且在运行套件后它会提醒你禁用了测试。

    【讨论】:

    • 这似乎是一个合理的想法。我尚未对其进行测试,因为我尝试使用 Ctest 配置标志,但您的想法实际上可能更容易。谢谢!
    猜你喜欢
    • 2018-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-09
    • 1970-01-01
    • 2013-04-30
    • 1970-01-01
    相关资源
    最近更新 更多