在写自己项目和公司项目里面都没实际编写过单元测试, 即使要也是使用AI自动编写, 说实在的, AI编写单元测试真是一把好手. 这个文章只是梳理一下go单元测试的各种库, 以便后续需要手动编写时候能快速找到对应的库.
基础测试用例(Unit Test)
- 核心:通过编写原生代码调用目标函数,验证返回结果是否与预期一致、执行是否报错。
- Go 原生支持:使用
testing包,函数名以Test开头,通过t.Error/t.Errorf标记失败。
Fuzz 测试(模糊测试)
- 核心:测试鲁棒性(Robustness),通过自动生成随机 / 边界输入(如异常字符串、超大整数),发现函数可能的崩溃、 panic 或逻辑漏洞。
- Go 原生支持:1.18+ 版本内置,函数名以
Fuzz开头。
go-sqlmock
- 核心:模拟数据库交互,无需真实数据库连接。验证执行的 SQL 语句(如查询 / 更新语法、参数)和预期响应(如模拟返回的行数据、影响行数)是否匹配。
- 用途:隔离数据库依赖,快速测试数据访问层代码。
gomonkey
- 核心:函数 / 方法打桩(Stub)工具,可在运行时替换函数实现(包括全局函数、成员方法,全局变量)。
- 用途:隔离外部依赖(如替换网络调用、文件 I/O),让测试不依赖真实环境。
Ginkgo
- 核心:BDD(行为驱动开发)风格的测试框架,提供更语义化的测试组织方式(如
Describe/Context/It结构),搭配Gomega断言库使用。 - 优势:测试用例更易读、易维护,适合复杂业务逻辑的测试组织。
Goconvey
同上
gomock
- 核心:Go 官方维护的 Mock 框架,根据
interface自动生成 Mock 实现类。可在测试中设置预期的方法调用(如参数匹配、调用次数),并返回指定结果。 - 用途:解耦依赖的 interface,验证代码是否正确调用了依赖的方法。
Testify
各大测试库几乎都会引用, 包含很多包, 其中 assert最为常用, 更多包查看: https://github.com/stretchr/testify
注意事项
http框架中, 应当分为handle service repository三层, 其中repo层应当有 interface.go 用于标记数据库操作需要实现的函数. 以便切换数据库和单元测试时方便go-sqlmock / 手动实现接口. 还方便 handle 和 service 层调用时 gomock 自动生成