# Identity Service 测试策略

## 测试金字塔

```
        /\
       /  \  E2E Tests (20)
      /----\
     /      \  Integration Tests
    /--------\
   /          \  Unit Tests (46)
  /--------------\
```

## 当前测试状态

### ✅ 已完成
- **单元测试**: 46 个测试全部通过
  - 领域层值对象测试
  - 领域层聚合根测试
  - 基础设施层服务测试

- **E2E 测试**: 20 个测试全部通过
  - 账户创建流程
  - 用户资料管理
  - 设备管理
  - Token 管理
  - 推荐系统
  - KYC 认证
  - 助记词恢复
  - 数据验证

### ⚠️ 需要补充的测试

#### 1. 集成测试（优先级：高）
- [ ] PostgreSQL 真实连接测试
- [ ] Redis 真实连接测试
- [ ] Kafka 真实连接测试
- [ ] 事务一致性测试
- [ ] 并发安全测试

#### 2. 性能测试（优先级：高）
- [ ] 负载测试（100-500 并发）
- [ ] 压力测试（找到系统极限）
- [ ] 数据库连接池测试
- [ ] 内存泄漏测试

#### 3. 安全测试（优先级：高）
- [ ] SQL 注入测试
- [ ] XSS 攻击测试
- [ ] JWT Token 安全测试
- [ ] 暴力破解防护测试
- [ ] 敏感数据保护验证
- [ ] 依赖漏洞扫描（npm audit, Snyk）

#### 4. 手动测试（优先级：中）
- [ ] 完整用户旅程测试
- [ ] 多设备管理流程测试
- [ ] 边界条件测试
- [ ] 异常场景测试

#### 5. 代码质量检查（优先级：中）
- [ ] 测试覆盖率分析（目标 >80%）
- [ ] 代码规范检查（ESLint）
- [ ] 类型安全检查（TypeScript）
- [ ] 代码复杂度分析
- [ ] 依赖关系分析

## 测试执行指南

### 开发阶段
```bash
# 1. 运行单元测试（每次代码修改后）
npm test

# 2. 运行 E2E 测试（每次功能完成后）
npm run test:e2e

# 3. 生成覆盖率报告
npm run test:cov

# 4. 代码规范检查
npm run lint
```

### 提交前检查
```bash
# 运行完整测试套件
npm run test:all  # 需要在 package.json 中添加这个脚本

# 格式化代码
npm run format

# 类型检查
npm run build
```

### 部署前检查
```bash
# 1. 健康检查
./scripts/health-check.sh

# 2. 快速功能测试
./scripts/quick-test.sh

# 3. 安全扫描
npm audit
snyk test

# 4. 性能测试（如果有）
k6 run performance-test.js
```

## 测试环境配置

### 本地开发环境
```bash
# .env.test
NODE_ENV=test
DATABASE_URL=postgresql://test:test@localhost:5432/identity_test
REDIS_URL=redis://localhost:6379
KAFKA_BROKERS=localhost:9092
JWT_SECRET=test-secret-key-for-testing-only
```

### CI/CD 环境
- GitHub Actions / GitLab CI
- 每次 push 自动运行单元测试
- 每次 merge 到 main 自动运行 E2E 测试
- 每日定时运行安全扫描

### 测试环境（Staging）
- 与生产环境配置相同
- 使用真实的外部服务（测试账号）
- 运行完整的集成测试和性能测试

## 测试数据管理

### 测试数据策略
1. **单元测试**: 使用 mock 数据，测试快速、隔离
2. **E2E 测试**: 使用测试数据库，每次测试前清理
3. **集成测试**: 使用真实服务，测试账号/测试环境
4. **性能测试**: 使用大量模拟数据

### 测试数据库种子数据
```bash
# 初始化测试数据
npm run seed:test

# 清理测试数据
npm run seed:reset
```

## 持续改进

### 每个 Sprint
- [ ] 为新功能编写测试（TDD）
- [ ] 修复失败的测试
- [ ] 提高测试覆盖率（+5%）
- [ ] 更新测试文档

### 每个月
- [ ] 运行完整的性能测试
- [ ] 运行安全扫描
- [ ] 更新依赖版本
- [ ] 代码质量回顾

### 每个季度
- [ ] 渗透测试
- [ ] 灾难恢复演练
- [ ] 测试策略回顾和优化

## 测试指标

### 代码覆盖率目标
- 整体覆盖率: **>80%**
- 领域层: **>95%**
- 应用层: **>90%**
- 基础设施层: **>80%**
- API 层: **>85%**

### 性能指标目标
- API 响应时间 P95: **<500ms**
- 数据库查询时间: **<100ms**
- 并发处理能力: **>500 TPS**
- 错误率: **<0.1%**

### 质量指标目标
- 代码复杂度: **<10**
- 代码重复率: **<5%**
- 技术债务比率: **<5%**
- 安全漏洞: **0 个高危**

## 测试清单快速链接

- [集成测试清单](./test/integration-checklist.md)
- [性能测试计划](./test/performance-test.md)
- [安全测试清单](./test/security-test-checklist.md)
- [手动测试场景](./test/manual-test-scenarios.md)
- [代码质量清单](./test/code-quality-checklist.md)

## 常见问题

### Q: 测试失败怎么办？
1. 查看错误日志
2. 在本地复现问题
3. 调试并修复
4. 确认测试通过后提交

### Q: 如何提高测试覆盖率？
1. 使用 `npm run test:cov` 查看未覆盖的代码
2. 为未覆盖的分支添加测试用例
3. 重点关注领域逻辑和边界条件

### Q: 测试运行太慢怎么办？
1. 只运行相关测试: `npm test -- user-account.spec.ts`
2. 使用 mock 替代真实服务
3. 并行运行测试（Jest 默认并行）
4. 优化测试数据准备逻辑

## 结论

当前测试覆盖已经包括：
- ✅ 核心业务逻辑（单元测试）
- ✅ API 端到端流程（E2E 测试）
- ✅ Mock 外部依赖

**但要真正适应生产环境，还需要：**
1. **集成测试** - 验证与真实服务的交互
2. **性能测试** - 验证系统在高负载下的表现
3. **安全测试** - 发现潜在的安全漏洞
4. **手动测试** - 验证用户体验和边界情况

**推荐的测试优先级：**
1. 🔴 **立即进行**: 集成测试（PostgreSQL/Redis/Kafka）
2. 🟡 **本周完成**: 安全测试基础（依赖扫描、输入验证）
3. 🟢 **下周完成**: 性能测试、手动测试
4. 🔵 **持续进行**: 代码质量检查、覆盖率提升
