Catch#

Catch2(仅支持 C++11 的版本)是功能强大、符合习惯的测试解决方案,其哲学理念与 Python 的 PyTest 相似。它支持的编译器范围比 GTest 更广,并且能够快速支持新事物,例如在 macOS 上支持 M1 构建。它还有更小但更快的双胞胎版本 doctest,后者编译速度快但缺少匹配器等特性。要在 CMake 项目中使用 Catch,有几种选项。

配置方法#

Catch 拥有良好的 CMake 支持,不过要使用它,你需要完整仓库。这可以通过子模块或 FetchContent 实现。extended-projectfetch 示例都使用了 FetchContent。请参阅文档

快速下载#

这可能是最简单的方法,并且支持较旧版本的 CMake。你可以一次性下载包含所有内容的头文件:

add_library(catch_main main.cpp)
target_include_directories(catch_main PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}")
set(url https://github.com/philsquared/Catch/releases/download/v2.13.6/catch.hpp)
file(
  DOWNLOAD ${url} "${CMAKE_CURRENT_BINARY_DIR}/catch.hpp"
  STATUS status
  EXPECTED_HASH SHA256=681e7505a50887c9085539e5135794fc8f66d8e5de28eadf13a30978627b0f47)
list(GET status 0 error)
if(error)
  message(FATAL_ERROR "Could not download ${url}")
endif()
target_include_directories(catch_main PUBLIC "${CMAKE_CURRENT_BINARY_DIR}")

当 Catch 3 发布时,这将需要两次下载,因为现在需要两个文件(但不再需要编写 main.cpp)。main.cpp 看起来像这样:

#define CATCH_CONFIG_MAIN
#include "catch.hpp"

Vendoring#

如果你直接将 Catch 的单个包含版本放入你的项目中,你需要添加 Catch:

# Prepare "Catch" library for other executables
set(CATCH_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/extern/catch)
add_library(Catch2::Catch IMPORTED INTERFACE)
set_property(Catch2::Catch PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${CATCH_INCLUDE_DIR}")

然后,你会链接到 Catch2::Catch。这本来可以作为 INTERFACE 目标,因为你不会导出你的测试。

直接包含#

如果你使用 ExternalProjectFetchContent 或 git 子模块添加库,你也可以 add_subdirectory Catch(CMake 3.1+)。

Catch 还提供了两个 CMake 模块,你可以使用它们将各个测试注册到 CMake 中。