You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 12:45:04