单元测试是一种用于验证代码正确性的方法。ZeroErr提供了一个简单易用的单元测试框架。
基本用法
最简单的测试用例如下:
}
#define REQUIRE(...)
定义 assert.h:170
#define TEST_CASE(...)
定义 unittest.h:31
TEST_CASE 宏用于定义一个测试用例。它接受一个字符串参数作为测试名称。 在测试用例中,你可以使用各种断言宏来验证代码的行为。断言宏的使用,请参考断言。
装饰器
ZeroErr提供了一些装饰器,可以用来修饰测试用例。
- skip(): 跳过当前测试用例
- timeout(): 设置当前测试用例的超时时间
- may_fail(): 定义一个可能会失败的测试用例
- should_fail(): 定义一个应该失败的测试用例
这些装饰器可以插入到测试定义的宏中使用:
TEST_CASE(
"my first test", should_fail(), timeout(0.01)) {
}
测试夹具(Test Fixture)
如果你需要在多个测试之间共享一些设置代码,可以使用测试夹具:
class MyFixture {
protected:
std::vector<int> numbers;
void SetUp() {
numbers = {1, 2, 3, 4, 5};
}
};
SetUp();
}
#define TEST_CASE_FIXTURE(fixture,...)
定义 unittest.h:56
BDD 风格测试
ZeroErr支持行为驱动开发(BDD)风格的测试:
User user("test", "password");
bool result = user.login("password");
}
}
}
}
#define GIVEN(...)
定义 unittest.h:66
#define THEN(...)
定义 unittest.h:68
#define SCENARIO(...)
定义 unittest.h:65
#define WHEN(...)
定义 unittest.h:67
测试矩阵
测试结果会被分为以下几类:
- passed: 通过的测试数量
- warning: 带警告通过的测试数量
- failed: 失败的测试数量
- skipped: 跳过的测试数量
配置选项
UnitTest提供了多个命令行配置选项:
- -h, --help: 显示命令行帮助
- -v, --verbose: 输出测试结果
- -q, --quiet: 不输出测试结果
- -l, --list-test-cases: 列出所有测试用例
- -b, --bench: 启用定义的基准测试
- -f, --fuzz: 启用定义的模糊测试
- --list-format=FORMAT: 列表输出格式,console(默认)或plain
- --no-color: 不使用彩色输出
- --log-to-report: 将测试结果记录到报告中
- --reporters=NAME: 报告器名称(支持console, xml两种)
- -x: --reporters=xml 的简写
- --testcase=REGEX: 运行名称匹配 REGEX 的测试用例
- --testcase-exclude=REGEX: 排除名称匹配 REGEX 的测试用例
- --file=REGEX: 运行文件匹配 REGEX 的测试用例
- --file-exclude=REGEX: 排除文件匹配 REGEX 的测试用例
--testcase / --testcase-exclude 等过滤条件使用**完整匹配**的正则表达式, 例如只运行 data 开头的用例应写作 --testcase=^data\..*$。
--list-format=plain 提供机器可读的测试列表,每行输出 <用例名>\t<源文件名>:<行号> 到标准输出,适合被 CTest 等构建工具解析, 例如:
data.ByteData.roundTrip data.cpp:42
data.JsonDocument.queryBoundaries data.cpp:88
逐测试覆盖率
参见 Clang 覆盖率采集与统计,了解可选的逐测试函数、源码区域和分支结果覆盖率功能。