一般测试信息

一般测试信息#

在你的主 CMakeLists.txt 文件中,需要在根目录下添加以下函数调用:

if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME)
    include(CTest)
endif()

这将启用测试并设置 BUILD_TESTING 选项,以便用户可以开启或关闭测试(同时还能控制其他一些功能)。或者你可以通过直接调用 enable_testing() 来自行设置。

当你添加测试文件夹时,应该像这样操作:

if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME AND BUILD_TESTING)
    add_subdirectory(tests)
endif()

这样做的理由是,如果其他人包含了你的包,并且他们使用了 BUILD_TESTING,他们很可能不希望构建你的测试。在极少数情况下,如果你确实希望同时在这两个包中启用测试,你可以提供一个覆盖设置。

if((CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME OR MYPROJECT_BUILD_TESTING) AND BUILD_TESTING)
    add_subdirectory(tests)
endif()

上述覆盖的主要用例实际上是在本书自己的示例中,因为主 CMake 项目确实想要运行所有子项目的测试。

您可以使用以下方式注册目标:

add_test(NAME TestName COMMAND TargetName)

如果在 COMMAND 后面放置除目标名称之外的其他内容,它将注册为要运行的命令行。同样,使用生成器表达式也是有效的:

add_test(NAME TestName COMMAND $<TARGET_FILE:${TESTNAME}>)

这将使用生成目标的输出位置(因此,可执行文件)。

作为测试的一部分构建#

如果你想在测试中运行 CMake 来构建一个项目,也可以这样做(事实上,这就是 CMake 自身进行测试的方式)。例如,如果你的主项目名为 MyProject ,并且你有一个可以通过自身构建的 examples/simple 项目,这看起来会像:

add_test(
  NAME
    ExampleCMakeBuild
  COMMAND
    "${CMAKE_CTEST_COMMAND}"
             --build-and-test "${My_SOURCE_DIR}/examples/simple"
                              "${CMAKE_CURRENT_BINARY_DIR}/simple"
             --build-generator "${CMAKE_GENERATOR}"
             --test-command "${CMAKE_CTEST_COMMAND}"
)

测试框架#

查看关于流行框架的配方子章节。

  • GoogleTest:一个来自 Google 的流行选项。开发可能会有点慢。

  • Catch2:现代的、类似 PyTest 的框架,带有巧妙的宏。

  • DocTest:替代 Catch2 的工具,据称编译速度更快且更简洁。参见 Catch2 章节并替换为 DocTest。