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将其解释为失败:
import sys
# simulate a failing test
sys.exit(1)
实施步骤
如何编写CMakeLists.txt来完成我们的任务:
这个示例中,不需要任何语言支持从CMake,但需要Python:
cmake_minimum_required(VERSION 3.5 FATAL_ERROR)
project(recipe-06 LANGUAGES NONE)
find_package(PythonInterp REQUIRED)
然后,定义测试并告诉CMake,测试预期会失败:
enable_testing()
add_test(example ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test.py)
set_tests_properties(example PROPERTIES WILL_FAIL true)
最后,报告是一个成功的测试,如下所示:
$ mkdir -p build
$ cd build
$ cmake ..
$ cmake --build .
$ ctest
Test project /home/user/cmake-recipes/chapter-04/recipe-06/example/build
Start 1: example
1/1 Test #1: example .......................... Passed 0.00 sec
100% tests passed, 0 tests failed out of 1
Total Test time (real) = 0.01 sec
工作原理
使用set_tests_properties(example PROPERTIES WILL_FAIL true)
,将属性WILL_FAIL
设置为true
,这将转换成功与失败。但是,这个特性不应该用来临时修复损坏的测试。
更多信息
如果需要更大的灵活性,可以将测试属性PASS_REGULAR_EXPRESSION
和FAIL_REGULAR_EXPRESSION
与set_tests_properties
组合使用。如果设置了这些参数,测试输出将根据参数给出的正则表达式列表进行检查,如果匹配了正则表达式,测试将通过或失败。可以在测试中设置其他属性,完整的属性列表可以参考:https://cmake.org/cmake/help/v3.5/manual/cmake-properties.7.html#properties-on-tests 。