Go测试的概念和方法
概念
-
测试驱动开发(TDD)
在编写功能代码前先编写测试用例,通过测试驱动代码设计。 -
测试金字塔
Go推荐分层测试策略:- 单元测试(占比最大)
- 集成测试
- 端到端测试(占比最小)
-
测试覆盖率
通过go test -cover计算代码被测试覆盖的比例: $$ \text{覆盖率} = \frac{\text{已执行代码行数}}{\text{总代码行数}} \times 100% $$
核心方法
-
单元测试
- 文件命名:
xxx_test.go - 函数格式:
func TestXxx(*testing.T)
func TestAdd(t *testing.T) { result := Add(2, 3) if result != 5 { t.Errorf("预期5, 得到%d", result) } } - 文件命名:
-
表格驱动测试
func TestMultiply(t *testing.T) { tests := []struct{ a, b, expected int }{ {2, 3, 6}, {-1, 5, -5}, {0, 100, 0}, } for _, tt := range tests { result := Multiply(tt.a, tt.b) if result != tt.expected { t.Errorf("%d * %d: 预期%d, 得到%d", tt.a, tt.b, tt.expected, result) } } } -
基准测试
- 函数格式:
func BenchmarkXxx(*testing.B) - 使用
b.N控制迭代次数
func BenchmarkConcat(b *testing.B) { for i := 0; i < b.N; i++ { Concat("a", "b") } } - 函数格式:
-
子测试
func TestParse(t *testing.T) { t.Run("整数解析", func(t *testing.T){ // 测试逻辑 }) t.Run("浮点数解析", func(t *testing.T){ // 测试逻辑 }) }
测试工具链
-
运行测试
go test ./... # 运行所有测试 go test -v # 显示详细输出 go test -run TestX # 运行特定测试 -
覆盖率分析
go test -coverprofile=coverage.out go tool cover -html=coverage.out -
竞态检测
go test -race
最佳实践
- 使用
t.Helper()标记辅助函数 - 避免测试依赖外部服务(使用mock)
- 测试边界条件:零值、负值、最大值等
- 保持测试代码与生产代码同等质量
通过
testing包和标准工具链,Go实现了轻量但强大的测试生态,支持从单元测试到性能分析的完整生命周期。
355

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



