全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

如何使用Golang testing进行单元测试_验证函数和方法正确性

Go单元测试需以Test开头、*testing.T为参数,用t.Error等报告失败;测试文件名以_test.go结尾且同包;支持表驱动、子测试、错误验证、接口mock等。

用 Go 的 testing 包写单元测试很简单,核心是写以 Test 开头、参数为 *testing.T 的函数,然后用 t.Errort.Errorft.Fatal 报告失败。

快速上手:写第一个测试函数

Go 测试文件必须以 _test.go 结尾,且与被测代码在同一包(通常同目录)。例如,你有一个 add.go

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

对应写 add_test.go

func TestAdd(t *testing.T) {
    result := Add(2, 3)
    if result != 5 {
        t.Errorf("expected 5, got %d", result)
    }
}

运行测试:go test(当前目录)或 go test -v 查看详细输出。

用表驱动测试覆盖多种输入

避免重复写多个 if 判断,把测试用例组织成结构体切片,遍历执行:

func TestAdd(t *testing.T) {
    tests := []struct {
        name     string
        a, b     int
        expected int
    }{
        {"positive", 2, 3, 5},
        {"negative", -1, -1, -2},
        {"zero", 0, 0, 0},
    }
    for _, tt := range tests {
        t.Run(tt.name, func(t *testing.T) {
            result := Add(tt.a, tt.b)
            if result != tt.expected {
                t.Errorf("got %d, want %d", result, tt.expected)
            }
        })
    }
}

t.Run 支持子测试,让输出更清晰,也方便单独运行某个用例(如 go test -run=TestAdd/positive)。

验证错误和边界情况

不仅要测“正常路径”,还要测 panic、错误返回、空值、越界等。例如函数返回 error

func Divide(a, b float64) (float64, error) {
    if b == 0 {
        return 0, errors.New("division by zero")
    }
    return a / b, nil
}

对应测试:

  • 成功场景:检查结果值是否符合预期
  • 错误场景:用 if err == nil 判断是否该出错却没出错,或用 if !errors.Is(err, expectedErr) 校验错误类型
  • 推荐用 require(需引入 github.com/stretchr/testify/require)简化断言,比如 require.NoError(t, err)require.EqualError(t, err, "division by zero")

模拟依赖与接口隔离

真实项目中函数常依赖外部(数据库、HTTP、时间等)。Go 鼓励通过接口抽象依赖,再在测试中传入 mock 实现。例如:

type Clock interface {
    Now() time.Time
}
func FormatTime(clock Clock) string {
    return clock.Now().Format("2006-01-02")
}

测试时可构造一个固定时间的 mock:

type mockClock struct{ t time.Time }
func (m mockClock) Now() time.Time { return m.t }

func TestFormatTime(t *testing.T) {
    c := mockClock{time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC)}
    got := FormatTime(c)
    if got != "2025-01-02" {
        t.Errorf("got %s", got)
    }
}

这样既不依赖系统时钟,又保持测试确定性和速度。


# git  # go  # github  # golang  # if  # require  # Error  # 结构体  # 接口  # 切片  # nil  # 数据库  # http  # 单元测试  # 第一个  # 多个  # 遍历  # 你有  # 很简单  # 却没  # 既不  # 或用  # 是否符合 


相关文章: 建站之星北京办公室:智能建站系统与小程序生成方案解析  宝塔建站无法访问?如何排查配置与端口问题?  如何通过虚拟主机快速完成网站搭建?  非常酷的网站设计制作软件,酷培ai教育官方网站?  头像制作网站在线制作软件,dw网页背景图像怎么设置?  建站之星多图banner生成与模板自定义指南  焦点电影公司作品,电影焦点结局是什么?  制作农业网站的软件,比较好的农业网站推荐一下?  网页设计网站制作软件,microsoft office哪个可以创建网页?  阿里云网站制作公司,阿里云快速搭建网站好用吗?  开源网站制作软件,开源网站什么意思?  网站制作价目表怎么做,珍爱网婚介费用多少?  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  岳西云建站教程与模板下载_一站式快速建站系统操作指南  建站之星后台管理如何实现高效配置?  建站之星五站合一营销型网站搭建攻略,流量入口全覆盖优化指南  已有域名建站全流程解析:网站搭建步骤与建站工具选择  电商网站制作价格怎么算,网上拍卖流程以及规则?  网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?  活动邀请函制作网站有哪些,活动邀请函文案?  定制建站哪家更专业可靠?推荐榜单揭晓    七夕网站制作视频,七夕大促活动怎么报名?  建站与域名管理如何高效结合?  网站制作大概多少钱一个,做一个平台网站大概多少钱?  公司网站制作价格怎么算,公司办个官网需要多少钱?  专业商城网站制作公司有哪些,pi商城官网是哪个?  如何在景安服务器上快速搭建个人网站?  微网站制作教程,我微信里的网站怎么才能复制到浏览器里?  我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?  保定网站制作方案定制,保定招聘的渠道有哪些?找工作的人一般都去哪里看招聘信息?  手机网站制作与建设方案,手机网站如何建设?  北京制作网站的公司,北京铁路集团官方网站?  高性价比服务器租赁——企业级配置与24小时运维服务  宝塔新建站点报错如何解决?  招商网站制作流程,网站招商广告语?  如何选择高效可靠的多用户建站源码资源?  如何规划企业建站流程的关键步骤?  如何解决VPS建站LNMP环境配置常见问题?  如何设计高效校园网站?  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  制作网站的软件免费下载,免费制作app哪个平台好?  XML的“混合内容”是什么 怎么用DTD或XSD定义  制作网站的基本流程,设计网站的软件是什么?  大学网站设计制作软件有哪些,如何将网站制作成自己app?  如何自定义建站之星模板颜色并下载新样式?  青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?  建站之星如何一键生成手机站?  成都网站制作公司哪家好,四川省职工服务网是做什么用?  大同网页,大同瑞慈医院官网? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。