Go Testify学习与使用
文章目录
- 1. **安装 Testify**
- 2. **Testify 的主要功能**
- 3. **Testify 使用示例**
- 3.1 断言 (Assertions)
- 3.2 使用 `require`
- 3.3 使用 Mock
- 3.4 测试套件 (Test Suites)
- 4. **Testify 的其他功能**
- 5. **总结**
- 常用资源
Testify 是 Go 语言中一个常用的单元测试库,它为标准的
testing 包提供了更多高级功能,如断言、测试套件、mock 等。
Testify 简化了单元测试的编写和运行,使得测试代码更简洁、可读性更强。
1. 安装 Testify
可以通过以下命令来安装 testify:
go get github.com/stretchr/testify
2. Testify 的主要功能
Testify 的主要功能模块包括:
- 断言 (Assertions):提供丰富的断言函数,帮助验证测试结果是否符合预期。
- 测试套件 (Test Suites):支持将相关的测试组织成一个测试套件。
- Mock:提供 Mock 功能,便于模拟依赖。
3. Testify 使用示例
3.1 断言 (Assertions)
Testify 的断言模块简化了验证测试结果的过程,提供了许多常用的断言方法。例如,Equal、NotNil、True 等。
package mainimport ("testing""github.com/stretchr/testify/assert"
)func TestSum(t *testing.T) {// 实际测试代码sum := 2 + 3// 使用 testify 的断言函数assert.Equal(t, 5, sum, "2 + 3 should equal 5")assert.NotEqual(t, 4, sum, "Sum should not be 4")
}func TestString(t *testing.T) {str := "Hello, Testify"assert.Contains(t, str, "Testify", "String should contain 'Testify'")
}
assert 包含了丰富的断言函数,以下是一些常用的断言:
assert.Equal(t, expected, actual):断言两个值相等。assert.NotEqual(t, expected, actual):断言两个值不相等。assert.Nil(t, obj):断言对象为nil。assert.NotNil(t, obj):断言对象不为nil。assert.True(t, condition):断言条件为true。assert.False(t, condition):断言条件为false。assert.Contains(t, haystack, needle):断言字符串或 slice 中包含某个元素。
3.2 使用 require
require 和 assert 类似,但区别在于:require 会在断言失败时直接终止测试,而 assert 会继续执行测试。
package mainimport ("testing""github.com/stretchr/testify/require"
)func TestDivision(t *testing.T) {num := 10denom := 0// 如果断言失败,测试将直接终止require.NotEqual(t, denom, 0, "Denominator should not be zero")result := num / denomrequire.Equal(t, 0, result)
}
3.3 使用 Mock
Testify 提供了简单的 mock 库,可以模拟依赖关系中的方法或接口,帮助测试代码中的外部依赖(如数据库、API 调用等)。
创建 Mock 对象:
package mainimport ("testing""github.com/stretchr/testify/assert""github.com/stretchr/testify/mock"
)// 定义一个接口
type MyService interface {GetData(id int) string
}// 定义一个 Mock 结构体,继承 testify 的 mock.Mock
type MockService struct {mock.Mock
}// 实现 MyService 接口的方法
func (m *MockService) GetData(id int) string {args := m.Called(id)return args.String(0)
}func TestMyService(t *testing.T) {// 创建 Mock 对象mockService := new(MockService)// 设置期望值mockService.On("GetData", 1).Return("Mocked Data")// 调用方法result := mockService.GetData(1)// 验证返回值assert.Equal(t, "Mocked Data", result)// 验证预期的调用是否发生mockService.AssertExpectations(t)
}
在上述例子中,MockService 继承了 testify/mock,并且我们为 GetData 方法设置了预期的输入和输出。当测试中调用这个方法时,它返回的值将是我们事先定义的“Mocked Data”。
3.4 测试套件 (Test Suites)
Testify 还提供了 suite 模块,允许将多个相关的测试组织成一个测试套件,并提供了 Setup 和 Teardown 方法,用于在测试之前或之后执行一些通用的初始化或清理工作。
package mainimport ("testing""github.com/stretchr/testify/assert""github.com/stretchr/testify/suite"
)// 定义一个测试套件
type MyTestSuite struct {suite.Suitevalue int
}// 初始化测试套件
func (suite *MyTestSuite) SetupTest() {suite.value = 10
}// 编写测试
func (suite *MyTestSuite) TestAddition() {result := suite.value + 5assert.Equal(suite.T(), 15, result)
}// 清理工作
func (suite *MyTestSuite) TearDownTest() {suite.value = 0
}// 运行测试套件
func TestMyTestSuite(t *testing.T) {suite.Run(t, new(MyTestSuite))
}
4. Testify 的其他功能
- 捕获日志输出:Testify 允许在测试中捕获日志输出。
- 调用次数验证:通过
mock库可以验证 mock 方法的调用次数。
mockService.AssertCalled(t, "GetData", 1) // 验证 GetData 方法是否被调用
mockService.AssertNumberOfCalls(t, "GetData", 1) // 验证 GetData 方法被调用了 1 次
5. 总结
Testify 是一个强大的 Go 语言单元测试库,它提供了丰富的断言功能、mock 机制和测试套件管理工具,使得编写测试更加容易和规范。常见的使用场景包括:
- 断言(
assert和require)用来验证测试结果。 mock用来模拟外部依赖。suite用来组织测试套件并执行初始化和清理操作。
通过这些功能,Testify 极大地提高了测试代码的可维护性和可读性。
常用资源
- Testify 官方文档:[https://github.com/stretchr/testify](
相关文章:
Go Testify学习与使用
文章目录 1. **安装 Testify**2. **Testify 的主要功能**3. **Testify 使用示例**3.1 断言 (Assertions)3.2 使用 require3.3 使用 Mock3.4 测试套件 (Test Suites) 4. **Testify 的其他功能**5. **总结**常用资源 Testify 是 Go 语言中一个常用的单元测试库,它为标…...
Word中引用参考文献和公式编号的方法
文章目录 应用参考文献对于单个文献引用多于多个文献同时引用 公式编号手动编号自动编号 参考: 应用参考文献 对于单个文献引用 word中的参考文献用交叉应用实现。 首先,将参考文献编号: 然后,在需要引用的地方用交叉引用插入…...
[数据集][目标检测]智慧养殖场肉鸡目标检测数据集VOC+YOLO格式3548张1类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):3548 标注数量(xml文件个数):3548 标注数量(txt文件个数):3548 标注…...
Vision Transform—用于大规模图像分类的Transformers架构
VIT — 用于大规模图像识别的 Transformer 论文题目:AN IMAGE IS WORTH 16X16 WORDS:TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE。 官方代码:https://github.com/google-research/vision_transformer 引言与概述 Vision Transformer(ViT&…...
内核驱动开发之系统移植
系统移植 系统移植:定制linux操作系统 系统移植是驱动开发的前导,驱动开发是系统运行起来之后,在内核中新增一些子功能而已 系统移植就四个部分: 交叉编译环境搭建好bootloader的选择和移植:BootLoader有一些很成熟…...
前端在网络安全攻击问题上能做什么?
前端在Web网络安全攻击问题上扮演着至关重要的角色,可以通过多种措施来增强Web应用的安全性。以下是前端在应对Web网络安全攻击时可以采取的具体行动: 1. 输入验证和过滤 严格验证用户输入:前端应对所有用户输入进行严格的验证,…...
IntelliJ IDEA 创建 HTML 项目教程
传送门 IntelliJ IDEA 是 JetBrains 提供的一款强大且多功能的集成开发环境(IDE),不仅可以用于 Java 开发,还支持多种其他编程语言和技术,包括 HTML、CSS 和 JavaScript 等前端开发工具。本文将带你逐步了解如何使用 IntelliJ IDEA 创建一个 HTML 项目,并配置适合前端开…...
YOLOv9改进系列,YOLOv9主干网络替换为RepViT (CVPR 2024,清华提出,独家首发),助力涨点
摘要 轻量级视觉变换器(ViTs)在资源受限的移动设备上表现出优越的性能和较低的延迟,相比之下轻量级卷积神经网络(CNNs)稍显逊色。研究人员发现了许多轻量级 ViTs 和轻量级 CNNs 之间的结构联系。然而,它们在块结构、宏观和微观设计上的显著架构差异尚未得到充分研究。在…...
VBS学习1 - 语法、内置函数、内置对象
文章目录 概述执行脚本语法转义字符文本弹框msgbx定义变量dim(普通类型)定义接收对象set字符拼接&用户自定义输入框inputbox以及输入判断ifelse数组(参数表最大索引,非数组容量)有容量无元素基于元素确定容量 循环…...
11 vue3之插槽全家桶
插槽就是子组件中的提供给父组件使用的一个占位符,用<slot></slot> 表示,父组件可以在这个占位符中填充任何模板代码,如 HTML、组件等,填充的内容会替换子组件的<slot></slot>标签。 匿名插槽 1.在子组…...
Excel 基础知识-操作手册1
Excel基础操作知识 一、工作窗口的视图控制 1、创建新窗口:依次点击【视图】----【新建窗口】命令,即可为当前工作簿创建新的窗口。在原有的工作簿中更改标题或表格内容时,新建的工作簿也会相应的更改。 2、窗口切换:在【视图】…...
Python 类的继承
Python 的代码组织如下: moudle:模块,和实例名和函数都是小写加下划线的方法表示。 class:类,使用首字母大写驼峰的写法表示。 类里面包含类的属性,__init__ ()方法和类的方法。 __init__() 方法在类的创建…...
gRPC介绍
gRPC 是一个由谷歌开发的现代开源高性能 RPC 远程过程调用( Remote Procedure Calls)框架,具备良好的兼容性,可在多个开发环境下运行。 相较于目前主流的 HTTP API 接口,gRPC 接口采用了领先的 HTTP/2 底层架构设计作…...
Git之误执行git rm -r解决方案(六十七)
简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【…...
html文件指什么
HTML 文件指的是超文本标记语言文件(HTML,HyperText Markup Language),它是用于构建网页内容的文件格式。HTML 文件包含一系列的标签(tags),这些标签用于定义网页的结构和元素,例如文…...
AAAI2024--频谱在多模态表示和融合中的作用更为有效:A Multimodal Spectrum Rumor Detector
https://github.com/dm4m/FSRU 多模态内容,如将文本与图像混合,对社交媒体中的谣言检测提出了重大挑战。现有的多模态谣言检测侧重于在空间和序列位置之间混合令牌进行单模态表示,或者在模态间融合谣言真实性的线索。然而,它们受…...
【Python报错已解决】SyntaxError invalid syntax
🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 专栏介绍 在软件开发和日常使用中,BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…...
CI/CD持续集成和持续部署以及相关软件的使用
目录 一:CI/CD是什么? 1.1 持续集成(Continuous Integration) 1.2 持续部署(Continuous Deployment) 1.3 持续交付(Continuous Delivery) CI/CD 的好处包括: 二:git…...
Charles mac电脑配置
安装 Charles: 如果你还没有安装 Charles,可以从官方网站下载安装包并按照提示完成安装。 启动 Charles: 安装完成后,启动 Charles 应用程序。 设置 Charles 代理: Charles 默认的代理端口是 8888。你可以通过以下步…...
FPGA基本结构和简单原理
前言: FPGA全程为(Field Programmable Gate Array)现场可编程逻辑阵列,以基本的逻辑为主可以实现大多数芯片可以实现的功能,比如说:ASIC芯片等,在半导体领域有着重要的作用。 本文…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...
