go fiber单元测试应使用app.test()方法而非http.get或启动真实服务器,需先初始化app并注册路由、中间件,再用http.newrequest构造请求,设置content-type等头信息,最后断言响应状态码和内容。

Go Fiber 应用的单元测试不能靠 http.Get 或启动真实服务器来测——那样慢、不可靠、难 mock,也违背单元测试隔离原则。正确做法是直接调用 app.Test() 方法,传入构造好的 *http.Request,拿到 *http.Response 后断言状态码、响应体等。
用 app.Test() 构造无网络依赖的测试
app.Test() 是 Fiber 官方提供的测试入口,它绕过 TCP 层,直接在内存中模拟 HTTP 请求生命周期。注意它不启动监听端口,也不依赖 net/http/httptest 的 Server。
- 必须传入一个已初始化的
*fiber.App实例(不是新fiber.New()后就立刻测) -
req需用http.NewRequest()构造,路径、方法、Header、Body 都可精确控制 - 超时参数
msTimeout默认为 1000(1 秒),设为-1可禁用超时(仅限本地测试) - 返回的
resp可直接读取resp.StatusCode、io.ReadAll(resp.Body)
测试 GET 接口时常见错误:没调用 app.Get() 就测
新手常把路由注册写在 main() 里,但测试函数中只 new 了 app,没执行 setupRoutes(app),导致请求 404。Fiber 不会自动扫描函数或反射注册路由。
- 确保测试前显式调用路由注册函数,例如
setupRoutes(app) - 避免在
main()中直接app.Listen()—— 测试时不需要启动服务 - 如果用中间件(如
logger、recovery),也要在测试前app.Use(),否则行为不一致
测试带 JSON Body 的 POST 接口要手动设置 Content-Type
Fiber 的 ctx.Body() 和 ctx.JSON() 依赖正确的 Content-Type: application/json 头,否则解析失败或返回空结构体。
- 构造
http.Request时,必须显式调用req.Header.Set("Content-Type", "application/json") - Body 需是
bytes.NewReader()包裹的 JSON 字节流,不能直接传字符串 - 若接口用
ctx.BodyParser(&v),且结构体字段没加json:tag,解析会静默失败(字段保持零值) - 建议在测试中先打印
resp.Status和string(body),快速定位是路由错、解析错还是逻辑错
最易被忽略的是:Fiber 的 app.Test() 不会自动执行 app.Shutdown(),所以如果你在 handler 里开了 goroutine 或复用了全局连接池(比如数据库连接),测试跑完后资源不会自动释放——得手动在 TestXxx 函数末尾清理,或改用 t.Cleanup() 注册释放逻辑。











