Fiber单元测试必须使用app.Test()方法,禁用http.Get和真实服务器;需先初始化app并注册路由与中间件,再用http.NewRequest构造请求、设置Content-Type等头信息,最后断言状态码和响应体。

直接用 app.Test(),别启 HTTP 服务,也别用 http.Get。这是 Fiber 官方唯一推荐、开箱即用、零网络依赖的单元测试方式。它把请求塞进内存处理链,返回标准 *http.Response,状态码、响应体、头信息全可断言——快、稳、干净。
为什么不能用 app.Listen() + http.Get
启动真实服务测接口看着直观,实际是给自己埋雷:
- 端口冲突:CI 并行跑多个测试时,
:3000很可能已被占用,报listen tcp :3000: bind: address already in use - 竞态难控:
app.Listen()是阻塞调用,你得另起 goroutine +time.Sleep或sync.WaitGroup等服务就绪,但无法 100% 保证“已 ready 就发请求”,容易触发connection refused - 资源不释放:每个测试都要选空闲端口、手动
app.Shutdown()、等 TIME_WAIT 清理,本地反复运行容易卡死 - 中间件失效:没显式
app.Use()的 logger/recover/auth,在真实服务里可能被漏掉,导致测试和线上行为不一致
app.Test() 必须传什么、怎么构造请求
它只认 *http.Request,不能传 URL 字符串或 map。必须用 http.NewRequest() 构造,且细节要对齐 handler 的预期:
- GET 带参数:路径里写
/user?id=123,否则c.Query("id")拿不到值 - POST/PUT 带 JSON:先
jsonBytes, _ := json.Marshal(reqBody),再req.Body = io.NopCloser(bytes.NewReader(jsonBytes)),再req.Header.Set("Content-Type", "application/json") - 带 token 的请求:
req.Header.Set("Authorization", "Bearer xxx"),不然鉴权中间件直接 401 - 超时设为 -1:
app.Test(req, -1)禁用超时,避免测试因默认 1 秒超时而偶发失败
测试中间件和错误场景的关键点
app.Test() 能完整走通中间件链,但前提是它们已在测试前注册。常见漏点:
- 401/403 测试:构造无 header 或错 token 的
req,断言resp.StatusCode == 401,而不是看到 200 就以为过 - panic 恢复测试:在 handler 里写
panic("test panic"),确认 recover 中间件生效并返回 500(不是崩溃) - 路由未注册导致 404:检查测试 setup 是否调用了
setupRoutes(app),Fiber 不会自动扫描函数 - 数据库连接/协程泄漏:
app.Test()不触发app.Shutdown(),若 handler 里开了 goroutine 或复用全局 db 连接,需在t.Cleanup()里手动关
最常被忽略的是:handler 里调用 c.Status(400) 不会写响应体,只改状态码;测试时如果只读 resp.StatusCode 就完事,可能掩盖了实际没返回错误信息的问题。真要验证,得 io.ReadAll(resp.Body) 看内容是否符合预期。


















