6.3 KiB
6.3 KiB
🧪 自动化测试快速开始
📦 已创建的测试文件
✅ E2E 测试(端到端测试)
- 文件: test/app.e2e-spec.ts
- 测试场景: 8 个完整的用户场景
- 测试用例: 40+ 个测试用例
- 覆盖功能:
- 用户注册和账户创建
- 用户资料管理
- 设备管理(最多5个设备)
- Token 刷新
- 推荐系统
- KYC 认证
- 助记词恢复
- 数据验证
✅ 单元测试
-
助记词测试: src/domain/value-objects/mnemonic.vo.spec.ts
- 生成助记词
- 验证格式
- 转换为 seed
- 相等性比较
-
手机号测试: src/domain/value-objects/phone-number.vo.spec.ts
- 格式验证(中国手机号)
- 掩码显示
- 相等性比较
-
钱包生成服务测试: src/infrastructure/external/blockchain/wallet-generator.service.spec.ts
- 生成钱包系统
- 三条链地址(KAVA/DST/BSC)
- 助记词恢复
- 加密解密
🚀 快速运行测试
1. 安装测试依赖
npm install
新增的测试依赖:
supertest@^6.3.3- HTTP 断言库@types/supertest@^6.0.0- TypeScript 类型定义
2. 准备 E2E 测试环境
E2E 测试需要数据库和 Redis,但 不需要 Kafka(已使用 Mock)。
详细设置请参阅: E2E_TEST_SETUP.md
快速开始:
# 确保 PostgreSQL 和 Redis 正在运行
# 准备测试数据库
DATABASE_URL="postgresql://postgres:password@localhost:5432/rwa_identity_test?schema=public" npx prisma migrate dev
3. 运行所有单元测试
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 测试
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
4. 查看测试覆盖率
npm run test:cov
然后打开生成的报告:
# 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 测试示例
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');
});
单元测试示例
it('应该生成有效的12个单词助记词', () => {
const mnemonic = Mnemonic.generate();
const words = mnemonic.getWords();
expect(words).toHaveLength(12);
expect(words.every(word => word.length > 0)).toBe(true);
});
🔍 常用测试命令
# 运行所有测试
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 文件:
// 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 中添加:
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 流程:
# .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 - 完整的自动化测试文档
- TESTING_GUIDE.md - 手动测试指南
⚡ 下一步
-
运行测试验证
npm install npm test npm run test:e2e -
查看测试覆盖率
npm run test:cov -
添加更多测试
- 为新功能编写单元测试
- 为新 API 添加 E2E 测试
-
集成到 CI/CD
- 设置 GitHub Actions
- 自动运行测试
🎉 恭喜! 你的项目现在有了完整的自动化测试套件!