用途
该技能定位为 Rust/WebAssembly 项目的测试专家,负责编写全面的测试、分析失败原因,并通过系统的测试策略保障代码质量。
主要能力
- 单元测试:测试单个函数与方法,覆盖正常路径与边界情况,显式测试错误条件,使用有意义的测试名称。
- 集成测试:测试模块间交互、验证 API 契约、测试数据库操作与外部服务集成。
- 基于属性的测试:使用 proptest 生成随机输入,验证不变量对所有输入成立,自动发现边界情况,并将失败用例收缩为最小示例。
- 性能测试:使用 criterion 编写基准测试,建立性能基线,检测性能回归,分析热点路径。
- 失败分析:读取错误信息、检查断言、审查输入、临时使用 dbg!() 输出调试信息、构造最小复现、修复并验证。
核心原则
- 测试行为而非实现:验证结果,而非内部细节。
- 快速反馈:单元测试毫秒级,集成测试秒级。
- 确定性:不允许抖动测试,所有测试必须可复现。
- 自文档化:测试名称描述所验证的场景。
- 回归优先:在修改代码之前先添加回归测试。
回归测试规则
在修改任何代码(尤其是优化)之前,先添加或扩展能捕获当前行为的回归测试。变更工作流为:读取并理解当前行为 → 添加在当前代码下通过的回归测试 → 进行修改 → 验证回归测试仍然通过。这可以防止“优化破坏了未测试的边界情况”这一常见失败模式。
使用方式
技能给出了测试目录组织建议:src/ 下放置库代码,tests/ 放置集成测试与共享测试工具,benches/ 放置性能基准。同时提供多种测试模式示例,包括单元测试结构(Arrange/Act/Assert)、基于属性的测试、异步测试(tokio::test)、测试夹具(TestFixture 及 Drop 清理)。
测试命名约定为:{function_name}{scenario}{expected_result},例如 parse_empty_string_returns_none、validate_negative_number_returns_error、process_large_input_completes_within_timeout。
边界与错误处理要求
每个处理数据的函数都必须测试边界条件:空输入、单元素、最大尺寸、超限输入。字符串处理需覆盖多字节字符、emoji、RTL 文本、混合文字以及无效 UTF-8。I/O 需覆盖文件缺失、权限拒绝、磁盘已满等情况。规则是绝不静默忽略 I/O 或 UTF-8 错误,必须记录行为并显式测试。
覆盖率与基准
覆盖率最低要求为关键路径 80% 行覆盖,库代码目标 90%,重点关注错误处理、边界情况与边界条件,所有错误变体都必须测试,可跳过生成代码与平凡 getter/setter。基准测试使用 criterion 的 black_box 与 bench_function。
unsafe 代码测试
unsafe 代码需要更严格的测试:所有代码路径的单元测试、proptest 属性测试,以及可选的模糊测试目标(libfuzzer_sys)。属性测试需证明 unsafe 实现与安全实现结果一致,且永不 panic 或产生未定义行为。
约束
单元测试中不得使用真实外部服务;不得编写抖动测试;不得测试私有实现细节;始终清理测试资源;保持测试独立,不共享可变状态;修改代码前先添加回归测试;显式测试所有错误变体;记录并测试 I/O 与 UTF-8 行为。
成功指标
所有测试稳定通过;覆盖率满足项目要求(最低 80%,目标 90%);CI 中无抖动测试;基准无回归;测试套件在合理时间内完成;所有错误路径已测试;边界情况显式覆盖(空、单个、最大、溢出);unsafe 代码有属性测试证明不变量。