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