聊到C++测试框架,大家可能首先想到的是Catch2、Google Test这些“大块头”。但如果在嵌入式环境、游戏引擎或者高频构建场景下,它们的启动开销和宏膨胀确实让人头疼。这时候,snitch这个轻量级方案就值得好好看看了。
它有什么特别之处?一句话总结:snitch是一个header-only、零依赖、专为现代C++(C++17起)打造的测试框架,没有运行时注册,也没有复杂的宏魔术。测试用例直接写成普通函数,靠编译期注册机制自动发现。编译快、体积小、错误信息直给,但代价是功能相对精简——不支持参数化测试(需要手动循环)、没有断言重试、也不内置mock。如果你对Catch2的启动时间或doctest的宏膨胀感到困扰,snitch会是一个不错的替代选择。
snitch 是什么,适合哪些 C++ 项目
snitch是一个header-only、零依赖的轻量级测试框架,面向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 void sigsegv_handler(int) { std::abort(); }signal(SIGSEGV, sigsegv_handler);
一个容易被忽略的点是:snitch默认把每个
SNITCH_TEST_CASE编译为独立函数,如果测试中使用了静态局部变量,不同测试之间会共享状态。要隔离状态,需要显式地用lambda包一层,或者改用
SNITCH_TEST_CASE_PARAMETERIZED(需手动展开)。
本文转载于:https://www.php.cn/faq/2318066.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。