app.Test() 是唯一推荐的单元测试入口,需先显式注册路由和中间件,正确设置 Content-Type 与 JSON Body,注意资源手动清理及超时控制。

app.Test() 是唯一推荐的单元测试入口,别用 http.Get 或启动真实服务器——它慢、不可靠、难 mock,还违反单元测试隔离原则。
为什么必须先初始化路由和中间件再调用 app.Test()
Fiber 不会自动扫描函数或反射注册路由。测试时若只 fiber.New() 而没执行 setupRoutes(app),所有请求都会 404。
- 确保测试前显式调用路由注册函数,比如
setupRoutes(app) - 如果用了
logger、recovery等中间件,也得在测试前app.Use(),否则行为和线上不一致 - 避免在
main()里直接调用app.Listen()——测试不需要监听端口
POST/PUT 接口测试时 Content-Type 和 Body 怎么设才不解析失败
ctx.BodyParser() 依赖正确的 Content-Type: application/json 头,否则静默返回零值结构体。
- 用
http.NewRequest()构造请求后,必须手动加头:req.Header.Set("Content-Type", "application/json") - Body 必须是
bytes.NewReader(jsonBytes),不能直接传字符串或 map - 结构体字段没加
json:"field"tag 会导致解析失败但无报错——建议测试中先打印string(body)和resp.Status快速定位是路由错、解析错还是逻辑错
app.Test() 不会自动清理 goroutine 和连接池资源
这是最易被忽略的一点:app.Test() 绕过 TCP 层,在内存中模拟请求生命周期,但它不会触发 app.Shutdown()。
- 如果你在 handler 里开了 goroutine、复用了数据库连接池或 Redis client,测试跑完后这些资源不会自动释放
- 要么在每个
TestXxx函数末尾手动清理(如db.Close()),要么用t.Cleanup()注册清理逻辑 - 超时参数
msTimeout默认 1000(1 秒),设为-1可禁用超时,仅限本地调试用


















