4.6 预期测试失败

NOTE:此示例代码可以在 https://github.com/dev-cafe/cmake-cookbook/tree/v1.0/chapter-04/recipe-06 中找到,包含一个C++的示例。该示例在CMake 3.5版(或更高版本)中是有效的,并且已经在GNU/Linux、macOS和Windows上进行过测试。

理想情况下,我们希望所有的测试能在每个平台上通过。然而,也可能想要测试预期的失败或异常是否会在受控的设置中进行。这种情况下,我们将把预期的失败定义为成功。我们认为,这通常应该交给测试框架(例如:Catch2或Google Test)的任务,它应该检查预期的失败并向CMake报告成功。但是,在某些情况下,您可能希望将测试的非零返回代码定义为成功;换句话说,您可能想要颠倒成功和失败的定义。在本示例中,我们将演示这种情况。

准备工作

这个配置的测试用例是一个很小的Python脚本(test.py),它总是返回1,CMake将其解释为失败:

  1. import sys
  2. # simulate a failing test
  3. sys.exit(1)

实施步骤

如何编写CMakeLists.txt来完成我们的任务:

  1. 这个示例中,不需要任何语言支持从CMake,但需要Python:

    1. cmake_minimum_required(VERSION 3.5 FATAL_ERROR)
    2. project(recipe-06 LANGUAGES NONE)
    3. find_package(PythonInterp REQUIRED)
  2. 然后,定义测试并告诉CMake,测试预期会失败:

    1. enable_testing()
    2. add_test(example ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test.py)
    3. set_tests_properties(example PROPERTIES WILL_FAIL true)
  3. 最后,报告是一个成功的测试,如下所示:

    1. $ mkdir -p build
    2. $ cd build
    3. $ cmake ..
    4. $ cmake --build .
    5. $ ctest
    6. Test project /home/user/cmake-recipes/chapter-04/recipe-06/example/build
    7. Start 1: example
    8. 1/1 Test #1: example .......................... Passed 0.00 sec
    9. 100% tests passed, 0 tests failed out of 1
    10. Total Test time (real) = 0.01 sec

工作原理

使用set_tests_properties(example PROPERTIES WILL_FAIL true),将属性WILL_FAIL设置为true,这将转换成功与失败。但是,这个特性不应该用来临时修复损坏的测试。

更多信息

如果需要更大的灵活性,可以将测试属性PASS_REGULAR_EXPRESSIONFAIL_REGULAR_EXPRESSIONset_tests_properties组合使用。如果设置了这些参数,测试输出将根据参数给出的正则表达式列表进行检查,如果匹配了正则表达式,测试将通过或失败。可以在测试中设置其他属性,完整的属性列表可以参考:https://cmake.org/cmake/help/v3.5/manual/cmake-properties.7.html#properties-on-tests