1) 修复一处从未暴露的 CI 缺陷 库中 operator 账号没有任何迁移种子,DemoDataSeeder 也不创建运营账号 (只统计数量),全新库唯一的账号来源是 seed_e2e_operators.sql。 而 conftest 的 admin_token 写死 username="admin" —— 那是某台开发机上 手工创建的遗留账号:本机有它所以本地一直跑绿,CI 全新库没有它 → 该 fixture 必然 401 → e2e job 从未真正通过过。 同一文件里「外加迁移 seed 的 admin」这句注释也是纯粹的虚构。 改用 seed 创建的 e2e_admin(已绑定 super_admin,语义等价)。 2) fixture_account_guard_test.py(2 用例) 机械拦住「fixture 依赖本机手工数据」:从 seed SQL 解析账号清单, 扫描 conftest 的所有登录用户名,任何一个不在 seed 内即变红; 另一条锁住推理前提(迁移里确实没有 operator 种子)。 两条都带「解析失败即失败」断言 —— 守卫自身静默失效是本项目反复踩过的坑。 3) idempotency_test.py(7 用例) 同键重放响应逐字节相同、同键重复提交只产生一条记录、body 字段幂等未回归、 不同键相互独立、同键作用域按 actor 隔离、5 线程并发同键业务恰好落库一次、 无键重复 Like 不得返回 500。 4) conftest.ApiClient.call 支持 headers 覆盖,供幂等用例携带自定义键。
测试基础设施
测试目录结构
tests/
├── invariants/ # 核心不变量测试(每次CI必跑)
│ ├── INV-001_Required不可自动放宽.test.ts
│ ├── INV-002_未Mutual不可聊天.test.ts
│ ├── INV-003_Block后双方不可互动.test.ts
│ ├── INV-004_双向并发Like只创建一个Match.test.ts
│ ├── INV-005_Activity最后一个名额不可超卖.test.ts
│ ├── INV-006_单向活动意向不可泄露.test.ts
│ ├── INV-007_红娘不能替用户Like.test.ts
│ ├── INV-008_非授权Operator不能读取身份证.test.ts
│ ├── INV-009_非案件上下文不能读取聊天.test.ts
│ └── INV-010_跨Organization不能越权.test.ts
├── unit/ # 单元测试
├── integration/ # 集成测试
├── api/ # API 测试
├── permission/ # 权限测试
├── concurrency/ # 并发测试
└── e2e/ # 端到端测试
Phase 01 测试骨架
每个测试文件至少包含:
- 测试描述
- 前置条件
- 操作步骤
- 预期结果
- 断言
运行测试
# Backend 单元测试
cd backend
./mvnw test
# Backend 集成测试
./mvnw verify
# Admin Web 构建检查
cd admin-web
pnpm build
# Miniapp 编译检查
cd miniapp
npx tsc --noEmit