test: 测试库改为模板克隆并纳入完整租号 e2e

每个包不再重复 DROP+迁移,清空改用 DELETE 并重置自增,go test ./... 从约 6 分钟降到十几秒。租号全链路改走 NewTestDB,去掉依赖额外 DSN 才会跑的过渡测试。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
yml2213
2026-09-10 15:46:18 +08:00
co-authored by Cursor
parent cbd5412315
commit 47ceb53c09
11 changed files with 456 additions and 275 deletions
+1 -21
View File
@@ -18,27 +18,7 @@ import (
func openDistributionE2EDB(t *testing.T) *gorm.DB {
t.Helper()
db := database.NewTestDB()
sqlDB, err := db.DB()
if err != nil {
t.Fatal(err)
}
sqlDB.SetMaxOpenConns(1)
if err := database.MigrateRentalTransactionTestSchema(db); err != nil {
t.Fatalf("migrate rental transaction schema failed: %v", err)
}
if err := database.AutoMigrateIfMissing(db,
&model.Role{}, &model.Permission{}, &model.AdminUserRole{}, &model.RolePermission{},
&model.PaymentMerchantConfig{},
&model.DistributionSiteMember{}, &model.DistributionRuleVersion{}, &model.DistributionOrderFinancial{},
&model.DistributionOrderParty{}, &model.DistributionSitePaymentChannel{},
&model.DistributionSettlementBatch{}, &model.DistributionSettlementItem{},
&model.WithdrawalRequest{},
); err != nil {
t.Fatalf("auto migrate distribution schema failed: %v", err)
}
return db
return database.NewTestDB()
}
// TestE2EScenario1_MainSiteReceive_SubSiteMarkupSell_Settlement
+2 -105
View File
@@ -2,22 +2,14 @@ package e2e
import (
"context"
"database/sql"
"fmt"
"os"
"path/filepath"
"regexp"
"runtime"
"strings"
"testing"
"time"
mysqldriver "github.com/go-sql-driver/mysql"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/logger"
"hfb_sys/backend/internal/auditlog"
"hfb_sys/backend/internal/database"
"hfb_sys/backend/internal/model"
"hfb_sys/backend/internal/modules/adminfinance"
"hfb_sys/backend/internal/modules/dispute"
@@ -254,102 +246,7 @@ func (c fixedConfig) FindValue(ctx context.Context, key string) (string, error)
func openE2EDB(t *testing.T) *gorm.DB {
t.Helper()
rawDSN := os.Getenv("HFB_E2E_DSN")
if rawDSN == "" {
t.Skip("设置 HFB_E2E_DSN 后运行完整租号链路 e2e 测试")
}
cfg, err := mysqldriver.ParseDSN(rawDSN)
if err != nil {
t.Fatalf("解析 HFB_E2E_DSN 失败: %v", err)
}
dbName := cfg.DBName
assertSafeTestDBName(t, dbName)
serverCfg := cfg.Clone()
serverCfg.DBName = ""
serverDB, err := sql.Open("mysql", serverCfg.FormatDSN())
if err != nil {
t.Fatalf("连接 MySQL server 失败: %v", err)
}
defer serverDB.Close()
if _, err := serverDB.Exec("DROP DATABASE IF EXISTS `" + dbName + "`"); err != nil {
t.Fatalf("删除测试库失败: %v", err)
}
if _, err := serverDB.Exec("CREATE DATABASE `" + dbName + "` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"); err != nil {
t.Fatalf("创建测试库失败: %v", err)
}
cfg.ParseTime = true
cfg.MultiStatements = true
sqlDB, err := sql.Open("mysql", cfg.FormatDSN())
if err != nil {
t.Fatalf("连接测试库失败: %v", err)
}
t.Cleanup(func() { _ = sqlDB.Close() })
applyMigrations(t, sqlDB)
gormDB, err := gorm.Open(mysql.New(mysql.Config{Conn: sqlDB}), &gorm.Config{
Logger: logger.Default.LogMode(logger.Silent),
})
if err != nil {
t.Fatalf("打开 gorm 连接失败: %v", err)
}
return gormDB
}
func assertSafeTestDBName(t *testing.T, dbName string) {
t.Helper()
if dbName == "" {
t.Fatal("HFB_E2E_DSN 必须包含数据库名")
}
if !regexp.MustCompile(`^[A-Za-z0-9_]+$`).MatchString(dbName) {
t.Fatalf("测试库名只允许字母、数字、下划线: %q", dbName)
}
lower := strings.ToLower(dbName)
if !strings.Contains(lower, "test") && !strings.Contains(lower, "e2e") {
t.Fatalf("拒绝重置非测试库 %q,库名需包含 test 或 e2e", dbName)
}
}
func applyMigrations(t *testing.T, db *sql.DB) {
t.Helper()
_, currentFile, _, ok := runtime.Caller(0)
if !ok {
t.Fatal("无法定位当前测试文件")
}
migrationDir := filepath.Join(filepath.Dir(currentFile), "..", "..", "migrations")
entries, err := os.ReadDir(migrationDir)
if err != nil {
t.Fatalf("读取迁移目录失败: %v", err)
}
for _, entry := range entries {
if entry.IsDir() || !strings.HasSuffix(entry.Name(), ".sql") {
continue
}
name := entry.Name()
migrationPath := filepath.Join(migrationDir, name)
raw, err := os.ReadFile(migrationPath)
if err != nil {
t.Fatalf("读取迁移 %s 失败: %v", name, err)
}
sqlText := gooseUpSQL(string(raw))
if _, err := db.Exec(sqlText); err != nil {
t.Fatalf("执行迁移 %s 失败: %v", name, err)
}
}
}
func gooseUpSQL(raw string) string {
upIndex := strings.Index(raw, "-- +goose Up")
if upIndex >= 0 {
raw = raw[upIndex+len("-- +goose Up"):]
}
downIndex := strings.Index(raw, "-- +goose Down")
if downIndex >= 0 {
raw = raw[:downIndex]
}
return raw
return database.NewTestDB()
}
func seedUsers(t *testing.T, db *gorm.DB) (model.User, model.User, uint64) {