dunitest 用户态测试框架

dunitest 是 DragonOS 的用户态单元测试框架,用于运行基于 Google Test 的 C++ 测例并输出结构化报告。

现状

  • runner 自动发现 bin/ 下的可执行文件并执行

  • 默认超时 60 秒,可通过 --timeout-sec 覆盖

  • 测例过滤顺序:white list -> block list -> –pattern

  • 汇总统计默认按 gtest 的测试用例数聚合(不是按测试程序个数)

  • 测试失败或超时时,runner 返回非 0

目录与职责

user/apps/tests/dunitest/
├── runner/                 # Rust 测试运行器
├── suites/                 # 测试源码(按 suite 分目录)
├── bin/                    # 编译产物(runner 自动发现)
├── whitelist.txt           # 默认白名单
├── scripts/run_tests.sh    # 系统内执行入口
└── Makefile

关键规则

  1. 源码位置:suites/<suite>/*.cc

  2. 编译输出:bin/<suite>/<case>_test

  3. runner 用例名:<suite>/<case>``(自动去掉 ``_test 后缀)

示例:

  • 二进制:bin/demo/gtest_demo_test

  • 用例名:demo/gtest_demo

  • white list 条目:demo/gtest_demo

如何新增测例

推荐:普通功能测试优先放在 normal suite

  • 普通/通用功能测例建议统一放在 suites/normal/ 下,便于集中维护

  • 示例:suites/normal/capability.cc

  • whitelist.txt 中对应条目写作:normal/capability

1. 新增 gtest 源码

新增文件,例如:

suites/normal/capability.cc

2. 把 suite 加入 Makefile

编辑 user/apps/tests/dunitest/MakefileSUITES

# 如果新增了目录,需要在这里加入
SUITES = demo normal

3. 构建并运行(支持并行)

在仓库根目录:

make test-dunit-local

或在 dunitest 目录:

make run -j$(nproc)

构建日志示例:

编译测例: suites/normal/capability.cc -> bin/normal/capability_test

4. 加入 white list

编辑 whitelist.txt,每行一个用例名:

demo/gtest_demo
normal/capability

Runner 参数

dunitest-runner [OPTIONS]

  --bin-dir <PATH>       测试二进制目录(默认: bin)
  --timeout-sec <SEC>    单测超时秒数(默认: 60)
  --whitelist <PATH>     white list 路径(默认: whitelist.txt)
  --blocklist <PATH>     block list 路径(默认: blocklist.txt)
  --results-dir <PATH>   报告目录(默认: results)
  --list                 仅列出测例,不执行
  --verbose              详细输出
  --pattern <PATTERN>    名称子串过滤(可多次指定)

报告输出

执行后在 results/ 下生成:

  • test_report.txt:文本报告

  • summary.json:JSON 汇总

  • failed_cases.txt:失败/超时列表

  • <case>.log:单测日志

终端汇总口径说明:

  • 总测试数/通过/失败/跳过 按 gtest 用例数统计

  • 当某个程序没有产出 gtest 统计信息时,才按测试程序粒度回退统计

安装说明

user/apps/tests/dunitest/ 目录下执行 make install 即可