全网整合营销服务商

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

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

如何测试Golang错误处理逻辑_Golang单元测试错误验证方法

答案:Go语言中通过t.Error、errors.Is/As及testify库验证错误。首先检查err是否为nil,再用errors.Is判断是否包含目标错误,errors.As断言具体错误类型,或使用testify简化断言流程,确保错误处理正确。

在Go语言开发中,错误处理是程序健壮性的关键部分。为了确保代码在异常情况下行为正确,必须对错误处理逻辑进行充分的单元测试。下面介绍几种常用的Golang单元测试中验证错误的方法。

使用 t.Error 或 t.Errorf 检查错误是否符合预期

最基础的方式是在测试函数中调用目标函数,然后判断返回的 error 是否为 nil 或是否匹配预期类型/消息。

例如,假设有一个除法函数:

func Divide(a, b float64) (float64, error) {
  if b == 0 {
    return 0, fmt.Errorf("cannot divide by zero")
  }
  return a / b, nil
}

对应的测试可以这样写:

func TestDivide_ByZero(t *testing.T) {
  _, err := Divide(10, 0)
  if err == nil {
    t.Errorf("expected an error when dividing by zero, but got nil")
  }
  if err.Error() != "cannot divide by zero" {
    t.Errorf("expected 'cannot divide by zero', got '%s'", err.Error())
  }
}

使用 errors.Is 和 errors.As 进行语义化错误比较

从 Go 1.13 开始,标准库提供了 errors.Iserrors.As 来更安全地比较和解包错误。

如果你使用的是自定义错误类型或 wrapped 错误,应优先使用这些方法。

var ErrDivideByZero = errors.New("cannot divide by zero")

func Divide(a, b float64) (float64, error) {
  if b == 0 {
    return 0, fmt.Errorf("calculation failed: %w", ErrDivideByZero)
  }
  return a / b, nil
}

测试时使用 errors.Is 判断是否包含目标错误:

func TestDivide_WithErrorIs(t *testing.T) {
  _, err := Divide(5, 0)
  if !errors.Is(err, ErrDivideByZero) {
    t.Errorf("expected error to be wrapped with ErrDivideByZero")
  }
}

断言错误类型(使用 errors.As)

当你的函数返回特定类型的错误(如自定义结构体),可以用 errors.As 提取并验证字段。

type ValidationError struct {
  Field string
  Msg   string
}

func (e *ValidationError) Error() string {
  return fmt.Sprintf("validation error on %s: %s", e.Field, e.Msg)
}

测试时判断错误是否为该类型:

func TestSomeValidation(t *testing.T) {
  err := ValidateInput("")
  var ve *ValidationError
  if !errors.As(err, &ve) {
    t.Fatal("expected ValidationError, got another type")
  }
  if ve.Field != "Input" {
    t.Errorf("expected Field=Input, got %s", ve.Field)
  }
}

使用 testify/assert 等第三方库简化断言

虽然标准 testing 包足够用,但使用像 testify 这样的库可以让错误验证更简洁。

import "github.com/stretchr/testify/assert"

func TestDivide_WithTestify(t *testing.T) {
  _, err := Divide(10, 0)
  assert.Error(t, err)
  assert.Contains(t, err.Error(), "cannot divide by zero")
  assert.ErrorContains(t, err, "divide by zero") // Go 1.14+ 推荐方式
}

注意:Go 1.14 起,testing.T 提供了 t.ErrorContains 方法,也可用于检查错误信息子串。

基本上就这些。关键是根据错误的设计方式选择合适的验证策略:简单字符串比较适用于调试信息,errors.Is/As 更适合生产级错误处理,而测试库能提升可读性。不复杂但容易忽略的是对 wrapped 错误的正确解包和类型断言。


# git  # go  # github  # golang  # go语言  # app  # ai  # 标准库  # String  # if  # Error  # 字符串  # 结构体  # Struct 


相关文章: 义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?  如何在自有机房高效搭建专业网站?  济南企业网站制作公司,济南社保单位网上缴费步骤?  魔方云NAT建站如何实现端口转发?  网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?  如何选择建站程序?包含哪些必备功能与类型?  建站主机选哪种环境更利于SEO优化?  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  建站之星如何一键生成手机站?  建站VPS选购需注意哪些关键参数?  广州网站建站公司选择指南:建站流程与SEO优化关键词解析  黑客如何利用漏洞与弱口令入侵网站服务器?  建站ABC备案流程中有哪些关键注意事项?  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  相册网站制作软件,图片上的网址怎么复制?  高端企业智能建站程序:SEO优化与响应式模板定制开发  免费公司网站制作软件,如何申请免费主页空间做自己的网站?  婚礼视频制作网站,学习*后期制作的网站有哪些?  较简单的网站制作软件有哪些,手机版网页制作用什么软件?  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  常州企业网站制作公司,全国继续教育网怎么登录?  建站之星如何防范黑客攻击与数据泄露?  家具网站制作软件,家具厂怎么跑业务?  定制建站平台哪家好?企业官网搭建与快速建站方案推荐  临沂网站制作企业,临沂第三中学官方网站?  宝塔新建站点为何无法访问?如何排查?  我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?  免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?  如何用VPS主机快速搭建个人网站?  免费视频制作网站,更新又快又好的免费电影网站?  如何将凡科建站内容保存为本地文件?  如何在阿里云域名上完成建站全流程?  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  如何用花生壳三步快速搭建专属网站?  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  如何在橙子建站中快速调整背景颜色?  官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站  定制建站方案优化指南:企业官网开发与建站费用解析  如何用西部建站助手快速创建专业网站?  如何基于云服务器快速搭建个人网站?  如何通过山东自助建站平台快速注册域名?  如何通过PHP快速构建高效问答网站功能?  制作国外网站的软件,国外有哪些比较优质的网站推荐?  建站之星微信建站一键生成小程序+多端营销系统  nginx修改上传文件大小限制的方法  上海网站制作开发公司,上海买房比较好的网站有哪些?  三星网站视频制作教程下载,三星w23网页如何全屏?  如何在阿里云完成域名注册与建站?  定制建站策划方案_专业建站与网站建设方案一站式指南 

您的项目需求

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