优化测试数据库连接管理
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

@@ -26,14 +26,14 @@ type EmailPayload struct {
// TestTaskSubmit 测试任务提交
func TestTaskSubmit(t *testing.T) {
// 创建 Redis 客户端
redisClient := redis.NewClient(&redis.Options{
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
})
defer func() { _ = redisClient.Close() }()
defer func() { _ = rdb.Close() }()
// 清理测试数据
ctx := context.Background()
redisClient.FlushDB(ctx)
rdb.FlushDB(ctx)
// 创建 Asynq 客户端
client := asynq.NewClient(asynq.RedisClientOpt{
@@ -69,13 +69,13 @@ func TestTaskSubmit(t *testing.T) {
// TestTaskPriority 测试任务优先级
func TestTaskPriority(t *testing.T) {
// 创建 Redis 客户端
redisClient := redis.NewClient(&redis.Options{
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
})
defer func() { _ = redisClient.Close() }()
defer func() { _ = rdb.Close() }()
ctx := context.Background()
redisClient.FlushDB(ctx)
rdb.FlushDB(ctx)
// 创建 Asynq 客户端
client := asynq.NewClient(asynq.RedisClientOpt{
@@ -115,13 +115,13 @@ func TestTaskPriority(t *testing.T) {
// TestTaskRetry 测试任务重试机制
func TestTaskRetry(t *testing.T) {
redisClient := redis.NewClient(&redis.Options{
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
})
defer func() { _ = redisClient.Close() }()
defer func() { _ = rdb.Close() }()
ctx := context.Background()
redisClient.FlushDB(ctx)
rdb.FlushDB(ctx)
client := asynq.NewClient(asynq.RedisClientOpt{
Addr: "localhost:6379",
@@ -152,34 +152,34 @@ func TestTaskRetry(t *testing.T) {
// TestTaskIdempotency 测试任务幂等性键
func TestTaskIdempotency(t *testing.T) {
redisClient := redis.NewClient(&redis.Options{
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
})
defer func() { _ = redisClient.Close() }()
defer func() { _ = rdb.Close() }()
ctx := context.Background()
redisClient.FlushDB(ctx)
rdb.FlushDB(ctx)
requestID := "idempotent-test-001"
lockKey := constants.RedisTaskLockKey(requestID)
// 第一次设置锁(模拟任务开始执行)
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, "第一次设置锁应该成功")
// 第二次设置锁(模拟重复任务)
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, "第二次设置锁应该失败(幂等性)")
// 验证锁存在
exists, err := redisClient.Exists(ctx, lockKey).Result()
exists, err := rdb.Exists(ctx, lockKey).Result()
require.NoError(t, err)
assert.Equal(t, int64(1), exists)
// 验证 TTL
ttl, err := redisClient.TTL(ctx, lockKey).Result()
ttl, err := rdb.TTL(ctx, lockKey).Result()
require.NoError(t, err)
assert.Greater(t, ttl.Hours(), 23.0)
assert.LessOrEqual(t, ttl.Hours(), 24.0)
@@ -187,13 +187,13 @@ func TestTaskIdempotency(t *testing.T) {
// TestTaskStatusTracking 测试任务状态跟踪
func TestTaskStatusTracking(t *testing.T) {
redisClient := redis.NewClient(&redis.Options{
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
})
defer func() { _ = redisClient.Close() }()
defer func() { _ = rdb.Close() }()
ctx := context.Background()
redisClient.FlushDB(ctx)
rdb.FlushDB(ctx)
taskID := "task-123456"
statusKey := constants.RedisTaskStatusKey(taskID)
@@ -202,30 +202,30 @@ func TestTaskStatusTracking(t *testing.T) {
statuses := []string{"pending", "processing", "completed"}
for _, status := range statuses {
err := redisClient.Set(ctx, statusKey, status, 7*24*time.Hour).Err()
err := rdb.Set(ctx, statusKey, status, 7*24*time.Hour).Err()
require.NoError(t, err)
// 读取状态
result, err := redisClient.Get(ctx, statusKey).Result()
result, err := rdb.Get(ctx, statusKey).Result()
require.NoError(t, err)
assert.Equal(t, status, result)
}
// 验证 TTL
ttl, err := redisClient.TTL(ctx, statusKey).Result()
ttl, err := rdb.TTL(ctx, statusKey).Result()
require.NoError(t, err)
assert.Greater(t, ttl.Hours(), 24.0*6)
}
// TestQueueInspection 测试队列检查
func TestQueueInspection(t *testing.T) {
redisClient := redis.NewClient(&redis.Options{
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
})
defer func() { _ = redisClient.Close() }()
defer func() { _ = rdb.Close() }()
ctx := context.Background()
redisClient.FlushDB(ctx)
rdb.FlushDB(ctx)
client := asynq.NewClient(asynq.RedisClientOpt{
Addr: "localhost:6379",