snitch 是一个 header-only、零依赖、面向现代 c++17+ 的轻量测试框架,适合嵌入式、游戏引擎及高频构建项目;它编译快、体积小、错误直给,但功能精简,不支持参数化测试、断言重试或内置 mock。

snitch 是什么,适合哪些 C++ 项目
snitch 是一个 header-only、零依赖、专为现代 C++(C++17 起)设计的轻量级测试框架,不带运行时注册或宏魔术,测试用例直接写成普通函数,靠编译期注册机制自动发现。它适合嵌入式、游戏引擎、高频构建场景——尤其当你被 catch2 的启动开销或 doctest 的宏膨胀困扰时,snitch 的二进制体积小、编译快、错误信息直给,但代价是功能精简:不支持参数化测试(需手动循环)、无断言重试、不内置 mock。
如何在 CMake 项目中接入 snitch
snitch 没有安装步骤,只需下载单头文件并纳入 include 路径。常见做法是:git submodule add https://github.com/cschreib/snitch snitch,然后在 CMakeLists.txt 中添加:
add_executable(my_tests main.cpp)
target_include_directories(my_tests PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/snitch/include)
target_compile_features(my_tests PRIVATE cxx_std_17 cxx_constexpr)
注意两点:
- 必须启用
cxx_constexpr(snitch 大量使用 constexpr 注册) - 不要用
-std=c++17全局覆盖,而应通过target_compile_features让 CMake 自动选择最低兼容标准 - 若用 MSVC,需确保
/permissive-关闭严格模式,否则部分 constexpr 表达式会编译失败
写第一个 snitch 测试:从 TEST_CASE 到断言
snitch 不用宏定义测试函数,而是用 SNITCH_TEST_CASE 函数模板注册。最简写法:
#include "snitch/snitch.hpp"
SNITCH_TEST_CASE("addition works") {
int result = 2 + 2;
snitch::expect(result == 4);
}
snitch::expect 是核心断言,失败时直接输出表达式原文和值;它不终止执行,同一测试内后续断言仍会运行。对比 snitch::require:后者失败即跳出当前测试(类似传统 assert),适合前置条件检查。别误用 snitch::check —— 它已被弃用,链接时会报 undefined reference to 'snitch::check' 错误。
调试失败测试与控制输出粒度
运行测试时默认只显示失败项,加 --verbose 可看全部通过项;加 --filter "add*" 按名称筛选。若遇到 segmentation fault 却没堆栈,大概率是测试函数里调用了未初始化的 std::string_view 或访问了悬垂指针——snitch 本身不接管异常,所有未捕获异常都会直接 crash。此时建议在 main() 前加:
#include <signal.h>
void sigsegv_handler(int) { std::abort(); }
signal(SIGSEGV, sigsegv_handler);
</signal.h>
真正容易被忽略的是:snitch 默认把每个 SNITCH_TEST_CASE 编译为独立函数,若测试中用了静态局部变量,不同测试间会共享状态。要隔离,得显式用 lambda 包一层,或改用 SNITCH_TEST_CASE_PARAMETERIZED(需手动展开)。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











