Go接口测试关键在于用httptest.Server验证真实HTTP流程或httptest.NewRequest+Recorder快速测handler逻辑,结合依赖注入与窄接口抽象外部依赖。
Go 的接口测试不需要框架也能做得很扎实,关键在于理解 http.HandlerFunc 和依赖注入的边界——测试时替换的是「行为」,不是「类型」。
用 httptest.Server 测试真实 HTTP 流程
当你要验证中间件顺序、状态码、响应头或请求体解析逻辑时,httptest.Server 是最贴近生产环境的选择。它启动一个真实监听的本地服务器,但不占端口(自动分配空闲端口)。
常见错误是直接传 nil 给 http.ListenAndServe 做测试,这会阻塞主线程且无法控制生命周期。
- 始终用
httptest.NewServer包裹你的http.Handler,别自己调ListenAndServe - 记得在测试末尾调用
server.Close(),否则 goroutine 泄漏 - 如果 handler 依赖外部服务(如数据库),先用依赖注入把 client 替换为 mock,再传给 handler 构造函数
func TestUserCreate(t *testing.T) {
mockDB := &MockUserDB{}
handler := NewUserHandler(mockDB) // 依赖注入 DB client
server := httptest.NewServer(handler)
defer server.Close()
resp, _ := http.Post(server.URL+"/users", "application/json", strings.NewReader(`{"name":"a"}`))
if resp.StatusCode != http.StatusCreated {
t.Errorf("expected 201, got %d", resp.StatusCode)
}
}
用 httptest.NewRequest + httptest.NewRecorder 测试单个 handler 函数
适合快速验证路由匹配、参数解析、业务逻辑分支。不走网络栈,快且可控,但绕过了中间件和 net/http 的实际分发逻辑。
容易踩的坑是忘记设置 Request.Body 或没重置 ContentLength,导致 json.Decode 读不到数据。