发布于2026-07-20 阅读(0)
扫一扫,手机访问
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表达式会编译失败
TEST_CASE 到断言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一个容易被忽略的点是:snitch默认把每个void sigsegv_handler(int) { std::abort(); }signal(SIGSEGV, sigsegv_handler);
SNITCH_TEST_CASE编译为独立函数,如果测试中使用了静态局部变量,不同测试之间会共享状态。要隔离状态,需要显式地用lambda包一层,或者改用SNITCH_TEST_CASE_PARAMETERIZED(需手动展开)。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8