286 lines
6.8 KiB
Markdown
286 lines
6.8 KiB
Markdown
# 🧪 自动化测试快速开始
|
||
|
||
> **💡 重要提示**:
|
||
> - ✅ **单元测试**:46个测试,可在任何机器运行(无需数据库)→ **开发时使用**
|
||
> - ⚠️ **E2E测试**:20个测试,需要PostgreSQL和Redis → **测试环境使用**
|
||
>
|
||
> 📖 详细说明请查看:[TESTING_STRATEGY.md](TESTING_STRATEGY.md)
|
||
|
||
## 📦 已创建的测试文件
|
||
|
||
### ✅ E2E 测试(端到端测试)
|
||
- **文件**: [test/app.e2e-spec.ts](test/app.e2e-spec.ts)
|
||
- **测试场景**: 8 个完整的用户场景
|
||
- **测试用例**: 40+ 个测试用例
|
||
- **覆盖功能**:
|
||
- 用户注册和账户创建
|
||
- 用户资料管理
|
||
- 设备管理(最多5个设备)
|
||
- Token 刷新
|
||
- 推荐系统
|
||
- KYC 认证
|
||
- 助记词恢复
|
||
- 数据验证
|
||
|
||
### ✅ 单元测试
|
||
1. **助记词测试**: [src/domain/value-objects/mnemonic.vo.spec.ts](src/domain/value-objects/mnemonic.vo.spec.ts)
|
||
- 生成助记词
|
||
- 验证格式
|
||
- 转换为 seed
|
||
- 相等性比较
|
||
|
||
2. **手机号测试**: [src/domain/value-objects/phone-number.vo.spec.ts](src/domain/value-objects/phone-number.vo.spec.ts)
|
||
- 格式验证(中国手机号)
|
||
- 掩码显示
|
||
- 相等性比较
|
||
|
||
3. **钱包生成服务测试**: [src/infrastructure/external/blockchain/wallet-generator.service.spec.ts](src/infrastructure/external/blockchain/wallet-generator.service.spec.ts)
|
||
- 生成钱包系统
|
||
- 三条链地址(KAVA/DST/BSC)
|
||
- 助记词恢复
|
||
- 加密解密
|
||
|
||
## 🚀 快速运行测试
|
||
|
||
### 1. 安装测试依赖
|
||
```bash
|
||
npm install
|
||
```
|
||
|
||
新增的测试依赖:
|
||
- `supertest@^6.3.3` - HTTP 断言库
|
||
- `@types/supertest@^6.0.0` - TypeScript 类型定义
|
||
|
||
### 2. 准备 E2E 测试环境
|
||
|
||
E2E 测试需要数据库和 Redis,但 **不需要** Kafka(已使用 Mock)。
|
||
|
||
详细设置请参阅: [E2E_TEST_SETUP.md](E2E_TEST_SETUP.md)
|
||
|
||
快速开始:
|
||
```bash
|
||
# 确保 PostgreSQL 和 Redis 正在运行
|
||
# 准备测试数据库
|
||
DATABASE_URL="postgresql://postgres:password@localhost:5432/rwa_identity_test?schema=public" npx prisma migrate dev
|
||
```
|
||
|
||
### 3. 运行所有单元测试
|
||
```bash
|
||
npm test
|
||
```
|
||
|
||
**预期输出**:
|
||
```
|
||
PASS src/domain/value-objects/mnemonic.vo.spec.ts
|
||
PASS src/domain/value-objects/phone-number.vo.spec.ts
|
||
PASS src/infrastructure/external/blockchain/wallet-generator.service.spec.ts
|
||
|
||
Test Suites: 3 passed, 3 total
|
||
Tests: 30+ passed, 30+ total
|
||
```
|
||
|
||
### 4. 运行 E2E 测试
|
||
```bash
|
||
npm run test:e2e
|
||
```
|
||
|
||
**注意**: E2E 测试需要:
|
||
- ✅ PostgreSQL 数据库(测试数据库)
|
||
- ✅ Redis 服务
|
||
- ❌ **不需要** Kafka(已使用 Mock)
|
||
- ❌ **不需要** SMS 服务(已使用 Mock)
|
||
|
||
**预期输出**:
|
||
```
|
||
PASS test/app.e2e-spec.ts
|
||
Identity Service E2E Tests
|
||
✓ 应该成功自动创建账户 (150ms)
|
||
✓ 应该获取个人资料 (50ms)
|
||
✓ 应该更新个人资料 (60ms)
|
||
✓ 应该获取设备列表 (45ms)
|
||
...
|
||
|
||
Test Suites: 1 passed, 1 total
|
||
Tests: 20+ passed, 20+ total
|
||
```
|
||
|
||
如果遇到问题,请参阅 [E2E_TEST_SETUP.md](E2E_TEST_SETUP.md)
|
||
|
||
### 4. 查看测试覆盖率
|
||
```bash
|
||
npm run test:cov
|
||
```
|
||
|
||
然后打开生成的报告:
|
||
```bash
|
||
# Windows
|
||
start coverage/lcov-report/index.html
|
||
|
||
# macOS
|
||
open coverage/lcov-report/index.html
|
||
|
||
# Linux
|
||
xdg-open coverage/lcov-report/index.html
|
||
```
|
||
|
||
## 📊 测试统计
|
||
|
||
### E2E 测试覆盖
|
||
- ✅ 8 个主要测试场景
|
||
- ✅ 40+ 个具体测试用例
|
||
- ✅ 覆盖所有 14 个 API 端点
|
||
- ✅ 验证所有关键业务逻辑
|
||
|
||
### 单元测试覆盖
|
||
- ✅ 核心值对象(Mnemonic, PhoneNumber)
|
||
- ✅ 关键服务(WalletGenerator)
|
||
- ✅ 领域聚合根(UserAccount - 已存在)
|
||
|
||
## 🎯 测试示例
|
||
|
||
### E2E 测试示例
|
||
```typescript
|
||
it('应该成功自动创建账户', async () => {
|
||
const response = await request(app.getHttpServer())
|
||
.post('/api/v1/user/auto-create')
|
||
.send({
|
||
deviceId: 'test-device-001',
|
||
deviceName: 'Test Device',
|
||
provinceCode: '110000',
|
||
cityCode: '110100',
|
||
})
|
||
.expect(201);
|
||
|
||
expect(response.body.data).toHaveProperty('userId');
|
||
expect(response.body.data).toHaveProperty('mnemonic');
|
||
expect(response.body.data).toHaveProperty('accessToken');
|
||
});
|
||
```
|
||
|
||
### 单元测试示例
|
||
```typescript
|
||
it('应该生成有效的12个单词助记词', () => {
|
||
const mnemonic = Mnemonic.generate();
|
||
const words = mnemonic.getWords();
|
||
|
||
expect(words).toHaveLength(12);
|
||
expect(words.every(word => word.length > 0)).toBe(true);
|
||
});
|
||
```
|
||
|
||
## 🔍 常用测试命令
|
||
|
||
```bash
|
||
# 运行所有测试
|
||
npm test
|
||
|
||
# 监听模式(自动重新运行)
|
||
npm run test:watch
|
||
|
||
# 生成覆盖率报告
|
||
npm run test:cov
|
||
|
||
# 运行 E2E 测试
|
||
npm run test:e2e
|
||
|
||
# 运行特定测试文件
|
||
npm test -- mnemonic.vo.spec
|
||
|
||
# 运行特定测试用例
|
||
npm test -- --testNamePattern="应该生成有效的助记词"
|
||
|
||
# 调试模式
|
||
npm run test:debug
|
||
```
|
||
|
||
## 📝 测试编写指南
|
||
|
||
### 添加新的单元测试
|
||
|
||
在源文件同目录创建 `.spec.ts` 文件:
|
||
|
||
```typescript
|
||
// src/your-module/your-class.spec.ts
|
||
import { YourClass } from './your-class';
|
||
|
||
describe('YourClass', () => {
|
||
it('should do something', () => {
|
||
const instance = new YourClass();
|
||
const result = instance.doSomething();
|
||
expect(result).toBe('expected');
|
||
});
|
||
});
|
||
```
|
||
|
||
### 添加新的 E2E 测试场景
|
||
|
||
在 `test/app.e2e-spec.ts` 中添加:
|
||
|
||
```typescript
|
||
describe('新功能测试', () => {
|
||
it('should test new feature', async () => {
|
||
const response = await request(app.getHttpServer())
|
||
.post('/api/v1/new-endpoint')
|
||
.set('Authorization', `Bearer ${accessToken}`)
|
||
.send({ data: 'test' })
|
||
.expect(201);
|
||
|
||
expect(response.body.success).toBe(true);
|
||
});
|
||
});
|
||
```
|
||
|
||
## 🎬 CI/CD 集成
|
||
|
||
测试可以轻松集成到 CI/CD 流程:
|
||
|
||
```yaml
|
||
# .github/workflows/test.yml
|
||
name: Tests
|
||
on: [push, pull_request]
|
||
jobs:
|
||
test:
|
||
runs-on: ubuntu-latest
|
||
steps:
|
||
- uses: actions/checkout@v3
|
||
- uses: actions/setup-node@v3
|
||
with:
|
||
node-version: '20'
|
||
- run: npm ci
|
||
- run: npm run prisma:generate
|
||
- run: npm test
|
||
- run: npm run test:e2e
|
||
```
|
||
|
||
## 📚 更多信息
|
||
|
||
详细的测试指南请参阅:
|
||
- [TEST_AUTOMATION_GUIDE.md](TEST_AUTOMATION_GUIDE.md) - 完整的自动化测试文档
|
||
- [TESTING_GUIDE.md](TESTING_GUIDE.md) - 手动测试指南
|
||
|
||
## ⚡ 下一步
|
||
|
||
1. **运行测试验证**
|
||
```bash
|
||
npm install
|
||
npm test
|
||
npm run test:e2e
|
||
```
|
||
|
||
2. **查看测试覆盖率**
|
||
```bash
|
||
npm run test:cov
|
||
```
|
||
|
||
3. **添加更多测试**
|
||
- 为新功能编写单元测试
|
||
- 为新 API 添加 E2E 测试
|
||
|
||
4. **集成到 CI/CD**
|
||
- 设置 GitHub Actions
|
||
- 自动运行测试
|
||
|
||
---
|
||
|
||
🎉 **恭喜!** 你的项目现在有了完整的自动化测试套件!
|