题目
如何为Go函数编写基础单元测试
信息
- 类型:问答
- 难度:⭐
考点
测试函数命名规则,测试用例编写,基础断言使用
快速回答
在Go中编写单元测试需要遵循以下要点:
- 测试文件必须以
_test.go结尾 - 测试函数命名格式为
TestXxx(t *testing.T) - 使用
t.Errorf或t.Fatalf报告测试失败 - 常用断言方法:比较实际值与预期值
1. 原理说明
Go内置的testing包提供了轻量级测试框架:
- 测试文件需与被测文件在相同包内
- 执行测试:
go test [包路径] - 测试覆盖率:
go test -cover
2. 代码示例
被测函数 (math.go):
package math
// 加法函数
func Add(a, b int) int {
return a + b
}测试文件 (math_test.go):
package math
import "testing"
func TestAdd(t *testing.T) {
tests := []struct {
name string
a, b int
expect int
}{{
name: "positive numbers",
a: 2,
b: 3,
expect: 5,
}, {
name: "negative numbers",
a: -1,
b: -2,
expect: -3,
}, {
name: "mixed signs",
a: 5,
b: -3,
expect: 2,
}}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := Add(tt.a, tt.b); got != tt.expect {
t.Errorf("Add(%d, %d) = %d, want %d", tt.a, tt.b, got, tt.expect)
}
})
}
}3. 最佳实践
- 使用表格驱动测试(Table-Driven Tests)组织多组测试用例
- 为每个子测试命名(
t.Run)便于定位失败用例 - 错误信息明确包含:输入值、实际输出、期望输出
- 测试覆盖率应达到80%以上(关键逻辑需100%)
4. 常见错误
- 错误:测试函数名不以
Test开头 → 测试不被执行 - 错误:忘记调用
t.Run导致多个用例无法独立识别 - 错误:使用
println代替t.Logf输出调试信息 - 错误:未处理边界条件(如零值、极值)
5. 扩展知识
- 进阶断言库:
testify/assert(提供更丰富断言方法) - 测试初始化:
TestMain(m *testing.M)用于全局setup/teardown - 并发测试:使用
t.Parallel()标记并行测试 - 基准测试:
BenchmarkXxx(b *testing.B)函数