@lobehub/chat
Version:
Lobe Chat - an open-source, high-performance chatbot framework that supports speech synthesis, multimodal, and extensible Function Call plugin system. Supports one-click free deployment of your private ChatGPT/LLM web application.
111 lines (79 loc) • 2.81 kB
Markdown
# 集成测试
本目录包含 LobeChat 后端的集成测试。
## 目录结构
```
tests/integration/
├── README.md # 本文件
├── setup.ts # 集成测试的通用设置
├── utils.ts # 集成测试工具函数
└── routers/ # tRPC Router 集成测试
├── message.integration.test.ts
├── session.integration.test.ts
└── topic.integration.test.ts
```
## 什么是集成测试?
集成测试验证多个模块协同工作的正确性,与单元测试不同:
- **单元测试**: 测试单个函数 / 类,使用 mock 隔离依赖
- **集成测试**: 测试完整的调用链路(Router → Service → Model → Database),使用真实数据库
## 为什么需要集成测试?
即使单元测试覆盖率很高(80%+),仍可能出现集成问题:
1. **参数传递遗漏**: 如 `containerId`、`threadId` 在调用链中丢失
2. **数据库约束**: 外键关系、级联删除等在 mock 中无法验证
3. **事务完整性**: 跨表操作的原子性
4. **真实场景**: 模拟用户的完整操作流程
## 运行集成测试
```bash
# 运行所有集成测试
pnpm test:integration
# 运行特定文件
pnpm vitest tests/integration/routers/message.integration.test.ts
# 监听模式
pnpm vitest tests/integration --watch
```
## 编写集成测试的最佳实践
### 1. 使用真实数据库环境
```typescript
import { getTestDB } from '@/database/models/__tests__/_util';
const serverDB = await getTestDB();
```
### 2. 每个测试用例独立
```typescript
beforeEach(async () => {
// 准备测试数据
await serverDB.insert(users).values({ id: userId });
});
afterEach(async () => {
// 清理测试数据
await serverDB.delete(users).where(eq(users.id, userId));
});
```
### 3. 测试完整的调用链路
```typescript
// ✅ 好的集成测试
it('should create message with correct sessionId and topicId', async () => {
const caller = messageRouter.createCaller(createTestContext());
const messageId = await caller.createMessage({
content: 'Test',
sessionId: testSessionId,
topicId: testTopicId,
});
// 从数据库验证
const message = await serverDB.select().from(messages).where(eq(messages.id, messageId));
expect(message.topicId).toBe(testTopicId);
});
```
### 4. 验证关键路径
优先测试:
- 跨层级的 ID 传递
- 权限验证
- 并发场景
- 错误处理
## 测试覆盖目标
- **API 层集成测试**: 30%
- **关键业务流程**: 100%
- **错误场景**: 主要路径覆盖
## 注意事项
1. 集成测试比单元测试慢,不要过度使用
2. 保持测试数据隔离,避免测试间相互影响
3. 使用有意义的测试数据,便于调试
4. 测试失败时,检查数据库状态