文章目录

Go 测试:testing 包与表驱动测试

发布于 2026-04-07 01:37:01 · 浏览 12 次 · 评论 0 条

Go 测试:testing 包与表驱动测试


1. 初始化测试环境

  1. 打开 终端或命令行工具。
  2. 创建 独立的项目文件夹,执行 mkdir go-test-demo
  3. 进入 目标目录,输入 cd go-test-demo
  4. 初始化 Go 模块管理,运行 go mod init example.com/testing-demo。此命令会生成模块依赖清单,为后续引入标准库做准备。

2. 准备被测业务代码

  1. 新建 源代码文件,命名为 calculator.go
  2. 编写 核心加法逻辑,将以下代码粘贴至文件:
package calculator

func Add(a, b int) int {
    return a + b
}

3. 编写标准单元测试

  1. 创建 专用测试文件,命名为 calculator_test.go。文件后缀必须严格保持 _test.go 格式,否则编译器会自动跳过该文件。
  2. 声明 包路径,首行写入 package calculator,确保测试文件与源码处于同一命名空间。
  3. 导入 官方测试工具包,添加 import "testing" 语句。
  4. 声明 测试入口函数,命名规范为 Test 加上被测功能首字母大写,并固定传入 t *testing.T 指针参数。
  5. 校验 单次执行结果,对比实际输出与期望值,不符时调用 t.Fatalf 直接终止测试并抛出错误堆栈。

完整代码实现如下:

package calculator

import "testing"

func TestAdd(t *testing.T) {
    result := Add(2, 3)
    if result != 5 {
        t.Fatalf("期望结果为 5,实际得到 %d", result)
    }
}

4. 重构为表驱动测试

表驱动测试利用数据结构批量管理测试场景,避免重复编写断言逻辑,大幅提升用例扩展效率。

参考下方字段映射表定义数据结构:

字段名称 数据类型 作用说明
Name string 描述当前测试场景的具体业务含义
A, B int 传入被测函数的实际参数值
Expected int 程序应当返回的标准答案
  1. 实例化 匿名结构体切片,将常规值、负数、零值等边界情况逐一填入切片。
  2. 开启 遍历循环,使用 for 语句依次读取切片中的独立测试单元。
  3. 隔离 独立测试上下文,调用 t.Run() 函数将每个切片元素包装为子测试。该机制允许测试框架并行或单独执行特定子用例。
  4. 断言 循环内结果,替换原有的 t.Fatalft.Errorf。错误日志仅标记当前子用例失败,循环继续执行剩余场景。
  5. 替换 原有测试函数,采用以下完整模板覆盖 TestAddTableDriven
package calculator

import "testing"

func TestAddTableDriven(t *testing.T) {
    tests := []struct {
        Name     string
        A, B     int
        Expected int
    }{
        {"常规正整数相加", 2, 3, 5},
        {"包含负数运算", -1, -4, -5},
        {"零值边界验证", 0, 0, 0},
        {"极大值防溢出", 1000000000, 1, 1000000001},
    }

    for _, tc := range tests {
        t.Run(tc.Name, func(t *testing.T) {
            result := Add(tc.A, tc.B)
            if result != tc.Expected {
                t.Errorf("场景[%s]校验失败: 期望 %d, 实际 %d", tc.Name, tc.Expected, result)
            }
        })
    }
}

5. 执行与调试测试用例

  1. 触发 全量测试流程,执行 go test -v。标志 -v 开启详细日志,终端会逐行打印每个 t.Run 的通过或失败状态。
  2. 定位 单一场景问题,追加 -run 参数进行正则匹配。输入 go test -v -run TestAddTableDriven/包含负数运算 即可跳过其他用例,直接复现特定错误。
  3. 统计 代码执行覆盖率,添加参数 go test -coverprofile=coverage.out。该命令会在当前目录生成纯文本覆盖率数据文件。
  4. 渲染 交互式可视化报告,运行 go tool cover -html=coverage.out。浏览器将自动打开代码对照视图,绿色高亮代表已执行行,红色高亮代表未覆盖行。

评论 (0)

暂无评论,快来抢沙发吧!

扫一扫,手机查看

扫描上方二维码,在手机上查看本文