Go Testify学习与使用

server/2024/9/24 16:30:05/

文章目录

      • 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 的断言模块简化了验证测试结果的过程,提供了许多常用的断言方法。例如,EqualNotNilTrue 等。

go">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

requireassert 类似,但区别在于:require 会在断言失败时直接终止测试,而 assert 会继续执行测试。

go">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 对象

go">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 模块,允许将多个相关的测试组织成一个测试套件,并提供了 SetupTeardown 方法,用于在测试之前或之后执行一些通用的初始化或清理工作。

go">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 方法的调用次数。
go">mockService.AssertCalled(t, "GetData", 1)         // 验证 GetData 方法是否被调用
mockService.AssertNumberOfCalls(t, "GetData", 1)  // 验证 GetData 方法被调用了 1 次

5. 总结

Testify 是一个强大的 Go 语言单元测试库,它提供了丰富的断言功能、mock 机制和测试套件管理工具,使得编写测试更加容易和规范。常见的使用场景包括:

  • 断言(assertrequire)用来验证测试结果。
  • mock 用来模拟外部依赖。
  • suite 用来组织测试套件并执行初始化和清理操作。

通过这些功能,Testify 极大地提高了测试代码的可维护性和可读性。

常用资源
  • Testify 官方文档:[https://github.com/stretchr/testify](

http://www.ppmy.cn/server/119570.html

相关文章

B站前端错误监控实践

前言 从23年开始,我们团队开始前端错误监控方向的开发。经历了一些列的迭代和发展,从监控SDK、上报、数据治理、看板集成、APM自研可视化初步完成了一条完整且适合B站前端监控。 截止目前(2024.08.01),前端监控在B站85%以上的业务线&#xf…

【Python实战】---- 爬取 CSDN 专栏文章列表

1. 场景 需求就是专栏中文章随着时间写的越多,如果后边需要去查找的时候比较麻烦,比如一些不常用的 git 命令,或者有些开发场景的细节,在之前已经开发完了,现在忘记部分细节,需要在之前的输出文章中去查找,当几十几百篇文章时,查找就比较麻烦,但是如果没发布一篇文章,…

MinIO自动化下载及部署脚本(Windows)

提前准备事项 直接上脚本代码,需要保存为Power shell脚本文件,然后在执行 脚本执行策略 注意:Windows默认是禁止脚本运行的,需要放开一下脚本执行策略 临时更改执行策略(仅对当前会话有效):…

ARM/Linux嵌入式面经(三五):诺瓦星云提前批

文章目录 SPI通信有哪些内核接口回答面试官追问及回答应用层和驱动是怎么交互的回答面试官追问及回答stm32和imx6u有什么区别一、基本概述二、性能与特点三、启动方式四、开发工具与生态系统面试官追问示例通信实时性是通过什么手段去保证的回答面试官追问及回答线程的同步机制…

axios二次封装

axios的使用以及二次封装 一:axios的使用二:vue中的二次封装1.终端下载2.main.js中引入3.封装axios实例--http.js4.添加请求拦截器5.添加响应1拦截器6.封装请求API7.组件内使用 一:axios的使用 1.下载 npm i axios -S2.引入 import axios …

Android 内置应用裁剪

文章目录 查询目标 APK 的 Android.mk(或 Android.bp)文件apk裁剪方式1.注释或删除.mk/.bp文件2.将 APK 名称加入“OVERRIDES”配置项中3.自定义“PRODUCT_PACKAGES_REMOVE”配置项 查询目标 APK 的 Android.mk(或 Android.bp)文件…

后端开发刷题 | 数字字符串转化成IP地址

描述 现在有一个只包含数字的字符串,将该字符串转化成IP地址的形式,返回所有可能的情况。 例如: 给出的字符串为"25525522135", 返回["255.255.22.135", "255.255.221.35"]. (顺序没有关系) 数据范围&…

【Python决策树】ID3方法建立决策树为字典格式,并调用 treelib 显示

首先,我们使用 treelib 库来显示树结构 : ps : 如果 treelib 输出一堆乱码, 可以点进Tree修改 tree.py 大概 930 行左右的部分(去掉encode就行了) if stdout:print(self._reader) # print(self._reader.encode("utf-8"))else:return self._reader将字典…