Golang HTTP超时测试未按预期触发,应如何排查?
问题根因
- 最核心的问题是你构造的请求没有指向本地启动的测试服务地址。你通过
createMyRequest生成的请求默认使用的是业务逻辑里配置的正式接口地址,请求根本没有发送到你写的会Sleep 15秒的httptest服务上,而是直接访问了正常响应的接口,自然不会触发超时,也不会有等待逻辑。 - 次要问题是你遗漏了
createMyRequest的错误处理,你拿到返回的err后没有做判断就直接往下执行,如果构造请求阶段就出错,后续逻辑也会出现非预期结果。
修正方案
你需要把构造出来的请求的地址替换成测试服务的ts.URL,同时补充错误处理、超时结果校验逻辑,修正后的代码示例如下:
func TestTimeout(t *testing.T) { ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { time.Sleep(time.Second * 15) })) defer ts.Close() client := &http.Client{ Timeout: time.Second * 10, } myRequest, err := createMyRequest(Somedata, SomeMoreData) // 补充请求构造错误处理 if err != nil { t.Fatalf("create request failed: %v", err) } // 替换请求地址为测试服务地址 parsedTestURL, err := url.Parse(ts.URL) if err != nil { t.Fatalf("parse test server url failed: %v", err) } myRequest.URL.Scheme = parsedTestURL.Scheme myRequest.URL.Host = parsedTestURL.Host res, err := client.Do(myRequest) // 预期会返回超时错误,没有错误反而属于测试不通过 if err == nil { res.Body.Close() t.Fatal("expected timeout error, got nil") } // 可选补充:校验错误类型确实是超时错误 if !strings.Contains(err.Error(), "context deadline exceeded") { t.Fatalf("expected timeout error, got %v", err) } }
内容的提问来源于stack exchange,提问作者TypeScriptProgrammer1234
相关产品推荐
相关产品推荐

