侧边栏壁纸
博主头像
colo

欲买桂花同载酒

  • 累计撰写 1823 篇文章
  • 累计收到 0 条评论

如何为Go函数编写基础单元测试

2025-12-12 / 0 评论 / 4 阅读

题目

如何为Go函数编写基础单元测试

信息

  • 类型:问答
  • 难度:⭐

考点

测试函数命名规则,测试用例编写,基础断言使用

快速回答

在Go中编写单元测试需要遵循以下要点:

  • 测试文件必须以_test.go结尾
  • 测试函数命名格式为TestXxx(t *testing.T)
  • 使用t.Errorft.Fatalf报告测试失败
  • 常用断言方法:比较实际值与预期值
## 解析

1. 原理说明

Go内置的testing包提供了轻量级测试框架:

  • 测试文件需与被测文件在相同包内
  • 执行测试:go test [包路径]
  • 测试覆盖率:go test -cover

2. 代码示例

被测函数 (math.go):

package math

// 加法函数
func Add(a, b int) int {
    return a + b
}

测试文件 (math_test.go):

package math

import "testing"

func TestAdd(t *testing.T) {
    tests := []struct {
        name   string
        a, b   int
        expect int
    }{{
        name:   "positive numbers",
        a:      2,
        b:      3,
        expect: 5,
    }, {
        name:   "negative numbers",
        a:      -1,
        b:      -2,
        expect: -3,
    }, {
        name:   "mixed signs",
        a:      5,
        b:      -3,
        expect: 2,
    }}

    for _, tt := range tests {
        t.Run(tt.name, func(t *testing.T) {
            if got := Add(tt.a, tt.b); got != tt.expect {
                t.Errorf("Add(%d, %d) = %d, want %d", tt.a, tt.b, got, tt.expect)
            }
        })
    }
}

3. 最佳实践

  • 使用表格驱动测试(Table-Driven Tests)组织多组测试用例
  • 为每个子测试命名(t.Run)便于定位失败用例
  • 错误信息明确包含:输入值、实际输出、期望输出
  • 测试覆盖率应达到80%以上(关键逻辑需100%)

4. 常见错误

  • 错误:测试函数名不以Test开头 → 测试不被执行
  • 错误:忘记调用t.Run导致多个用例无法独立识别
  • 错误:使用println代替t.Logf输出调试信息
  • 错误:未处理边界条件(如零值、极值)

5. 扩展知识

  • 进阶断言库:testify/assert(提供更丰富断言方法)
  • 测试初始化:TestMain(m *testing.M)用于全局setup/teardown
  • 并发测试:使用t.Parallel()标记并行测试
  • 基准测试:BenchmarkXxx(b *testing.B)函数