Go中推荐用table-driven方式测试结构体方法,即定义含输入、期望输出及错误的结构体切片,循环调用并用t.Run执行子测试,注意闭包变量捕获问题及指针接收者的副作用处理。

在 Go 中,用 table-driven 方式测试结构体方法是最清晰、可维护性最强的做法。核心是把输入、预期输出、甚至预期错误组织成结构体切片,再用循环统一断言,避免重复代码。
为每个要验证的结构体方法准备一组测试用例,每个用例包含:调用该方法所需的输入(如接收者状态、参数)、期望返回值、期望错误(如有)。推荐用匿名结构体或自定义类型提升可读性:
例如,对一个 User 结构体的 FullName() 方法:
tests := []struct {
name string
user User
want string
}{
{"empty first and last", User{}, ""},
{"normal case", User{FirstName: "Alice", LastName: "Smith"}, "Alice Smith"},
{"only first name", User{FirstName: "Bob"}, "Bob"},
}遍历测试表,对每个用例调用目标方法,并用 require.Equal 或 assert.Equal(需引入 github.com/stretchr/testify)比较结果。用 t.Run 包裹每个子测试,便于定位失败用例:
立即学习“go语言免费学习笔记(深入)”;
for _, tt := range tests {
tt := tt // 防止闭包中变量复用
t.Run(tt.name, func(t *testing.T) {
got := tt.user.FullName()
require.Equal(t, tt.want, got)
})
}注意:必须写 tt := tt,否则所有子测试会共享最后一个 tt 值。
若方法返回 (result T, err error),测试表中应增加 wantErr bool 字段,并用 require.Error / require.NoError 判断错误存在性;必要时再检查错误内容:
tests := []struct {
name string
input int
want string
wantErr bool
}{
{"valid", 42, "ok", false},
{"invalid", -1, "", true},
}
for _, tt := range tests {
tt := tt
t.Run(tt.name, func(t *testing.T) {
got, err := someStruct.Process(tt.input)
if tt.wantErr {
require.Error(t, err)
return
}
require.NoError(t, err)
require.Equal(t, tt.want, got)
})
}如果方法有指针接收者且会修改结构体字段,测试时需注意是否影响后续用例。建议每个用例使用独立实例,或显式重置:
User{...}
t.Run 内部初始化以上就是如何在Golang中测试结构体方法_通过table-driven方式验证输出的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号