Go集成测试需用真实依赖(如SQLite、Redis)并可控重置状态,通过子测试隔离场景,注重日志与显式断言,支持CI环境且用-tags控制运行。

在 Go 中做集成测试,核心是让多个模块(比如 HTTP handler、数据库访问层、外部服务客户端)在接近真实环境的条件下协作运行,验证它们之间的交互逻辑是否正确。重点不是单个函数的内部逻辑(那是单元测试的事),而是“组合起来能不能跑通”。
用真实依赖代替 mock,但要可控
集成测试应尽量使用真实的依赖组件,比如真正的 SQLite 文件、本地启动的 Redis 实例、或轻量 HTTP 服务,但必须确保每次测试前可重置状态。例如:
- 数据库测试前清空表或使用临时数据库文件(
sqlite://file:test.db?mode=memory&cache=shared) - HTTP 服务依赖可用
httptest.NewUnstartedServer启动真实 handler,再手动控制启停 - 避免硬编码端口,用
port := freeport.Get()(配合github.com/mafredri/cdp或简单 net.Listen 获取空闲端口)
组织测试代码:用子测试 + setup 函数隔离场景
一个集成测试文件通常对应一个业务流程(如“用户注册并触发邮件通知”),用 t.Run 拆分子场景,每个子测试有独立 setup 和 teardown:
- setup 阶段初始化 DB 连接、启动 mock 外部服务(如用
gock拦截 HTTP 请求并返回预设响应)、插入测试数据 - teardown 阶段关闭连接、清理临时文件、重置 gock 拦截器
- 避免测试间共享状态,不依赖执行顺序
关注可观测性:日志 + 显式断言
集成测试失败时很难定位问题,所以要在关键路径加调试日志(用 t.Log),并在每一步后做明确断言:
立即学习“go语言免费学习笔记(深入)”;
运行与 CI 友好:用标志控制资源启动
本地开发时可自动拉起依赖,CI 环境则需适配(如 GitHub Actions 提前启动 PostgreSQL 容器)。推荐用 -short 跳过耗时集成测试,或自定义 flag:
go test -tags=integration ./...
并在测试文件开头加 //go:build integration,配合 go test -tags=integration 精确运行。










