如何在Golang中使用testing编写单元测试_验证函数逻辑正确性
发布时间 - 2025-12-30 00:00:00 点击率:次Go单元测试需写Test开头、*testing.T参数的函数,用t.Run组织子测试、t.Errorf报告失败,配合go test运行;测试文件名以_test.go结尾且与被测代码同包。
在 Go 中用 testing 包写单元测试,核心是写以 Test 开头、参数为 *testing.T 的函数,然后用 t.Run 组织子测试、t.Errorf 报告失败,配合 go test 运行验证逻辑是否符合预期。
基础测试结构:从一个简单函数开始
假设你有一个计算两个整数最大值的函数:
func Max(a, b int) int {
if a > b {
return a
}
return b
}
对应测试文件(如 max_test.go)中这样写:
func TestMax(t *testing.T) {
tests := []struct {
name string
a, b int
want int
}{
{"positive", 3, 5, 5},
{"equal", 4, 4, 4},
{"negative", -2, -7, -2},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := Max(tt.a, tt.b)
if got != tt.want {
t.Errorf("Max(%d, %d) = %d, want %d", tt.a, tt.b, got, tt.want)
}
})
}
}
- 测试文件名必须以
_test.go结尾,且与被测代码在同一包内 -
t.Run支持命名子测试,便于定位失败用例,也支持并行(加t.Parallel()) - 用结构体切片组织多组输入/期望输出,避免重复代码,提升可读性和覆盖度
验证边界与错误路径:不只是“正常情况”
真实逻辑常涉及空值、零值、错误返回等。比如一个解析 JSON 字符串的函数:
func ParseUser(s string) (*User, error) {
var u User
if err := json.Unmarshal([]byte(s), &u); err != nil {
return nil, fmt.Errorf("parse user: %w", err)
}
return &u, nil
}
测试要覆盖成功、空字符串、非法 JSON、字段缺失等情况:
- 成功解析:检查字段值是否正确赋值
- 空输入:
ParseUser("")应返回非 nil error - 非法 JSON:
ParseUser("{invalid")同样应报错,且错误信息包含预期前缀 - 用
if err != nil+t.Error或assert.ErrorContains(需引入github.com/stretchr/testify)判断错误内容
模拟依赖与控制副作用
如果函数依赖外部调用(如 HTTP 请求、数据库查询),不能在单元测试中真实发起网络请求。推荐做法是抽象接口、注入依赖:
type Fetcher interface {
Get(url string) ([]byte, error)
}
func DownloadAndParse(f Fetcher, url string) (string, error) {
data, err := f.Get(url)
if err != nil {
return "", err
}
return strings.TrimSpace(string(data)), nil
}
测试时传入一个内存实现:
type mockFetcher struct {
data []byte
err error
}
func (m mockFetcher) Get(_ string) ([]byte, error) {
return m.data, m.err
}
func TestDownloadAndParse(t *testing.T) {
t.Run("success", func(t *testing.T) {
got, err := DownloadAndParse(mockFetcher{data: []byte(" hello ")}, "http://x")
if err != nil || got != "hello" {
t.Errorf("unexpected result: %v, %v", got, err)
}
})
t.Run("fetch error", func(t *testing.T) {
_, err := DownloadAndParse(mockFetcher{err: errors.New("timeout")}, "http://x")
if err == nil {
t.Error("expected error, got nil")
}
})
}
- 不直接调用
http.Get,而是通过接口接收行为,测试更可控、更快、无副作用 - mock 实现只需满足接口,无需完整逻辑,聚焦验证被测函数对依赖返回的处理是否正确
运行与调试技巧
使用标准命令快速验证:
-
go test:运行当前目录所有测试 -
go test -v:显示每个测试名称和日志(t.Log输出可见) -
go test -run=^TestMax$:只运行指定测试函数 -
go test -cover:查看测试覆盖率(建议配合-coverprofile=c.out && go tool cover -html=c.out生成可视化报告) - 在测试中用
t.Fatal或t.Fatalf遇错终止当前子测试,避免后续断言干扰判断
# html
# js
# git
# json
# go
# github
# golang
# ai
# if
# Error
# 字符串
# 结构体
# 接口
# 切片
# nil
# 数据库
# http
# 是否正确
# 单元测试
# 只需
# 你有
# 能在
# 更快
# 报错
# 错误信息
# 是否符合
# 不直接
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何在IIS中配置站点IP、端口及主机头?
javascript日期怎么处理_如何格式化输出
如何制作一个表白网站视频,关于勇敢表白的小标题?
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
Laravel观察者模式如何使用_Laravel Model Observer配置
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
Android利用动画实现背景逐渐变暗
js实现获取鼠标当前的位置
Mybatis 中的insertOrUpdate操作
5种Android数据存储方式汇总
laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法
如何在建站主机中优化服务器配置?
Swift中swift中的switch 语句
b2c电商网站制作流程,b2c水平综合的电商平台?
如何在Windows环境下新建FTP站点并设置权限?
如何在 React 中条件性地遍历数组并渲染元素
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
在线制作视频网站免费,都有哪些好的动漫网站?
免费网站制作appp,免费制作app哪个平台好?
详解Android图表 MPAndroidChart折线图
Laravel如何生成和使用数据填充?(Seeder和Factory示例)
什么是javascript作用域_全局和局部作用域有什么区别?
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
Laravel如何集成Inertia.js与Vue/React?(安装配置)
Laravel Docker环境搭建教程_Laravel Sail使用指南
Laravel storage目录权限问题_Laravel文件写入权限设置
浅谈redis在项目中的应用
Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】
打造顶配客厅影院,这份100寸电视推荐名单请查收
LinuxCD持续部署教程_自动发布与回滚机制
Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)
Python正则表达式进阶教程_复杂匹配与分组替换解析
Android滚轮选择时间控件使用详解
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
微信小程序 scroll-view组件实现列表页实例代码
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】
如何用低价快速搭建高质量网站?
怎么用AI帮你设计一套个性化的手机App图标?
如何打造高效商业网站?建站目的决定转化率
如何在自有机房高效搭建专业网站?
Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面
Laravel怎么实现支付功能_Laravel集成支付宝微信支付
Laravel路由怎么定义_Laravel核心路由系统完全入门指南
如何在阿里云域名上完成建站全流程?
品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?
利用vue写todolist单页应用
如何快速搭建个人网站并优化SEO?
如何用好域名打造高点击率的自主建站?

