时间:2026-01-03 20:55
人气:
作者:admin
本文主要针对golang语言的单元测试工具,博客内容也会涉及一些单元相关的内容
什么是单元测试:单元测试是软件测试体系中最基础、最核心的测试类型,它聚焦于对软件系统中最小的 “可测试单元” 进行独立验证,确保该单元的功能符合预期设计。
简单描述下前因后果:工作需要对项目代码系统化执行单元测试,要求覆盖率达到95%以上,因为不同人的开发风格和代码习惯,外加项目框架和架构的一些要求。单元测试,这个东西一般情况都会让人很痛苦,至于因为啥,我相信看到我这篇博客的各位,都是有不同程度的感同身受的,我这里介绍三种单测工具,基础的单元测试书写和使用就不过多赘述了。
注意:这块作为扩展,如需直接了解工具可忽略这部分
单元测试的实现方式可从核心分类维度展开,结合具体落地实践和技术选型,不同方式适用于不同场景和项目规模。
(核心流程维度)
从开发流程角度区分的两种核心方式,决定了单元测试与业务代码的协作关系。
(传统方式,最常用)
(TDD,Test-Driven Development,进阶方式)
(技术实现维度)
这是单元测试落地的核心技术维度,决定了如何隔离外部依赖,保证测试的独立性。
(主流方式)
核心定义:当被测单元依赖外部资源(数据库、RPC 服务、HTTP 接口、文件系统等)时,通过 ** 模拟(Mock)或桩(Stub)** 实现替代真实依赖,预设返回值或行为,从而脱离外部环境限制,专注测试业务逻辑。
Mock vs Stub 区别(通俗理解):
| 类型 | 核心特征 | 适用场景 |
|---|---|---|
| Stub | 仅预设固定返回值,无行为验证 | 只需依赖返回值完成业务逻辑测试 |
| Mock | 不仅预设返回值,还可验证依赖方法是否被调用、调用次数、参数是否正确 | 需要验证业务逻辑对依赖的调用行为 |
实现方式:
UserDB接口的MockUserDB,预设返回值;gomock+mockgen、Java 生态的Mockito、Python 生态的unittest.mock,可根据接口自动生成 Mock 代码,支持更灵活的行为验证。优势:测试独立、快速、可复现,不受外部资源状态影响,能覆盖各种异常场景(如依赖服务报错、超时)。
Go 语言工具示例(gomock):
(1)先安装工具:
go get github.com/golang/mock/gomock
go install github.com/golang/mock/mockgen@latest
(2)自动生成 Mock 代码,无需手动编写,支持验证调用行为。
(小众场景)
上面的描述是大模型系统化生成的内容,下面是博主自行整理的,至于为什么会有这样一段赘述,是和下面的工具有些关联
先开发业务代码,后写单元测试代码(常用)
interface单元测试
核心优势:
缺点:
总结:
如果代码开发的时候考虑到需要进行单元测试功能开发,可以直接在业务功能开发时进行单元测试的预先埋点处理,做好接口的开发,不过一般情况下大家的开发习惯都不会考虑单元测试这种情况,这时候在想要回去处理单元测试,interface这种方式就会极为麻烦和笨重,单测时间成本成指数级增长。
使用单元测试工具
内置核心工具:testing包(基础基石)
工具包(具体使用方法和功能下面介绍)
优点:
在业务逻辑代码开发完成后几乎可以不调整原始逻辑代码进行单元测试代码开发
先开发单元测试代码,后写逻辑代码(很少见,不介绍)
go test -v
运行当前包下单元测试;-v 打印详细日志
go test -run "^$"
运行单元测试函数
go test -v 文件名_test.go 业务文件.go
运行单文件单元测试函数
go test ./...
运行整个目录的单元测试文件,包括子目录下的单元测试文件
go test -cover
覆盖率统计
go test ./... -cover
整个目录覆盖率统计,包括子目录
go test -coverprofile=cover.out
当前目录,执行测试 + 生成覆盖率统计的【原始数据文件】cover.out (核心基础,必须先执行)
go tool cover -func=cover.out
当前目录,以【纯文本、按函数】展示覆盖率详情(终端直接看,快速统计)
go tool cover -html=cover.out -o cover.html
当前目录,生成【可视化HTML报告文件】cover.html(最实用,精准看哪行代码未覆盖)
go test -coverprofile=cover.out ./...
整个目录操作,包括子目录
go test -run "^$" -gcflags=all=-l
-gcflags=all=-l 禁用所有包的内联优化,gomonkey官方推荐的打桩必须使用,不过这个和覆盖率-cover参数有冲突,推荐覆盖率计算和单测执行分开使用
go test -run "^$" -cover -gcflags=all=-l -covermode=atomic
-covermode=atomic 可以强制禁用内内联优化和执行覆盖率,不过有时不会生效
主要介绍三个工具:httptest、go-sqlmock、gomonkey