Files
junhong_cmp_fiber/openspec/changes/archive/2026-01-22-optimize-test-db-connection/proposal.md
huang b68e7ec013
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 15s
优化测试数据库连接管理
- 创建全局单例连接池,性能提升 6-7 倍
- 实现 NewTestTransaction/GetTestRedis/CleanTestRedisKeys
- 移除旧的 SetupTestDB/TeardownTestDB API
- 迁移所有测试文件到新方案(47 个文件)
- 添加测试连接管理规范文档
- 更新 AGENTS.md 和 README.md

性能对比:
- 旧方案:~71 秒(204 测试)
- 新方案:~10.5 秒(首次初始化 + 后续复用)
- 内存占用降低约 80%
- 网络连接数从 204 降至 1
2026-01-22 14:38:43 +08:00

74 lines
3.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Change: 优化测试数据库连接管理
## Why
当前测试架构存在严重的性能和资源浪费问题:
1. **重复连接创建**: 每个测试用例都创建新的数据库连接(204 次 `SetupTestDB` 调用),导致测试运行缓慢
2. **重复表结构检查**: 每次 `AutoMigrate` 都检查 8 张表的结构(虽然幂等,但耗时约 100ms)
3. **资源泄漏风险**: 如果测试 panic,`defer` 可能不执行,Redis 连接未关闭
4. **配置硬编码**: DSN 和 Redis 配置硬编码在 `testutils/setup.go` 中,无法灵活切换环境
5. **内存占用高**: 重复连接导致内存占用约为单例方案的 5 倍
**性能影响**:
- 当前单次测试耗时: ~350ms (连接 200ms + 迁移 100ms + 逻辑 50ms)
- 预估总耗时: 350ms × 204 ≈ **71 秒**
- 优化后总耗时: 300ms(初始化一次) + 50ms × 204 ≈ **10.5 秒**
- **性能提升 6.76 倍** 🚀
## What Changes
### Phase 1: 全局单例连接池管理
- 创建 `tests/testutils/db.go` 实现全局单例数据库和 Redis 连接
- 使用 `sync.Once` 确保整个测试套件只创建一次连接
- `AutoMigrate` 只在首次连接时执行一次
- 保留现有 `setup.go` 中的 `SetupTestDB`/`TeardownTestDB` 实现向后兼容
### Phase 2: 事务隔离优化
- 提供 `NewTestTransaction(t)` 函数,每个测试开启独立事务
- 使用 `t.Cleanup()` 机制确保事务自动回滚,即使测试 panic 也能清理
- Redis 键清理同样使用 `t.Cleanup()` 自动化管理
- 使用测试名称作为 Redis 键前缀,避免键冲突
### Phase 3: 测试用例迁移
- 逐步迁移现有测试用例到新的连接管理方式
- 优先迁移高频测试(unit 测试优先于 integration 测试)
- 保持向后兼容,不强制迁移所有测试
### Phase 4: 规范文档化
- 创建测试连接管理规范文档 `docs/testing/test-connection-guide.md`
- 包含使用示例、最佳实践、常见陷阱说明
- 添加到 AGENTS.md 的测试规范章节
## Impact
### 性能影响
- 测试套件运行速度提升 **6-7 倍**
- 内存占用降低约 **80%**
- 网络连接数从 204 个降低到 **1 个**
### 代码影响
- **新建文件**:
- `tests/testutils/db.go` (全局连接管理)
- `docs/testing/test-connection-guide.md` (规范文档)
- **保留文件** (向后兼容):
- `tests/testutils/setup.go` (标记为 Deprecated)
- **迁移文件** (逐步进行):
- `tests/unit/*_test.go` (共约 20 个文件)
- `tests/integration/*_test.go` (共约 13 个文件)
### 向后兼容性
-**完全兼容**: 旧的 `SetupTestDB`/`TeardownTestDB` 保持可用
-**渐进迁移**: 可以逐个文件迁移,不影响其他测试
-**零风险**: 新旧方案可共存,测试失败可随时回退
### Affected Specs
- testing-standards (新建): 测试连接管理和事务隔离规范
### Migration Path
1. 创建新的连接管理工具(不影响现有测试)
2. 选择 1-2 个简单测试文件验证新方案
3. 逐步迁移剩余测试文件
4. 观察一段时间后,标记旧方案为 Deprecated
5. 未来某个版本完全移除旧方案(可选)