go的单元测试

在写自己项目和公司项目里面都没实际编写过单元测试, 即使要也是使用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 自动生成

我来吐槽

*