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

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

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

开始课程

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

推荐