SuperAPI AI 工具集

testing

测试与质量

查看项目

更新于 10-16 03:57

技能介绍

用途

该技能定位为 Rust/WebAssembly 项目的测试专家,负责编写全面的测试、分析失败原因,并通过完善的测试策略保障代码质量。核心原则是:测试行为而非实现(验证结果而非内部细节)、快速反馈(单元测试毫秒级、集成测试秒级)、确定性(禁止 flaky 测试,所有测试必须可复现)、自文档化(测试名描述所验证的场景)、回归优先(在修改代码之前添加回归测试)。

主要能力

回归测试规则:在修改任何代码(尤其是优化)之前,先添加或扩展捕捉当前行为的回归测试。变更工作流为:READ(理解当前行为)→ TEST(添加一个在当前代码下通过的回归测试)→ CHANGE(进行修改)→ VERIFY(回归测试仍然通过)。这用于防止“优化破坏了未测试的边界情况”这一常见失败模式。

测试类型覆盖:

  • 单元测试:测试单个函数与方法,覆盖正常路径与边界情况,显式测试错误条件。
  • 集成测试:测试模块交互、验证 API 契约、数据库操作与外部服务集成。
  • 属性测试:使用 proptest 生成随机输入、验证不变量、自动发现边界情况并收缩失败用例到最小示例。
  • 性能测试:使用 criterion 编写基准、建立性能基线、检测性能回退、对热路径进行剖析。

测试组织:源码位于 src/,集成测试位于 tests/(含 common/mod.rs 共享工具),基准位于 benches/。

测试模式:包含单元测试的 Arrange/Act/Assert 结构、proptest 属性测试(如序列化往返、排序幂等)、tokio 异步测试(含多线程 flavor 与并发安全测试)、基于 Drop 的资源清理 fixture。

失败分析流程:阅读错误信息 → 检查断言 → 检查输入数据 → 临时使用 dbg!() 输出调试 → 隔离问题并创建最小复现 → 修复并验证不破坏其他测试。

边界与边界情况要求:每个处理数据的函数必须测试空输入、单元素、最大尺寸、超限拒绝;以及 UTF-8 与字符串处理(多字节字符、emoji、RTL 文本、混合脚本、非法 UTF-8)和 I/O 错误处理(文件不存在、权限拒绝、磁盘满)。规则是绝不静默忽略 I/O 或 UTF-8 错误,需文档化行为并显式测试。

覆盖率指引:关键路径最低 80% 行覆盖,库代码目标 90%;重点是错误处理、边界情况与边界条件;所有错误变体必须被测试;跳过生成代码与琐碎的 getter/setter。

命名约定:{function_name}{scenario}{expected_result},例如 parse_empty_string_returns_none、validate_negative_number_returns_error、process_large_input_completes_within_timeout。

unsafe 代码测试:要求对全部代码路径进行单元测试、使用 proptest 做属性测试、可选但推荐的模糊测试目标。

高级验证工具:

  • Miri:Rust 中级中间表示解释器,检测 use after free、double free、越界访问、未初始化数据、别名规则违反、数据竞争、内存泄漏。给出了安装命令(rustup +nightly component add miri)与运行方式(cargo +nightly miri test),并可配合 MIRIFLAGS="-Zmiri-strict-provenance" 使用。建议在每次修改 unsafe 代码的 PR、CI 门禁、发布含 unsafe 内部实现的 crate 前运行。限制是无法运行调用外部 C 函数、执行 I/O 或使用内联汇编的代码。
  • cargo-fuzz:给出安装(cargo install cargo-fuzz)、初始化(cargo fuzz init)、添加目标(cargo fuzz add parse_input)、运行(cargo fuzz run parse_input)、限时运行、最小化崩溃用例(cargo fuzz tmin)、覆盖率检查(cargo fuzz coverage)等命令,并介绍使用 Arbitrary 进行结构化模糊测试与语料库管理。
  • 消毒器:AddressSanitizer(缓冲区溢出、use-after-free、泄漏)、ThreadSanitizer(数据竞争、死锁)、MemorySanitizer(读取未初始化内存),给出对应的 RUSTFLAGS 运行命令与各自的适用场景表。建议在 nightly CI 任务中运行(因需 nightly 而不阻塞)。
  • 高级属性测试:介绍自定义策略(如 valid_email)、集合策略、回归文件(proptest-regressions/)。
  • Loom:用于无锁代码的穷尽并发测试。

工作流集成:在研究阶段识别需要 Miri 的 unsafe 代码路径并整理解析器输入用于模糊测试语料库种子;在设计阶段明确各模块适用的验证工具并设计 fuzz harness API;在验证阶段对全部 unsafe 代码运行 Miri、对全部并发代码运行 TSan、对解析器开展模糊测试活动、对不变量进行属性测试;在确认阶段确认模糊测试覆盖充分并在类生产环境中验证无未定义行为。

适用场景

适用于 Rust/WebAssembly 项目的测试编写、失败分析与质量保障,尤其适合包含 unsafe 代码、并发代码、解析器或需要性能基线的项目。

限制与约束

约束包括:单元测试中绝不使用真实外部服务;绝不编写 flaky 测试;不测试私有实现细节;始终清理测试资源;保持测试独立(无共享可变状态);在修改代码前添加回归测试;显式测试所有错误变体;文档化并测试 I/O 与 UTF-8 行为。成功指标为:所有测试持续通过、覆盖率满足项目要求(最低 80%、目标 90%)、CI 中无 flaky 测试、基准无回退、测试套件在合理时间内完成、所有错误路径被测试、边界情况显式覆盖(空、单元素、最大值、溢出)、unsafe 代码有属性测试证明不变量。