Go测试的概念和方法
一、核心概念
-
测试类型
- 单元测试:验证单个函数或模块
- 基准测试:测量代码性能
- 示例测试:生成文档示例
- 集成测试:验证多组件协作
-
测试文件规范
- 文件名以
_test.go结尾 - 需导入
testing包
- 文件名以
-
测试函数签名
func TestXxx(*testing.T) // 单元测试 func BenchmarkXxx(*testing.B) // 基准测试 func ExampleXxx() // 示例测试
二、单元测试方法
-
基础测试
func TestAdd(t *testing.T) { got := Add(2, 3) want := 5 if got != want { t.Errorf("Add(2,3) = %d; want %d", got, want) } } -
表驱动测试
func TestMultiply(t *testing.T) { tests := []struct { a, b, want int }{ {2, 3, 6}, {0, 5, 0}, {-1, 4, -4}, } for _, tc := range tests { got := Multiply(tc.a, tc.b) if got != tc.want { t.Errorf("Multiply(%d,%d) = %d; want %d", tc.a, tc.b, got, tc.want) } } }
三、基准测试方法
func BenchmarkConcat(b *testing.B) {
strs := []string{"a", "b", "c", "d", "e"}
for i := 0; i < b.N; i++ {
result := ""
for _, s := range strs {
result += s
}
}
}
运行命令:go test -bench=.
四、高级技巧
-
子测试
func TestSplit(t *testing.T) { t.Run("empty_case", func(t *testing.T) { // 测试空字符串 }) t.Run("normal_case", func(t *testing.T) { // 正常场景 }) } -
测试覆盖率
运行命令:go test -coverprofile=coverage.out go tool cover -html=coverage.out -
测试初始化
func TestMain(m *testing.M) { setup() // 初始化操作 code := m.Run() teardown() // 清理操作 os.Exit(code) }
五、示例测试
func ExampleReverse() {
fmt.Println(Reverse("hello"))
// Output: olleh
}
六、最佳实践
- 测试文件与被测文件同包
- 测试函数名使用
Test+功能名 - 复杂逻辑优先使用表驱动测试
- 避免测试依赖外部服务(使用mock)
- 覆盖率目标建议80%以上
运行所有测试:
go test ./...

被折叠的 条评论
为什么被折叠?



