优化测试数据库连接管理
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
This commit is contained in:
2026-01-22 14:38:43 +08:00
parent 46e4e5f4f1
commit b68e7ec013
47 changed files with 2529 additions and 986 deletions

View File

@@ -25,33 +25,33 @@ type MockEmailPayload struct {
// TestHandlerIdempotency 测试处理器幂等性逻辑
func TestHandlerIdempotency(t *testing.T) {
redisClient := redis.NewClient(&redis.Options{
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
})
defer redisClient.Close()
defer rdb.Close()
ctx := context.Background()
redisClient.FlushDB(ctx)
rdb.FlushDB(ctx)
requestID := "test-req-001"
lockKey := constants.RedisTaskLockKey(requestID)
// 测试场景1: 第一次执行(未加锁)
t.Run("First Execution - Should Acquire Lock", func(t *testing.T) {
result, err := redisClient.SetNX(ctx, lockKey, "1", 24*time.Hour).Result()
result, err := rdb.SetNX(ctx, lockKey, "1", 24*time.Hour).Result()
require.NoError(t, err)
assert.True(t, result, "第一次执行应该成功获取锁")
})
// 测试场景2: 重复执行(已加锁)
t.Run("Duplicate Execution - Should Skip", func(t *testing.T) {
result, err := redisClient.SetNX(ctx, lockKey, "1", 24*time.Hour).Result()
result, err := rdb.SetNX(ctx, lockKey, "1", 24*time.Hour).Result()
require.NoError(t, err)
assert.False(t, result, "重复执行应该跳过(锁已存在)")
})
// 清理
redisClient.Del(ctx, lockKey)
rdb.Del(ctx, lockKey)
}
// TestHandlerErrorHandling 测试处理器错误处理
@@ -218,13 +218,13 @@ func TestPayloadDeserialization(t *testing.T) {
// TestTaskStatusTransition 测试任务状态转换
func TestTaskStatusTransition(t *testing.T) {
redisClient := redis.NewClient(&redis.Options{
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
})
defer redisClient.Close()
defer rdb.Close()
ctx := context.Background()
redisClient.FlushDB(ctx)
rdb.FlushDB(ctx)
taskID := "task-transition-001"
statusKey := constants.RedisTaskStatusKey(taskID)
@@ -245,7 +245,7 @@ func TestTaskStatusTransition(t *testing.T) {
t.Run("Transition to "+tr.status, func(t *testing.T) {
// 检查状态转换是否合法
if isValidTransition(currentStatus, tr.status) == tr.valid {
err := redisClient.Set(ctx, statusKey, tr.status, 7*24*time.Hour).Err()
err := rdb.Set(ctx, statusKey, tr.status, 7*24*time.Hour).Err()
require.NoError(t, err)
currentStatus = tr.status
} else {
@@ -281,13 +281,13 @@ func isValidTransition(from, to string) bool {
// TestConcurrentTaskExecution 测试并发任务执行
func TestConcurrentTaskExecution(t *testing.T) {
redisClient := redis.NewClient(&redis.Options{
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
})
defer redisClient.Close()
defer rdb.Close()
ctx := context.Background()
redisClient.FlushDB(ctx)
rdb.FlushDB(ctx)
// 模拟多个并发任务尝试获取同一个锁
requestID := "concurrent-test-001"
@@ -301,7 +301,7 @@ func TestConcurrentTaskExecution(t *testing.T) {
// 并发执行
for i := 0; i < concurrency; i++ {
go func() {
result, err := redisClient.SetNX(ctx, lockKey, "1", 24*time.Hour).Result()
result, err := rdb.SetNX(ctx, lockKey, "1", 24*time.Hour).Result()
if err == nil && result {
successCount++
}
@@ -364,19 +364,19 @@ func TestTaskTimeout(t *testing.T) {
// TestLockExpiration 测试锁过期机制
func TestLockExpiration(t *testing.T) {
redisClient := redis.NewClient(&redis.Options{
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
})
defer redisClient.Close()
defer rdb.Close()
ctx := context.Background()
redisClient.FlushDB(ctx)
rdb.FlushDB(ctx)
requestID := "expiration-test-001"
lockKey := constants.RedisTaskLockKey(requestID)
// 设置短 TTL 的锁
result, err := redisClient.SetNX(ctx, lockKey, "1", 100*time.Millisecond).Result()
result, err := rdb.SetNX(ctx, lockKey, "1", 100*time.Millisecond).Result()
require.NoError(t, err)
assert.True(t, result)
@@ -384,7 +384,7 @@ func TestLockExpiration(t *testing.T) {
time.Sleep(200 * time.Millisecond)
// 验证锁已过期,可以重新获取
result, err = redisClient.SetNX(ctx, lockKey, "1", 24*time.Hour).Result()
result, err = rdb.SetNX(ctx, lockKey, "1", 24*time.Hour).Result()
require.NoError(t, err)
assert.True(t, result, "锁过期后应该可以重新获取")
}