ZeroErr
载入中...
搜索中...
未找到
单元测试(Unit Test)

单元测试是一种用于验证代码正确性的方法。ZeroErr提供了一个简单易用的单元测试框架。

基本用法

最简单的测试用例如下:

TEST_CASE("my first test") {
REQUIRE(1 + 1 == 2);
}
#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)) {
REQUIRE(1 + 1 != 2);
}

测试夹具(Test Fixture)

如果你需要在多个测试之间共享一些设置代码,可以使用测试夹具:

class MyFixture {
protected:
std::vector<int> numbers;
void SetUp() {
numbers = {1, 2, 3, 4, 5};
}
};
TEST_CASE_FIXTURE(MyFixture, "test with fixture") {
SetUp();
REQUIRE(numbers.size() == 5);
}
#define TEST_CASE_FIXTURE(fixture,...)
定义 unittest.h:56

BDD 风格测试

ZeroErr支持行为驱动开发(BDD)风格的测试:

SCENARIO("用户登录") {
GIVEN("一个已注册用户") {
User user("test", "password");
WHEN("使用正确的密码登录") {
bool result = user.login("password");
THEN("登录应该成功") {
REQUIRE(result == true);
}
}
}
}
#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 覆盖率采集与统计,了解可选的逐测试函数、源码区域和分支结果覆盖率功能。