Go语言内置测试框架,只需命名测试文件为*_test.go并放在同一目录下,用Test开头定义测试函数,通过go test命令运行测试,支持表格驱动和详细输出。

Go语言自带了单元测试框架,不需要额外安装第三方工具就能编写和运行测试。只要按照约定的命名规则和目录结构组织代码,就可以直接使用 go test 命令执行测试。
1. 测试文件命名规范
Go要求测试文件以 _test.go 结尾,并且放在对应包的同一目录下。例如:
- 源码文件:calculator.go
- 测试文件:calculator_test.go
这样 go test 才能自动识别并加载测试用例。
2. 编写测试函数
每个测试函数必须以 Test 开头,参数类型为 *testing.T。示例:
立即学习“go语言免费学习笔记(深入)”;
func TestAdd(t *testing.T) {
result := Add(2, 3)
if result != 5 {
t.Errorf("期望 5,但得到了 %d", result)
}
}
你可以使用 t.Log 记录调试信息,t.Errorf 触发失败但继续执行,t.Fatalf 遇错立即终止。
3. 运行测试命令
在项目根目录或包目录下执行:
- go test —— 运行当前目录所有测试
- go test -v —— 显示详细输出(推荐)
- go test ./... —— 递归运行所有子目录测试
- go test -run TestName —— 只运行匹配名称的测试函数
4. 使用表格驱动测试(Table-Driven Tests)
对于多个用例,推荐使用切片定义测试数据,结构清晰易维护:
func TestDivide(t *testing.T) {
tests := []struct {
a, b int
expected int
err string
}{
{10, 2, 5, ""},
{5, 0, 0, "除数不能为零"},
}
for _, tt := range tests {
t.Run(fmt.Sprintf("%d/%d", tt.a, tt.b), func(t *testing.T) {
result, err := Divide(tt.a, tt.b)
if tt.err != "" {
if err == nil || err.Error() != tt.err {
t.Errorf("期望错误 %q,实际得到 %v", tt.err, err)
}
} else {
if result != tt.expected {
t.Errorf("期望 %d,但得到了 %d", tt.expected, result)
}
}
})
}
}
基本上就这些。Go 的测试机制简洁高效,配合 IDE 支持还能实现一键运行和覆盖率查看。不复杂但容易忽略细节,比如测试函数名拼写错误会导致被忽略。确保遵循规范,就能顺利开展单元测试。










