Go (Golang) 测试:框架与工具
Go (Golang) 是少数将测试内置于标准库层面的语言之一。得益于内置的 testing 包以及强大的第三方工具,开发者可以构建可靠且高性能的应用程序。在本文中,我们将介绍 Go 代码测试的主要框架和工具:从简单的单元测试到模拟和 goroutine 泄漏检测。
内置 testing 包
testing 包是 Go 中所有测试的基础。测试编写在以 _test.go 为后缀的文件中。测试函数必须具有签名 func TestXxx(t *testing.T)。通过命令 go test 运行。
package main
import ( "testing")
func Sum(a, b int) int { return a + b}
func TestSum(t *testing.T) { result := Sum(2, 3) expected := 5 if result != expected { t.Errorf("Sum(2,3) = %d; want %d", result, expected) }}对于表格驱动测试,使用结构体切片:
func TestSumTable(t *testing.T) { tests := []struct { a, b, expected int }{ {1, 2, 3}, {0, 0, 0}, {-1, 1, 0}, } for _, tt := range tests { result := Sum(tt.a, tt.b) if result != tt.expected { t.Errorf("Sum(%d,%d) = %d; want %d", tt.a, tt.b, result, tt.expected) } }}还支持:
- 基准测试 — 函数
func BenchmarkXxx(b *testing.B),通过go test -bench=.运行。 - 示例 — 函数
func ExampleXxx(),用于生成文档和验证输出。 - 子测试 —
t.Run("name", func(t *testing.T) {...}),用于分组和并行执行。
Testify — 扩展功能
Testify 是 Go 中最流行的测试框架。它添加了方便的断言、模拟和一组实用工具。
Testify 的主要包:
assert— 带有清晰错误信息的检查。require— 类似于 assert,但在失败时终止测试。mock— 创建和验证模拟对象。suite— 将测试分组为类(TDD 风格)。
import ( "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock")
// 使用 assert 的示例func TestSumWithTestify(t *testing.T) { assert.Equal(t, 5, Sum(2, 3)) assert.NotEqual(t, 0, Sum(-1, 1))}
// 使用 testify/mock 的模拟示例type Calculator interface { Add(a, b int) int}
type MockCalculator struct { mock.Mock}
func (m *MockCalculator) Add(a, b int) int { args := m.Called(a, b) return args.Int(0)}
func TestWithMock(t *testing.T) { mockCalc := new(MockCalculator) mockCalc.On("Add", 2, 3).Return(5)
result := mockCalc.Add(2, 3) assert.Equal(t, 5, result) mockCalc.AssertExpectations(t)}Gomock — 从接口生成模拟
Gomock(原始 Google 版本的 fork)是一个基于接口自动生成模拟的工具。与 mockgen 实用程序一起使用。
安装和基本示例:
// 安装go install go.uber.org/mock/mockgen@latest
// 为接口生成模拟// mockgen -source=calculator.go -destination=mock_calculator.go -package=main
// 在测试中使用func TestWithGomock(t *testing.T) { ctrl := gomock.NewController(t) defer ctrl.Finish()
mockCalc := NewMockCalculator(ctrl) mock