Go (Golang) 测试:框架与工具

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Go (Golang) 中的测试:框架与工具



Go (Golang) 从设计之初就考虑到了现代开发的需求,因此标准库中已经包含了强大的 testing 包。然而,对于复杂的项目,通常需要额外的工具:模拟(mocks)、断言(assertions)、BDD 风格以及 goroutine 泄漏检查。在本文中,我们将介绍 Go 中用于测试的主要框架和库,展示代码示例,并解释何时使用哪种工具。



1. 内置包 testing



标准包 testing 是一切的基础。测试编写在带有 _test.go 后缀的文件中,函数必须具有签名 func TestXxx(t *testing.T)。示例:



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) }}


运行测试:go test ./...。对于基准测试,使用 testing.B;对于示例,使用 ExampleXxx。



2. testify 库



Testify 是 Go 中最流行的第三方测试库。它提供了方便的断言(assertions)、模拟(mocks)和辅助函数。



安装:

go get github.com/stretchr/testify


使用断言的示例:

package main

import ( "testing" "github.com/stretchr/testify/assert")

func TestSumWithTestify(t *testing.T) { result := Sum(2, 3) assert.Equal(t, 5, result, "Sum should be 5") assert.NotEqual(t, 0, result) assert.True(t, result > 0)}


Testify 还包含用于创建模拟的 mock 包。示例:

package main

import ( "testing" "github.com/stretchr/testify/mock")

// DataService — 我们将要模拟的接口type DataService interface { GetData(id int) string}

// MockDataService — 模拟结构体type MockDataService struct { mock.Mock}

func (m *MockDataService) GetData(id int) string { args := m.Called(id) return args.String(0)}

func TestGetData(t *testing.T) { mockService := new(MockDataService) mockService.On("GetData", 1).Return("result1")

result := mockService.GetData(1) assert.Equal(t, "result1", result) mockService.AssertExpectations(t)}


3. gomock — 模拟生成



Gomock 来自 Google,是一个基于接口生成模拟的框架。通过 mockgen 工具工作。



安装:

go install github.com/golang/mock/mockgen@v1.6.0


使用示例:

//go:generate mockgen -source=service.go -destination=mock_service.go -package=main

type Service interface { Process(data string) error}

// 在测试中:func TestProcess(t *testing.T) { ctrl := gomock.NewController(t) defer ctrl.Finish()

mockService := NewMockService(ctrl) mockService.EXPECT().Process("test").Return(nil)

err := mockService.Process("test") assert.NoError(t, err)}


Gomock 适用于接口众多的大型项目——代码生成可以节省时间。



4. ginkgo — BDD 风格



Ginkgo 是一个用于行为驱动开发(Behaviour-Driven Development, BDD)的框架。它允许以“描述”(Describe)、“上下文”(Context)和“规范”(It)的风格编写测试。



安装:

go get github.com/onsi/ginkgo/v2go get github.com/onsi/gomega


示例:

package main

import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" "testing")

func TestCalculator(

推荐