Go测试HTTP客户端核心是替换Transport用自定义RoundTripper拦截请求或用httptest.Server启本地服务;前者适合单元测试验证请求构造与响应处理,后者适合集成测试验证重试、超时等完整行为;需检查请求细节并覆盖500/404/timeout等错误路径。

在 Go 中测试 HTTP 客户端,核心是**替换默认的 http.Client.Transport,用自定义的 RoundTripper 拦截请求、返回预设响应**,从而避免真实网络调用,确保测试稳定、快速、可重复。
使用 httptest.Server 构建真实但本地的测试服务
适合需要验证客户端完整行为(如重试、超时、重定向)或集成测试场景。它启动一个轻量 HTTP 服务器,完全模拟真实后端。
- 用
httptest.NewServer创建带路由的临时服务,返回你控制的响应(JSON、状态码、Header 等) - 将客户端配置为请求该
server.URL,而非生产地址 - 测试结束后调用
server.Close()释放端口
示例:客户端调用 GET /users/123,测试服务返回 {"id":123,"name":"test"},再断言结构体字段是否正确解析。
用 httpmock 或自定义 RoundTripper 模拟单次请求响应
适合单元测试——不关心服务端逻辑,只关注客户端如何构造请求、处理响应、触发错误分支。
立即学习“go语言免费学习笔记(深入)”;
- 推荐 httpmock 库:简洁易用,支持按 method + URL 匹配,可注册多个响应,自动校验是否所有 mock 被调用
- 手动实现
RoundTripper:实现RoundTrip(*http.Request) (*http.Response, error)方法,返回io.NopCloser包裹的响应体和固定状态码 - 注意设置
Client.Transport并在测试后恢复(或用 defer 重置),避免污染其他测试
验证请求是否符合预期(不只是响应)
测试不仅要检查“返回了什么”,还要确认“发出了什么”——比如 Header 是否携带 token、Query 参数是否拼接正确、Body 是否 JSON 序列化无误。
- 在 mock 的
RoundTrip或 httpmock 的 handler 中,直接读取传入的*http.Request - 检查
req.Method、req.URL.Path、req.Header.Get("Authorization")、req.FormValue("page")等 - 对 JSON Body,可用
json.NewDecoder(req.Body).Decode(&v)解析后断言字段值
覆盖错误路径:网络失败、超时、非 2xx 响应
真实客户端必须健壮处理各种失败情况,测试需主动模拟这些边界条件。
- mock 返回
status=500或status=404,验证错误解析逻辑(如反序列化 error 字段) - 让 mock 的
RoundTrip直接返回nil, errors.New("timeout"),测试超时错误是否被正确传播 - 设置
http.Client.Timeout为极小值(如 1ms),配合真实httptest.Server触发超时,验证重试或降级逻辑










