package web import ( "net/http" "net/http/httptest" "testing" "time" ) // TestKeyPagesRenderFast 是一道**灾难探测器**,不是基准测试。 // // 2026-09-30 踩过一次:给「已并入 / 子段」做的收口写成每行去 entity_raw 取回**整行 Core Data JSON** // 再解析 raw->>'ZMERGEDTO',而 raw 是 TOAST 过的整行——/places 要 70 秒、首页 44 秒才出页面, // 而那批「渲染若干页面」的布局用例因此从 20 秒涨到 300 秒,整套验收从 6 分钟变 20+ 分钟。 // 当时没有任何用例会红:功能全对,只是慢。 // // 所以这里给每个关键页面卡一个**很松**的上限(修好后实测 0.04~1.6 秒,这里卡 10 秒): // 只拦「数量级」的退化,不拦正常的机器抖动。真要做性能基准另说。 func TestKeyPagesRenderFast(t *testing.T) { f := newMovementFixture(t) const budget = 10 * time.Second for _, tg := range []struct { name string url string h http.HandlerFunc }{ {"主页", "/", f.srv.home}, {"统计", "/stats", f.srv.statsPage}, {"地点库", "/places", f.srv.placesPage}, {"报告", "/report", f.srv.reportPage}, {"时间线", "/timeline", f.srv.timelinePage}, {"后台首页", "/admin", f.srv.adminHome}, {"数据编辑", "/admin/edit", f.srv.editPage}, } { start := time.Now() rec := httptest.NewRecorder() tg.h(rec, httptest.NewRequest("GET", tg.url, nil).WithContext(f.ctx)) el := time.Since(start) t.Logf("%-8s %8dms %d bytes", tg.name, el.Milliseconds(), rec.Body.Len()) if el > budget { t.Errorf("%s 渲染用了 %s(上限 %s)——多半又出现了「每行去读整行留档」这类退化", tg.name, el.Round(time.Millisecond), budget) } } }