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

@@ -36,8 +36,8 @@ import (
// roleTestEnv 角色测试环境
type roleTestEnv struct {
db *gorm.DB
redisClient *redis.Client
tx *gorm.DB
rdb *redis.Client
app *fiber.App
roleService *roleService.Service
postgresCleanup func()
@@ -79,13 +79,13 @@ func setupRoleTestEnv(t *testing.T) *roleTestEnv {
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.Account{},
&model.Role{},
&model.Permission{},
@@ -95,14 +95,14 @@ func setupRoleTestEnv(t *testing.T) *roleTestEnv {
require.NoError(t, err)
// 连接 Redis
redisClient := redis.NewClient(&redis.Options{
rdb := redis.NewClient(&redis.Options{
Addr: fmt.Sprintf("%s:%s", redisHost, redisPort.Port()),
})
// 初始化 Store
roleStore := postgresStore.NewRoleStore(db)
permissionStore := postgresStore.NewPermissionStore(db)
rolePermissionStore := postgresStore.NewRolePermissionStore(db, redisClient)
roleStore := postgresStore.NewRoleStore(tx)
permissionStore := postgresStore.NewPermissionStore(tx)
rolePermissionStore := postgresStore.NewRolePermissionStore(tx, rdb)
// 初始化 Service
roleSvc := roleService.New(roleStore, permissionStore, rolePermissionStore)
@@ -125,8 +125,8 @@ func setupRoleTestEnv(t *testing.T) *roleTestEnv {
routes.RegisterRoutes(app, services, middlewares)
return &roleTestEnv{
db: db,
redisClient: redisClient,
tx: tx,
rdb: rdb,
app: app,
roleService: roleSvc,
postgresCleanup: func() {
@@ -187,7 +187,7 @@ func TestRoleAPI_Create(t *testing.T) {
// 验证数据库中角色已创建
var count int64
env.db.Model(&model.Role{}).Where("role_name = ?", "测试角色").Count(&count)
env.tx.Model(&model.Role{}).Where("role_name = ?", "测试角色").Count(&count)
assert.Equal(t, int64(1), count)
})
@@ -229,7 +229,7 @@ func TestRoleAPI_Get(t *testing.T) {
RoleType: constants.RoleTypePlatform,
Status: constants.StatusEnabled,
}
env.db.Create(testRole)
env.tx.Create(testRole)
t.Run("成功获取角色详情", func(t *testing.T) {
req := httptest.NewRequest("GET", fmt.Sprintf("/api/admin/roles/%d", testRole.ID), nil)
@@ -274,7 +274,7 @@ func TestRoleAPI_Update(t *testing.T) {
RoleType: constants.RoleTypePlatform,
Status: constants.StatusEnabled,
}
env.db.Create(testRole)
env.tx.Create(testRole)
t.Run("成功更新角色", func(t *testing.T) {
newName := "更新后角色"
@@ -292,7 +292,7 @@ func TestRoleAPI_Update(t *testing.T) {
// 验证数据库已更新
var updated model.Role
env.db.First(&updated, testRole.ID)
env.tx.First(&updated, testRole.ID)
assert.Equal(t, newName, updated.RoleName)
})
}
@@ -317,7 +317,7 @@ func TestRoleAPI_Delete(t *testing.T) {
RoleType: constants.RoleTypePlatform,
Status: constants.StatusEnabled,
}
env.db.Create(testRole)
env.tx.Create(testRole)
req := httptest.NewRequest("DELETE", fmt.Sprintf("/api/admin/roles/%d", testRole.ID), nil)
resp, err := env.app.Test(req)
@@ -326,7 +326,7 @@ func TestRoleAPI_Delete(t *testing.T) {
// 验证角色已软删除
var deleted model.Role
err = env.db.Unscoped().First(&deleted, testRole.ID).Error
err = env.tx.Unscoped().First(&deleted, testRole.ID).Error
require.NoError(t, err)
assert.NotNil(t, deleted.DeletedAt)
})
@@ -352,7 +352,7 @@ func TestRoleAPI_List(t *testing.T) {
RoleType: constants.RoleTypePlatform,
Status: constants.StatusEnabled,
}
env.db.Create(role)
env.tx.Create(role)
}
t.Run("成功获取角色列表", func(t *testing.T) {
@@ -387,7 +387,7 @@ func TestRoleAPI_AssignPermissions(t *testing.T) {
RoleType: constants.RoleTypePlatform,
Status: constants.StatusEnabled,
}
env.db.Create(testRole)
env.tx.Create(testRole)
// 创建测试权限
testPerm := &model.Permission{
@@ -396,7 +396,7 @@ func TestRoleAPI_AssignPermissions(t *testing.T) {
PermType: constants.PermissionTypeMenu,
Status: constants.StatusEnabled,
}
env.db.Create(testPerm)
env.tx.Create(testPerm)
t.Run("成功分配权限", func(t *testing.T) {
reqBody := dto.AssignPermissionsRequest{
@@ -413,7 +413,7 @@ func TestRoleAPI_AssignPermissions(t *testing.T) {
// 验证关联已创建
var count int64
env.db.Model(&model.RolePermission{}).Where("role_id = ? AND perm_id = ?", testRole.ID, testPerm.ID).Count(&count)
env.tx.Model(&model.RolePermission{}).Where("role_id = ? AND perm_id = ?", testRole.ID, testPerm.ID).Count(&count)
assert.Equal(t, int64(1), count)
})
}
@@ -437,7 +437,7 @@ func TestRoleAPI_GetPermissions(t *testing.T) {
RoleType: constants.RoleTypePlatform,
Status: constants.StatusEnabled,
}
env.db.Create(testRole)
env.tx.Create(testRole)
// 创建并分配权限
testPerm := &model.Permission{
@@ -446,14 +446,14 @@ func TestRoleAPI_GetPermissions(t *testing.T) {
PermType: constants.PermissionTypeMenu,
Status: constants.StatusEnabled,
}
env.db.Create(testPerm)
env.tx.Create(testPerm)
rolePerm := &model.RolePermission{
RoleID: testRole.ID,
PermID: testPerm.ID,
Status: constants.StatusEnabled,
}
env.db.Create(rolePerm)
env.tx.Create(rolePerm)
t.Run("成功获取角色权限", func(t *testing.T) {
req := httptest.NewRequest("GET", fmt.Sprintf("/api/admin/roles/%d/permissions", testRole.ID), nil)
@@ -487,7 +487,7 @@ func TestRoleAPI_RemovePermission(t *testing.T) {
RoleType: constants.RoleTypePlatform,
Status: constants.StatusEnabled,
}
env.db.Create(testRole)
env.tx.Create(testRole)
// 创建并分配权限
testPerm := &model.Permission{
@@ -496,14 +496,14 @@ func TestRoleAPI_RemovePermission(t *testing.T) {
PermType: constants.PermissionTypeMenu,
Status: constants.StatusEnabled,
}
env.db.Create(testPerm)
env.tx.Create(testPerm)
rolePerm := &model.RolePermission{
RoleID: testRole.ID,
PermID: testPerm.ID,
Status: constants.StatusEnabled,
}
env.db.Create(rolePerm)
env.tx.Create(rolePerm)
t.Run("成功移除权限", func(t *testing.T) {
req := httptest.NewRequest("DELETE", fmt.Sprintf("/api/admin/roles/%d/permissions/%d", testRole.ID, testPerm.ID), nil)
@@ -513,7 +513,7 @@ func TestRoleAPI_RemovePermission(t *testing.T) {
// 验证关联已软删除
var rp model.RolePermission
err = env.db.Unscoped().Where("role_id = ? AND perm_id = ?", testRole.ID, testPerm.ID).First(&rp).Error
err = env.tx.Unscoped().Where("role_id = ? AND perm_id = ?", testRole.ID, testPerm.ID).First(&rp).Error
require.NoError(t, err)
assert.NotNil(t, rp.DeletedAt)
})
@@ -538,7 +538,7 @@ func TestRoleAPI_UpdateStatus(t *testing.T) {
RoleType: constants.RoleTypePlatform,
Status: constants.StatusEnabled,
}
env.db.Create(testRole)
env.tx.Create(testRole)
t.Run("成功禁用角色", func(t *testing.T) {
reqBody := dto.UpdateRoleStatusRequest{
@@ -560,7 +560,7 @@ func TestRoleAPI_UpdateStatus(t *testing.T) {
// 验证数据库中状态已更新
var updated model.Role
env.db.First(&updated, testRole.ID)
env.tx.First(&updated, testRole.ID)
assert.Equal(t, constants.StatusDisabled, updated.Status)
})
@@ -584,7 +584,7 @@ func TestRoleAPI_UpdateStatus(t *testing.T) {
// 验证数据库中状态已更新
var updated model.Role
env.db.First(&updated, testRole.ID)
env.tx.First(&updated, testRole.ID)
assert.Equal(t, constants.StatusEnabled, updated.Status)
})