使用 net/http/httptest 可在 golang 中模拟 HTTP 请求进行测试。通过 httptest.NewServer 可创建临时服务器模拟 API 行为,如返回 jsON 数据;测试自定义处理器时,可用 httptest.NewRequest 构造请求,httptest.NewRecorder 记录响应,验证状态码与响应体;还可构造含查询参数、请求头、cookie 的请求,确保处理器正确解析输入。该方法避免真实网络依赖,提升测试稳定性与速度。

在golang中模拟HTTP请求进行测试,核心方法是使用 net/http/httptest 包。它允许你创建虚拟的HTTP服务器和请求,无需真正发起网络调用,既能保证测试的稳定性,又能提高执行速度。
使用 httptest 创建测试服务器
通过 httptest.NewServer 可以启动一个临时的HTTP服务,用于模拟外部API或内部路由的行为。
示例:模拟一个返回json的API:
func TestAPICall(t *testing.T) { // 定义测试用的处理器 server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusOK) fmt.Fprintln(w, `{"message": "hello"}`) })) defer server.Close() // 使用 server.URL 作为目标地址发起请求 resp, err := http.Get(server.URL) if err != nil { t.Fatal(err) } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { t.Errorf("期望状态码 200,实际得到 %d", resp.StatusCode) } body, _ := io.ReadAll(resp.Body) if !strings.Contains(string(body), "hello") { t.Errorf("响应体不包含预期内容") } }
测试自定义的 HTTP 处理器
如果要测试的是你写的 http.HandlerFunc,可以直接用 httptest.NewRequest 和 httptest.NewRecorder 模拟请求和记录响应。
立即学习“go语言免费学习笔记(深入)”;
示例:测试一个简单的处理函数:
func helloHandler(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) fmt.Fprintln(w, "Hello, World!") } func TestHelloHandler(t *testing.T) { req := httptest.NewRequest("GET", "/hello", nil) recorder := httptest.NewRecorder() helloHandler(recorder, req) if recorder.Code != http.StatusOK { t.Errorf("期望状态码 200,实际得到 %d", recorder.Code) } expected := "Hello, World!n" if recorder.Body.String() != expected { t.Errorf("响应体不符,期望 %q,实际 %q", expected, recorder.Body.String()) } }
模拟带参数或头信息的请求
你可以构造带有查询参数、请求头、Cookie等的请求来更真实地模拟客户端行为。
例如:
req := httptest.NewRequest("POST", "/submit", strings.NewReader("name=alice")) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") req.AddCookie(&http.Cookie{Name: "session_id", Value: "12345"}) recorder := httptest.NewRecorder() yourHandler(recorder, req)
这样可以验证你的处理器是否正确解析了表单、读取了Cookie或校验了请求头。
基本上就这些。利用 httptest,你可以完全控制请求输入和响应输出,写出稳定、可重复的HTTP层测试。关键是避免依赖真实网络,把外部影响降到最低。


