testutil

package
v0.0.0-...-66d340f Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 15, 2026 License: MIT Imports: 10 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func SetupTestDB

func SetupTestDB(t *testing.T, models ...interface{}) (*gorm.DB, func())

SetupTestDB 快速创建测试数据库(极简版)

适用场景:只需要数据库,不需要其他组件

使用方式:

db, cleanup := testutil.SetupTestDB(t, &model.User{})
defer cleanup()

Types

type CLITestContext

type CLITestContext struct {
	Logger    *zap.Logger
	DBManager *database.Manager
	DBHelper  *DBHelper
}

CLITestContext CLI 测试上下文 封装 CLI 测试所需的基础组件

func MustNewCLITestContext

func MustNewCLITestContext(t *testing.T, opts CLITestOptions) (*CLITestContext, func())

MustNewCLITestContext 创建 CLI 测试上下文(失败时 fatal)

func NewCLITestContext

func NewCLITestContext(t *testing.T, opts CLITestOptions) (*CLITestContext, func())

NewCLITestContext 创建 CLI 测试上下文(一站式初始化)

使用方式:

func TestMain(m *testing.M) {
    // 1. 创建测试上下文(自动完成所有初始化)
    ctx, cleanup := testutil.NewCLITestContext(t, testutil.CLITestOptions{
        AutoMigrate: []interface{}{&model.User{}},
    })
    defer cleanup()

    // 2. 使用 DBManager 创建 Service
    userRepo := user.NewRepositoryImpl(ctx.DBManager.DB("master"))
    userService := user.NewService(userRepo)

    // 3. 运行测试
    code := m.Run()
    os.Exit(code)
}

优势:

  • 自动创建 Logger、DBManager、AutoMigrate
  • 默认使用 SQLite 内存数据库(快速、隔离)
  • 提供 cleanup 函数自动清理资源

type CLITestOptions

type CLITestOptions struct {
	// AutoMigrate 自动迁移的模型列表
	AutoMigrate []interface{}

	// DBConfig 自定义数据库配置(可选,默认使用 SQLite 内存数据库)
	DBConfig map[string]database.Config

	// Logger 自定义 Logger(可选,默认使用 Development Logger)
	Logger *zap.Logger

	// SetupFunc 自定义初始化函数(可选,在基础初始化完成后调用)
	// 用于创建业务层的 Service、Handler 等
	SetupFunc func(*CLITestContext) error
}

CLITestOptions CLI 测试选项

type DBHelper

type DBHelper struct {
	DB *gorm.DB
}

DBHelper 数据库测试辅助工具

func NewDBHelper

func NewDBHelper(db *gorm.DB) *DBHelper

NewDBHelper 创建数据库辅助工具

func (*DBHelper) Count

func (h *DBHelper) Count(tableName string) (int64, error)

Count 统计记录数(排除软删除记录)

func (*DBHelper) CountWhere

func (h *DBHelper) CountWhere(tableName string, where string, args ...interface{}) (int64, error)

CountWhere 统计符合条件的记录数

func (*DBHelper) DeleteAll

func (h *DBHelper) DeleteAll(tableName string) error

DeleteAll 删除表中所有数据(不重置自增ID)

func (*DBHelper) Exists

func (h *DBHelper) Exists(tableName string, where string, args ...interface{}) (bool, error)

Exists 检查记录是否存在

func (*DBHelper) FindAll

func (h *DBHelper) FindAll(dest interface{}, tableName string) error

FindAll 查询所有记录

func (*DBHelper) FindOne

func (h *DBHelper) FindOne(dest interface{}, where string, args ...interface{}) error

FindOne 查询单条记录

func (*DBHelper) Seed

func (h *DBHelper) Seed(data interface{}) error

Seed 插入种子数据

func (*DBHelper) SeedMultiple

func (h *DBHelper) SeedMultiple(data interface{}) error

SeedMultiple 批量插入种子数据

func (*DBHelper) TruncateTable

func (h *DBHelper) TruncateTable(tableName string) error

TruncateTable 清空表数据(保留自增ID)

func (*DBHelper) TruncateTables

func (h *DBHelper) TruncateTables(tableNames ...string) error

TruncateTables 清空多个表

type RequestBuilder

type RequestBuilder struct {
	// contains filtered or unexported fields
}

RequestBuilder HTTP 请求构建器

func DELETE

func DELETE(path string) *RequestBuilder

DELETE 创建 DELETE 请求

func GET

func GET(path string) *RequestBuilder

GET 创建 GET 请求

func NewRequest

func NewRequest(method, path string) *RequestBuilder

NewRequest 创建请求构建器

func PATCH

func PATCH(path string) *RequestBuilder

PATCH 创建 PATCH 请求

func POST

func POST(path string) *RequestBuilder

POST 创建 POST 请求

func PUT

func PUT(path string) *RequestBuilder

PUT 创建 PUT 请求

func (*RequestBuilder) Do

func (rb *RequestBuilder) Do(engine *gin.Engine) *ResponseHelper

Do 执行请求

func (*RequestBuilder) WithHeader

func (rb *RequestBuilder) WithHeader(key, value string) *RequestBuilder

WithHeader 设置 Header

func (*RequestBuilder) WithJSON

func (rb *RequestBuilder) WithJSON(body interface{}) *RequestBuilder

WithJSON 设置 JSON Body

func (*RequestBuilder) WithQuery

func (rb *RequestBuilder) WithQuery(key, value string) *RequestBuilder

WithQuery 设置 Query 参数

func (*RequestBuilder) WithTraceID

func (rb *RequestBuilder) WithTraceID(traceID string) *RequestBuilder

WithTraceID 设置 TraceID

type ResponseHelper

type ResponseHelper struct {
	Recorder *httptest.ResponseRecorder
}

ResponseHelper 响应辅助工具

func (*ResponseHelper) Body

func (rh *ResponseHelper) Body() string

Body 获取响应 Body

func (*ResponseHelper) Header

func (rh *ResponseHelper) Header(key string) string

Header 获取响应 Header

func (*ResponseHelper) JSON

func (rh *ResponseHelper) JSON(v interface{}) error

JSON 解析 JSON 响应

func (*ResponseHelper) Status

func (rh *ResponseHelper) Status() int

Status 获取状态码

type TestApp

type TestApp interface {
	// RunNonBlocking 非阻塞启动应用(完整启动但不等待关闭信号)
	RunNonBlocking() error

	// GetHTTPServer 获取 HTTP Server(用于测试)
	GetHTTPServer() interface {
		GetEngine() *gin.Engine
	}

	// GetDBManager 获取数据库管理器
	GetDBManager() *database.Manager

	// GetRedisManager 获取 Redis 管理器
	GetRedisManager() *redis.Manager

	// Shutdown 关闭应用
	Shutdown()
}

TestApp 测试应用接口 任何实现了这个接口的应用都可以用于测试

type TestServer

type TestServer struct {
	Engine *gin.Engine
	DB     *database.Manager
	Redis  *redis.Manager
}

TestServer 测试服务器 封装完整的应用实例,用于集成测试

func MustNewTestServer

func MustNewTestServer(t *testing.T, app TestApp) *TestServer

MustNewTestServer 创建测试服务器(失败时 panic)

func NewTestServer

func NewTestServer(app TestApp) (*TestServer, error)

NewTestServer 创建测试服务器(优雅版本)

使用方式:

// 1. 创建应用实例
userApp := app.NewWithConfig(configPath)

// 2. 注册组件和回调
userApp.RegisterComponents(...)
userApp.SetupCallbacks(...)

// 3. 创建测试服务器(自动调用 RunNonBlocking)
server, err := testutil.NewTestServer(userApp)

优势:

  • 复用 Application.Run() 的完整逻辑
  • 测试环境和生产环境启动流程完全一致
  • 代码简洁,易于维护

func (*TestServer) Close

func (ts *TestServer) Close() error

Close 关闭测试服务器

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL