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

@@ -54,25 +54,25 @@ func TestRolePermissionAssociation_AssignPermissions(t *testing.T) {
redisPort, err := redisContainer.MappedPort(ctx, "6379")
require.NoError(t, err)
db, err := gorm.Open(postgres.Open(pgConnStr), &gorm.Config{
tx, err := gorm.Open(postgres.Open(pgConnStr), &gorm.Config{
Logger: logger.Default.LogMode(logger.Silent),
})
require.NoError(t, err)
err = db.AutoMigrate(
err = tx.AutoMigrate(
&model.Role{},
&model.Permission{},
&model.RolePermission{},
)
require.NoError(t, err)
redisClient := redis.NewClient(&redis.Options{
rdb := redis.NewClient(&redis.Options{
Addr: fmt.Sprintf("%s:%s", redisHost, redisPort.Port()),
})
roleStore := postgresStore.NewRoleStore(db)
permStore := postgresStore.NewPermissionStore(db)
rolePermStore := postgresStore.NewRolePermissionStore(db, redisClient)
roleStore := postgresStore.NewRoleStore(tx)
permStore := postgresStore.NewPermissionStore(tx)
rolePermStore := postgresStore.NewRolePermissionStore(tx, rdb)
roleSvc := roleService.New(roleStore, permStore, rolePermStore)
// 创建测试用户上下文
@@ -85,7 +85,7 @@ func TestRolePermissionAssociation_AssignPermissions(t *testing.T) {
RoleType: constants.RoleTypePlatform,
Status: constants.StatusEnabled,
}
db.Create(role)
tx.Create(role)
// 创建测试权限
perm := &model.Permission{
@@ -94,7 +94,7 @@ func TestRolePermissionAssociation_AssignPermissions(t *testing.T) {
PermType: constants.PermissionTypeMenu,
Status: constants.StatusEnabled,
}
db.Create(perm)
tx.Create(perm)
// 分配权限
rps, err := roleSvc.AssignPermissions(userCtx, role.ID, []uint{perm.ID})
@@ -111,7 +111,7 @@ func TestRolePermissionAssociation_AssignPermissions(t *testing.T) {
RoleType: constants.RoleTypePlatform,
Status: constants.StatusEnabled,
}
db.Create(role)
tx.Create(role)
// 创建多个测试权限
permIDs := make([]uint, 3)
@@ -122,7 +122,7 @@ func TestRolePermissionAssociation_AssignPermissions(t *testing.T) {
PermType: constants.PermissionTypeMenu,
Status: constants.StatusEnabled,
}
db.Create(perm)
tx.Create(perm)
permIDs[i] = perm.ID
}
@@ -139,7 +139,7 @@ func TestRolePermissionAssociation_AssignPermissions(t *testing.T) {
RoleType: constants.RoleTypePlatform,
Status: constants.StatusEnabled,
}
db.Create(role)
tx.Create(role)
// 创建并分配权限
perm := &model.Permission{
@@ -148,7 +148,7 @@ func TestRolePermissionAssociation_AssignPermissions(t *testing.T) {
PermType: constants.PermissionTypeMenu,
Status: constants.StatusEnabled,
}
db.Create(perm)
tx.Create(perm)
_, err := roleSvc.AssignPermissions(userCtx, role.ID, []uint{perm.ID})
require.NoError(t, err)
@@ -167,7 +167,7 @@ func TestRolePermissionAssociation_AssignPermissions(t *testing.T) {
RoleType: constants.RoleTypePlatform,
Status: constants.StatusEnabled,
}
db.Create(role)
tx.Create(role)
// 创建并分配权限
perm := &model.Permission{
@@ -176,7 +176,7 @@ func TestRolePermissionAssociation_AssignPermissions(t *testing.T) {
PermType: constants.PermissionTypeMenu,
Status: constants.StatusEnabled,
}
db.Create(perm)
tx.Create(perm)
_, err := roleSvc.AssignPermissions(userCtx, role.ID, []uint{perm.ID})
require.NoError(t, err)
@@ -187,7 +187,7 @@ func TestRolePermissionAssociation_AssignPermissions(t *testing.T) {
// 验证权限已被软删除
var rp model.RolePermission
err = db.Unscoped().Where("role_id = ? AND perm_id = ?", role.ID, perm.ID).First(&rp).Error
err = tx.Unscoped().Where("role_id = ? AND perm_id = ?", role.ID, perm.ID).First(&rp).Error
require.NoError(t, err)
assert.NotNil(t, rp.DeletedAt)
})
@@ -199,7 +199,7 @@ func TestRolePermissionAssociation_AssignPermissions(t *testing.T) {
RoleType: constants.RoleTypePlatform,
Status: constants.StatusEnabled,
}
db.Create(role)
tx.Create(role)
// 创建测试权限
perm := &model.Permission{
@@ -208,7 +208,7 @@ func TestRolePermissionAssociation_AssignPermissions(t *testing.T) {
PermType: constants.PermissionTypeMenu,
Status: constants.StatusEnabled,
}
db.Create(perm)
tx.Create(perm)
// 第一次分配
_, err := roleSvc.AssignPermissions(userCtx, role.ID, []uint{perm.ID})
@@ -220,7 +220,7 @@ func TestRolePermissionAssociation_AssignPermissions(t *testing.T) {
// 验证只有一条记录
var count int64
db.Model(&model.RolePermission{}).Where("role_id = ? AND perm_id = ?", role.ID, perm.ID).Count(&count)
tx.Model(&model.RolePermission{}).Where("role_id = ? AND perm_id = ?", role.ID, perm.ID).Count(&count)
assert.Equal(t, int64(1), count)
})
@@ -231,7 +231,7 @@ func TestRolePermissionAssociation_AssignPermissions(t *testing.T) {
PermType: constants.PermissionTypeMenu,
Status: constants.StatusEnabled,
}
db.Create(perm)
tx.Create(perm)
_, err := roleSvc.AssignPermissions(userCtx, 99999, []uint{perm.ID})
assert.Error(t, err)
@@ -243,7 +243,7 @@ func TestRolePermissionAssociation_AssignPermissions(t *testing.T) {
RoleType: constants.RoleTypePlatform,
Status: constants.StatusEnabled,
}
db.Create(role)
tx.Create(role)
_, err := roleSvc.AssignPermissions(userCtx, role.ID, []uint{99999})
assert.Error(t, err)
@@ -277,18 +277,18 @@ func TestRolePermissionAssociation_SoftDelete(t *testing.T) {
redisHost, _ := redisContainer.Host(ctx)
redisPort, _ := redisContainer.MappedPort(ctx, "6379")
db, _ := gorm.Open(postgres.Open(pgConnStr), &gorm.Config{
tx, _ := gorm.Open(postgres.Open(pgConnStr), &gorm.Config{
Logger: logger.Default.LogMode(logger.Silent),
})
_ = db.AutoMigrate(&model.Role{}, &model.Permission{}, &model.RolePermission{})
_ = tx.AutoMigrate(&model.Role{}, &model.Permission{}, &model.RolePermission{})
redisClient := redis.NewClient(&redis.Options{
rdb := redis.NewClient(&redis.Options{
Addr: fmt.Sprintf("%s:%s", redisHost, redisPort.Port()),
})
roleStore := postgresStore.NewRoleStore(db)
permStore := postgresStore.NewPermissionStore(db)
rolePermStore := postgresStore.NewRolePermissionStore(db, redisClient)
roleStore := postgresStore.NewRoleStore(tx)
permStore := postgresStore.NewPermissionStore(tx)
rolePermStore := postgresStore.NewRolePermissionStore(tx, rdb)
roleSvc := roleService.New(roleStore, permStore, rolePermStore)
userCtx := middleware.SetUserContext(ctx, middleware.NewSimpleUserContext(1, constants.UserTypeSuperAdmin, 0))
@@ -300,7 +300,7 @@ func TestRolePermissionAssociation_SoftDelete(t *testing.T) {
RoleType: constants.RoleTypePlatform,
Status: constants.StatusEnabled,
}
db.Create(role)
tx.Create(role)
perm := &model.Permission{
PermName: "恢复权限测试",
@@ -308,7 +308,7 @@ func TestRolePermissionAssociation_SoftDelete(t *testing.T) {
PermType: constants.PermissionTypeMenu,
Status: constants.StatusEnabled,
}
db.Create(perm)
tx.Create(perm)
// 分配权限
_, err := roleSvc.AssignPermissions(userCtx, role.ID, []uint{perm.ID})
@@ -336,7 +336,7 @@ func TestRolePermissionAssociation_SoftDelete(t *testing.T) {
RoleType: constants.RoleTypePlatform,
Status: constants.StatusEnabled,
}
db.Create(role)
tx.Create(role)
// 创建多个权限
permIDs := make([]uint, 5)
@@ -347,7 +347,7 @@ func TestRolePermissionAssociation_SoftDelete(t *testing.T) {
PermType: constants.PermissionTypeMenu,
Status: constants.StatusEnabled,
}
db.Create(perm)
tx.Create(perm)
permIDs[i] = perm.ID
}
@@ -395,10 +395,10 @@ func TestRolePermissionAssociation_Cascade(t *testing.T) {
pgConnStr, _ := pgContainer.ConnectionString(ctx, "sslmode=disable")
// 设置环境
db, _ := gorm.Open(postgres.Open(pgConnStr), &gorm.Config{
tx, _ := gorm.Open(postgres.Open(pgConnStr), &gorm.Config{
Logger: logger.Default.LogMode(logger.Silent),
})
_ = db.AutoMigrate(&model.Role{}, &model.Permission{}, &model.RolePermission{})
_ = tx.AutoMigrate(&model.Role{}, &model.Permission{}, &model.RolePermission{})
t.Run("验证无外键约束(关联表独立)", func(t *testing.T) {
// 创建角色和权限
@@ -407,7 +407,7 @@ func TestRolePermissionAssociation_Cascade(t *testing.T) {
RoleType: constants.RoleTypePlatform,
Status: constants.StatusEnabled,
}
db.Create(role)
tx.Create(role)
perm := &model.Permission{
PermName: "级联测试权限",
@@ -415,7 +415,7 @@ func TestRolePermissionAssociation_Cascade(t *testing.T) {
PermType: constants.PermissionTypeMenu,
Status: constants.StatusEnabled,
}
db.Create(perm)
tx.Create(perm)
// 创建关联
rp := &model.RolePermission{
@@ -423,19 +423,19 @@ func TestRolePermissionAssociation_Cascade(t *testing.T) {
PermID: perm.ID,
Status: constants.StatusEnabled,
}
db.Create(rp)
tx.Create(rp)
// 删除角色(软删除)
db.Delete(role)
tx.Delete(role)
// 验证关联记录仍然存在(无外键约束)
var count int64
db.Model(&model.RolePermission{}).Where("role_id = ?", role.ID).Count(&count)
tx.Model(&model.RolePermission{}).Where("role_id = ?", role.ID).Count(&count)
assert.Equal(t, int64(1), count, "关联记录应该仍然存在,因为没有外键约束")
// 验证可以独立查询关联记录
var rpRecord model.RolePermission
err := db.Where("role_id = ? AND perm_id = ?", role.ID, perm.ID).First(&rpRecord).Error
err := tx.Where("role_id = ? AND perm_id = ?", role.ID, perm.ID).First(&rpRecord).Error
assert.NoError(t, err, "应该能查询到关联记录")
})
}