Instruction file imported from qqzhangyanhua/mabiao (
.cursor/rules/testing.mdc). Copyright stays with the author.
测试策略(src-tauri)
运行:cargo test --manifest-path src-tauri/Cargo.toml(或在 src-tauri 目录下 cargo test)。Rust 测试按域拆在 src-tauri/src/tests/(adapters、ingest、query、parity、cursor_*、official_quota、instructions 等),共享辅助函数在 src-tauri/src/test_support/;src-tauri/tests/fixtures/ 只放数据夹具。
Adapter 测试
- 每个 adapter 至少一个测试:读取
tests/fixtures/<source>.jsonl/.json(通过fixture()helper),断言解析出的UsageRecord字段,特别是去重/累计口径这种最容易出 bug 的地方(参考codex_adapter_counts_last_token_usage_not_cumulative显式断言「求和不等于双倍累计值」) - 新增/修改 fixture 时保持内容最小化且脱敏(不含真实用户路径、真实会话内容),复用现有 fixture 命名风格
聚合测试:aggregate.rs 是 query.rs 的差分测试基准,不是被替代的旧代码
aggregate.rs(内存实现)与query.rs(SQL 下推,生产实际使用)必须对同一组数据产生完全一致的结果;sql_queries_match_in_memory_aggregates测试用同一份diverse_records()/diverse_prices()跑两条路径并逐字段assert_eq!- 修改
query.rs的任何聚合/过滤/费用 SQL 时,必须同步验证或更新aggregate.rs的等价实现,并确保这条 parity 测试仍然通过;反之亦然。不要因为「SQL 更快」就删除aggregate.rs或跳过对照 - 新增聚合维度/DTO 字段时,两边都要实现,并在 parity 测试里补上覆盖
- 生产源码不得引用
aggregate(Cursor 账号用量叠加走cursor_overlay)。守卫测试扫描src/(排除tests/与test_support/)断言零引用,无豁免清单
Ingest / store 测试
- 涉及文件系统的测试使用
tempfile构造临时目录模拟home,用store::open_memory()建内存 sqlite,不要依赖真实的~/.codex等本机路径 - 覆盖
docs/adr/0003-trusted-ingestion-cache.md里的场景:文件不变跳过重解析、解析失败保留旧缓存、追加日志记录数下降判定失败、来源消失后对账归档(archived_at,ADR 0004)、目录读取错误不误归档
前端
- 纯函数单测用 Vitest(
pnpm test),在src/lib/*.test.ts、src/hooks/*.test.ts、src/report/*.test.ts,node 环境;暂无组件级/E2E 测试 tsc类型检查是pnpm run build的一部分,改 DTO/types.ts时必须能通过