文章目录

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

发布于 2026-04-07 01:37:01 · 浏览 169 次 · 评论 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.Fatalf 为 t.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)

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

扫一扫,手机查看

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