Go 测试:testing 包与表驱动测试
1. 初始化测试环境
- 打开 终端或命令行工具。
- 创建 独立的项目文件夹,执行
mkdir go-test-demo。 - 进入 目标目录,输入
cd go-test-demo。 - 初始化 Go 模块管理,运行
go mod init example.com/testing-demo。此命令会生成模块依赖清单,为后续引入标准库做准备。
2. 准备被测业务代码
- 新建 源代码文件,命名为
calculator.go。 - 编写 核心加法逻辑,将以下代码粘贴至文件:
package calculator
func Add(a, b int) int {
return a + b
}
3. 编写标准单元测试
- 创建 专用测试文件,命名为
calculator_test.go。文件后缀必须严格保持_test.go格式,否则编译器会自动跳过该文件。 - 声明 包路径,首行写入
package calculator,确保测试文件与源码处于同一命名空间。 - 导入 官方测试工具包,添加
import "testing"语句。 - 声明 测试入口函数,命名规范为
Test加上被测功能首字母大写,并固定传入t *testing.T指针参数。 - 校验 单次执行结果,对比实际输出与期望值,不符时调用
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 |
程序应当返回的标准答案 |
- 实例化 匿名结构体切片,将常规值、负数、零值等边界情况逐一填入切片。
- 开启 遍历循环,使用
for语句依次读取切片中的独立测试单元。 - 隔离 独立测试上下文,调用
t.Run()函数将每个切片元素包装为子测试。该机制允许测试框架并行或单独执行特定子用例。 - 断言 循环内结果,替换原有的
t.Fatalf为t.Errorf。错误日志仅标记当前子用例失败,循环继续执行剩余场景。 - 替换 原有测试函数,采用以下完整模板覆盖
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. 执行与调试测试用例
- 触发 全量测试流程,执行
go test -v。标志-v开启详细日志,终端会逐行打印每个t.Run的通过或失败状态。 - 定位 单一场景问题,追加
-run参数进行正则匹配。输入go test -v -run TestAddTableDriven/包含负数运算即可跳过其他用例,直接复现特定错误。 - 统计 代码执行覆盖率,添加参数
go test -coverprofile=coverage.out。该命令会在当前目录生成纯文本覆盖率数据文件。 - 渲染 交互式可视化报告,运行
go tool cover -html=coverage.out。浏览器将自动打开代码对照视图,绿色高亮代表已执行行,红色高亮代表未覆盖行。

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