背景:E2E 全套 65 例对对象存储零覆盖,而 generatePresignedUrl 只是本地 签名、不访问存储,因此"签名接口返回 200"无法证明对象真能存进去。 实证(2026-09-22):MinIO 的 /data 下只有 .minio.sys,无任何 bucket; mc cp 到 private 报 `Bucket 'private' does not exist`。全仓库零建桶代码、 零初始化脚本 —— 真实上传链路在当前配置下必然失败,而所有测试仍全绿。 本探针覆盖 PhotoService 的真实路径并要求字节级一致:服务端直传、 presigned PUT(客户端直传)、presigned GET,并同时验证 path / virtual-host 两种 addressing style。支持 --no-create-bucket 负向模式,用于证明判据 有判别力而非恒绿。 不在 CI 运行:依赖 boto3 + requests,不进 tests/e2e/requirements.txt。
测试基础设施
测试目录结构
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