httptest.NewServer 是唯一可靠选择,它启动真实监听的临时服务(如 http://127.0.0.1:56789)以验证客户端重定向、Header 透传、Cookie 等行为;必须显式调用 server.Close() 防端口泄漏,禁用 CloseNow(),且不可在 TestMain 中全局复用。

用 httptest.NewServer 模拟真实 HTTP 环境
需要验证客户端行为(如重定向、Header 透传、Cookie 处理)时,httptest.NewServer 是唯一可靠选择。它启动一个真实监听的临时服务,地址形如 http://127.0.0.1:56789。
常见错误:忘记调用 server.Close(),导致端口被占用、测试进程残留;或在 defer 中误写成 server.CloseNow()(该方法不等待连接关闭,可能引发 panic)。
- 必须在测试末尾显式调用
server.Close() - 若需复用同一 server 多次,注意其内部 handler 是共享的,状态可能污染后续测试
- 避免在
TestMain中全局复用NewServer,不同测试间无隔离
用 httptest.NewRecorder 测试单个 handler 函数
httptest.NewRecorder 不启网络、不占端口,适合纯逻辑分支验证,比如检查 JSON 返回结构、HTTP 状态码、Header 设置是否正确。
典型坑点:nil 请求直接传给 handler —— 导致 r.URL.Query() 或 r.Body panic;或没设置 Content-Type 就解析 JSON Body。
立即学习“go语言免费学习笔记(深入)”;
Colly 是一个用于 Go 语言的快速开源爬取和爬虫框架。它适用于从简单的页面提取到异步爬虫处理大量页面集合,支持请求回调和结构化解析。
- 务必用
http.NewRequest("GET", "/path", nil)构造请求,不能传nil - POST/PUT 时用
strings.NewReader(`{"key":"val"}`)构造 Body,并设req.Header.Set("Content-Type", "application/json") - handler 接收的是
*http.Request,不是原始字符串,别试图手动 decode Body
go test -p 控制并行度提升测试速度
默认 go test 并行运行测试函数,但实际并发数受 GOMAXPROCS 和测试本身是否调用 t.Parallel() 共同影响。盲目开高并行反而可能因竞争资源(如文件句柄、内存)拖慢整体。
实测发现:本地开发机上设 -p=4 或 -p=8 通常比默认值更稳;CI 环境建议固定为 -p=2 避免资源争抢。
- 只有显式调用
t.Parallel()的测试才会真正并行执行 - 含全局状态(如修改包级变量、打开文件)的测试绝不能加
t.Parallel() - 数据库或文件 I/O 类测试建议单独跑,或用
testify/suite统一 setUp/tearDown
编译缓存与测试构建共用 GOCACHE
go test 默认复用 GOCACHE 中的编译产物,所以首次测试慢,后续极快——前提是没动依赖或 go.mod。但很多人误以为每次都要 clean 缓存,反而拖慢迭代。
容易被忽略的细节:当项目含 cgo 或使用了 -gcflags 等定制编译参数时,缓存 key 会变化,导致无法复用;而 go test -short 与完整测试也走不同缓存路径。
- 查看缓存命中情况:加
-v参数后留意输出中是否有cached字样 - 不要在 Makefile 或 CI 脚本里无脑加
go clean -cache - 跨团队协作时,确保
GOCACHE路径可写且不被 IDE 自动清理(如 VS Code 的 Go 扩展有时会干扰)

















