Files
danyang-match/tests
WorkBuddy af5412646b test(e2e): 运营登录只用 seed 账号;补幂等 E2E 与两处机械守卫
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 覆盖,供幂等用例携带自定义键。
2026-09-18 16:37:33 +08:00
..

测试基础设施

测试目录结构

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