如何在Golang中测试错误返回情况

先构造触发错误的输入或依赖,再用testing包结合errors.Is或errors.As验证错误类型。例如测试空文件名、文件不存在或mock网络超时,确保函数返回预期错误,覆盖各类失败场景以提升代码健壮性。

如何在golang中测试错误返回情况

在Golang中测试错误返回情况,关键在于构造能触发错误的场景,并验证函数是否返回预期的错误。Go的标准库testing配合errors.Iserrors.As可以很好地完成这类任务。

构造可复现错误的输入

要测试错误路径,先确保能稳定触发错误。可以通过传入非法参数、模拟依赖失败等方式实现。

例如,一个读取文件的函数:

func ReadConfig(filename string) ([]byte, error) {
  if filename == “” {
    return nil, errors.New(“filename is required”)
  }
  return os.ReadFile(filename)
}

测试空文件名导致的错误:

立即学习“go语言免费学习笔记(深入)”;

func TestReadConfig_EmptyFilename(t *testing.T) {
  _, err := ReadConfig(“”)
  if err == nil {
    t.Fatal(“expected error for empty filename, got nil”)
  }
  if err.Error() != “filename is required” {
    t.Errorf(“expected ‘filename is required’, got %v”, err)
  }}

使用 errors.Is 和 errors.As 进行精确比对

当函数返回的是包装过的错误(如用fmt.Errorf加前缀),直接比较字符串可能失败。应使用标准库提供的工具函数。

示例:函数包装系统调用错误

func ProcessFile(name string) error {
  data, err := os.ReadFile(name)
  if err != nil {
    return fmt.Errorf(“failed to read %s: %w”, name, err)
  }
  // … 处理 data
  return nil
}

测试时检查底层是否为fs.ErrNotExist

func TestProcessFile_FileNotFound(t *testing.T) {
  err := ProcessFile(“non-existent.txt”)
  if err == nil {
    t.Fatal(“expected error, got nil”)
  }
  if !errors.Is(err, fs.ErrNotExist) {
    t.Errorf(“error does not wrap fs.ErrNotExist”)
  }}

模拟依赖行为以触发特定错误

对于涉及网络、数据库等外部依赖的函数,使用接口+mock方式控制返回值。

定义接口:

type DataFetcher interface {
  Fetch(id string) (string, error)
}

被测函数:

func GetData(fetcher DataFetcher, id string) (string, error) {
  data, err := fetcher.Fetch(id)
  if err != nil {
    return “”, fmt.Errorf(“service error: %w”, err)
  }
  return data, nil
}

测试时传入返回错误的 mock:

type MockFetcher struct{}
func (m *MockFetcher) Fetch(id string) (string, error) {
  return “”, errors.New(“timeout”)
}

func TestGetData_FetchError(t *testing.T) {
  fetcher := &MockFetcher{}
  _, err := GetData(fetcher, “123”)
  if err == nil {
    t.Fatal(“expected error”)
  }
  if !strings.Contains(err.Error(), “service error”) {
    t.Errorf(“missing expected error prefix”)
  }}

基本上就这些。写好错误测试,能让代码更健壮,也能清楚知道哪里出错了。关键是覆盖各种出错路径,别只测“成功”那一行。

以上就是如何在Golang中测试错误返回情况的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1418026.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
如何将浏览器中的请求转换为Python代码?
上一篇 2026年5月10日 10:40:41
如何解决 pyecharts 绘制地图时出现的 ValueError: too many values to unpack 错误?
下一篇 2026年5月10日 10:40:43

相关推荐

  • c++怎么使用std::mutex来保护共享数据_c++ std::mutex线程保护方法

    使用std::mutex和std::lock_guard可防止多线程数据竞争。1. 包含头文件并声明互斥量保护共享数据;2. 在访问共享数据时用std::lock_guard自动加锁和解锁;3. 多个线程调用受保护函数能保证数据一致性;4. 建议使用RAII避免死锁,按序加锁多个互斥量,合理控制锁粒…

    2026年5月10日
    200
  • Vue3 中 onload 方法为什么不执行?

    vue3 中 onload 方法不执行的原因 在 Vue3 中,onload 方法在组件内通常不会执行。这是因为: onload 仅在入口文件执行:onload 事件只会在入口文件(main.js)中执行,而不是在组件内。组件创建顺序:在 Vue3 生命周期中,mounted 钩子在组件创建完成后执…

    2026年5月10日
    100
  • 解决React Context中存储类实例并调用其方法的常见陷阱

    本文旨在解决在React Context中管理类实例数组时,调用实例方法返回undefined的常见问题。核心在于理解Array.prototype.forEach方法的返回值特性,它总是返回undefined。文章将详细阐述如何通过正确使用map方法来收集方法执行结果,或在仅需执行副作用时合理运用…

    2026年5月10日
    100
  • C#项目结构如何组织?DDD(领域驱动设计)分层架构在C#中的最佳实践

    采用DDD时应分Domain、Application、Infrastructure、Presentation四层,每层职责分明且仅依赖下层。Domain包含实体、值对象、聚合根及领域事件,不依赖其他层;Application协调业务用例,调用领域对象但不含业务规则;Infrastructure实现仓…

    2026年5月10日
    100
  • html超链接字体颜色修改CSS属性名称是什么

    修改超链接字体颜色的CSS属性是color,通过a标签选择器设置,如a{color:red;},并可用a:link、a:visited、a:hover、a:active分别定义未访问、已访问、悬停、点击状态的颜色,建议按LVHA顺序书写以避免样式冲突。 修改HTML超链接字体颜色的CSS属性名称是 …

    2026年5月10日
    000
  • 如何将浏览器中的请求转换为Python代码?

    如何将浏览器中的请求转换为 Python 代码? 在日常的开发工作中,我们常常需要将浏览器中的请求转换成 Python 代码,以便进行自动化测试或开发接口。那么,是否有简单的方法可以直接将浏览器中的请求转换为 Python 代码呢? 假设我们有一个包含 URL、请求头(包括 Cookie)、请求体等…

    2026年5月10日
    000
  • Golang如何构建Markdown转换器 使用blackfriday库实践转换

    Golang如何构建Markdown转换器 使用blackfriday库实践转换Golang如何构建Markdown转换器 使用blackfriday库实践转换Golang如何构建Markdown转换器 使用blackfriday库实践转换Golang如何构建Markdown转换器 使用blackfriday库实践转换

    blackfriday库的核心功能是遵循commonmark规范将markdown转换为html并支持多种扩展,优势在于高性能、可定制性和广泛的功能集。1. 它支持表格、代码块高亮、任务列表等常用扩展,提升内容表现力;2. 作为go原生实现,处理速度快,适合实时渲染和大规模文档处理;3. 提供wit…

    2026年5月10日 用户投稿
    000
  • 使用 Go Test 指定函数或套件进行测试

    本文旨在介绍如何使用 `go test` 命令选择性地运行 Go 语言包中的特定测试函数或测试套件,从而提高测试效率,尤其是在大型项目中进行测试驱动开发(TDD)时,可以避免不必要的测试日志输出,专注于当前开发的功能。 在 Go 语言中,go test 是一个强大的工具,用于运行包中的测试。默认情况…

    2026年5月10日
    000
  • Debian系统中TigerVNC启动失败怎么办

    在Debian系统中,TigerVNC服务器启动失败?别担心,本文提供详细的排错步骤,助您快速解决问题。 一、检查系统日志 首先,查看系统日志,寻找可能导致VNC启动失败的错误信息。您可以通过按下 Ctrl+Alt+F1 (或其他Fn键)进入控制台查看日志。 二、确认VNC服务器已安装 使用以下命令…

    2026年5月10日
    000
  • Python中如何使用Flask-Login?

    在Python中使用Flask-Login可以极大地简化用户认证和会话管理的工作。Flask-Login是一个扩展库,专门用于处理用户登录、登出以及会话管理,让我们可以专注于开发应用的其他部分。 当我第一次接触Flask-Login时,我被它的简洁和功能所吸引。它的设计理念是让开发者能够快速集成一个…

    2026年5月10日
    000
  • HTML框架嵌入漏洞怎么扫描_HTML框架嵌入漏洞使用安全工具扫描详细步骤

    HTML框架嵌入漏洞的扫描核心是利用OWASP ZAP、Burp Suite等工具,通过代理捕获流量并进行主动或被动扫描,检测响应头中是否缺失X-Frame-Options或Content-Security-Policy的frame-ancestors指令,并分析HTML中是否存在可被利用的等标签,…

    2026年5月10日
    100
  • 解决Bootstrap按钮间非预期空白间距的专业指南

    在bootstrap布局中,并排按钮之间出现无法通过常规css检查工具定位的空白间距,通常并非css样式问题,而是html源代码中元素间的换行符或空格所导致。这些空白符被浏览器解析为单个空格,进而创建了视觉上的间距。 理解问题根源:HTML空白字符的处理 当HTML元素(尤其是display: in…

    2026年5月10日
    000
  • JavaScript中大规模动态按钮状态管理与事件委托最佳实践

    本文深入探讨了在JavaScript中高效管理大量动态按钮状态的方法。通过优化HTML结构、利用模板字面量进行动态DOM生成,并结合事件委托机制,实现了对按钮点击事件的集中处理和状态更新,有效解决了大规模交互元素(如数百个像素按钮)的性能和维护难题。教程将详细介绍如何通过CSS类控制按钮外观,并同步…

    2026年5月10日
    000
  • 如何爬取html5_html5页面爬取技巧方法【数据采集】

    针对HTML5页面结构化数据提取,应采用五类方法:一、用BeautifulSoup4+html5lib精准解析宽松语法;二、用Playwright/Selenium处理JS动态渲染;三、用语义化CSS选择器提升鲁棒性;四、提取JSON-LD/microdata等嵌入元数据;五、模拟设备环境应对响应式…

    2026年5月10日
    000
  • 保护地图瓦片API密钥:基于Laravel的服务器端代理实现

    在使用Leaflet等前端地图库集成Breezometer等需要API密钥的瓦片地图服务时,直接在客户端暴露密钥存在安全风险。本教程将详细介绍如何通过在Laravel应用中构建一个服务器端代理服务来安全地隐藏API密钥。该代理负责接收前端请求,在服务器端添加密钥后转发请求获取瓦片数据,再将其返回给客…

    2026年5月10日
    000
  • 为什么使用getUserMedia访问多个摄像头时,最后一个摄像头总是报错?

    使用getUserMedia访问多个摄像头:解决最后一个摄像头报错的问题 在使用navigator.mediaDevices.getUserMedia访问多个摄像头时,开发者经常会遇到问题,例如最后一个摄像头报错:“DOMException: Could not start video source…

    2026年5月10日
    200
  • 为什么代码在本地运行正常却在打包时出错?如何解决?

    开发难题:本地运行正常,打包却出错 很多开发者都遇到过这样的情况:代码在本地环境运行完美无缺,但打包后却出现各种错误。本文将分析此类问题,并提供一种可能的解决方案。 问题现象 本地测试一切正常,但打包过程却报错。这种现象令人费解,因为同样的代码,在不同环境下表现截然不同。 原因分析及解决方法 经排查…

    2026年5月10日
    100
  • C++异常安全模式 错误恢复策略设计

    异常安全编程需遵循三个保证级别:基本保证、强保证和不抛异常保证。通过RAII管理资源,确保异常时资源释放;使用复制再交换模式实现强异常安全;结合局部恢复、状态回滚等策略设计错误恢复机制,确保程序在异常发生时状态一致且不泄漏资源。 在C++中进行异常安全编程,核心目标是确保程序在发生异常时仍能保持对象…

    2026年5月10日
    000
  • 正则表达式匹配行首或字符集:Golang 教程

    本文旨在解决正则表达式匹配行首或特定字符集的问题,并提供 Golang 语言的实现方案。通过使用选择分支和精简字符集,可以构建更简洁、高效的正则表达式,同时避免不必要的转义,提高代码可读性。本文提供了一个经过优化的正则表达式,可用于检测以 `MYNAME` 开头的行,或以特定字符集后跟 `MYNAM…

    2026年5月10日
    000
  • 使用 Go 发送带有嵌套参数的 POST 请求

    本文旨在帮助 Go 语言初学者理解如何发送带有嵌套参数的 POST 请求。由于 HTTP 协议本身不支持参数嵌套,我们需要通过特定的编码方式来模拟这种结构。本文将介绍如何在 Go 中处理这种情况,并提供示例代码和注意事项。 在 Go 中,net/http 包提供了发送 HTTP 请求的功能。http…

    2026年5月10日
    000

发表回复

登录后才能评论
关注微信