Ghi lại các response API thật trong khi bộ Playwright của bạn chạy cục bộ, rồi phát lại chúng từng byte trên CI. Không cần backend, không cần mạng, không có mock viết tay để bảo trì.
MIT · TypeScript · hoạt động với SSR của Next.js & TanStack Start, SPA & extension Chrome · hỗ trợ WebSocket
npx playwright test
REC · MODE=record · local run
your appproxyreal API
⤓
saved e2e/recordings/todos.GET.mock.json
▶
REPLAY · MODE=replay · CI
your appproxydisk
✓
200 OK · 3 ms · zero network
Xem nó ghi lại, rồi phát lại
Một lần chạy Playwright ghi các response thật ra đĩa; lật sang phát lại và cùng bộ test đó pass với backend đã tắt — không cần mạng.
Hai bộ ghi lại, một proxy
Request xuất phát từ hai nơi, nên có hai cơ chế ghi lại. Dùng một trong hai — hoặc cả hai cùng lúc. Cả hai đều ghi lại một lần và phát lại từ đĩa, nên CI chạy với backend đã tắt và không cần mock viết tay.
Proxy
.mock.json
SSR của Next.js / TanStack Start → proxy → API thật
Nằm giữa máy chủ của bạn và API. Ghi lại các request phía máy chủ — fetch SSR, route handler, bất cứ thứ gì backend-for-frontend của bạn gọi.
Các công cụ mocking giỏi ở những việc khác nhau. Sự kết hợp bên dưới — ghi lại traffic thật trên cả SSR, trình duyệt, và WebSockets, không cần mock viết tay — chính là khoảng trống các công cụ khác để lại.
So sánh tính năng giữa test-proxy-recorder với Playwright routeFromHAR, MSW, Polly.js, playwright-network-cache, và Mocky Balboa.
Tính năng
test-proxy-recorder
Playwright routeFromHAR
MSW
Polly.js
playwright-network-cache
Mocky Balboa
Ghi lại traffic thật
✓ Có
✓ Có
✕ Không
✓ Có
✓ Có
✕ Không
Phía máy chủ (SSR)
✓ Có
✕ Không
✓ Có
~ Một phần
✕ Không
✓ Có
Phía trình duyệt
✓ Có
✓ Có
✓ Có
✓ Có
✓ Có
✓ Có
WebSocket
✓ Có
✕ Không
✓ Có
✕ Không
✕ Không
✕ Không
Thuần Playwright
✓ Có
✓ Có
✕ Không
✕ Không
✓ Có
✓ Có
Được bảo trì
✓ Có
✓ Có
✓ Có
✕ Không
✓ Có
✓ Có
~ Polly.js chặn HTTP của Node, nên việc mock SSR có thể thực hiện bên trong tiến trình ứng dụng, nhưng không phải như một phần của lần chạy Playwright. MSW và Mocky Balboa cũng phát lại các response thật — nhưng bạn phải viết mock bằng tay. Khi nào nên chọn thứ khác được trình bày trong tài liệu.
Hoạt động với auth provider thật của bạn
Đăng nhập qua Cognito, Auth0, Clerk, hoặc WorkOS — thật sự, trong mỗi lần chạy. Chỉ API của ứng dụng bạn được ghi lại; auth vẫn trực tiếp, dữ liệu của bạn chuyển sang offline.
// e2e/auth.setup.ts — log in for real, once. Never recorded.
Dựng mọi thứ bằng một lệnh, trỏ API của bạn về proxy, rồi ghi lại và commit. Ứng dụng chỉ chạy trên trình duyệt? init sẽ bỏ qua bước SSR giúp bạn.
Đường nhanh nhất: giao cho AI agent của bạn
Sao chép đoạn này, thay URL backend của bạn vào, và dán vào Claude Code, Cursor, hoặc bất kỳ coding agent nào — nó chạy init và hoàn tất việc kết nối từ prompt init in ra.
Set up test-proxy-recorder for end-to-end tests in this project, then follow the
instructions that `init` prints. Run these commands:
npx @tanstack/intent@latest install
npm install --save-dev test-proxy-recorder
Then run init, passing this project's backend API base URL as the target — find
it yourself from the app's env/config (the URL the app calls in dev); don't
Then complete the app-specific steps init prints: point the app's API base URL at
the proxy in dev/test only, tag server-side fetches (Next.js), add a smoke test,
and verify record → replay.
Hoặc tự kết nối bằng tay:
Cài đặt & dựng khung
init viết cấu hình proxy, một Playwright fixture, một global teardown, package.json script, và (trên Next.js) kết nối việc gắn thẻ fetch SSR vào root layout của bạn — một cách không phá hoại.
Terminal window
npminstall--save-devtest-proxy-recorder
# http://localhost:3002 is your API endpoint; 8100 is the proxy. Flags are optional.
Điều duy nhất init không thể đoán: biến env nào chứa base URL API của bạn. Trỏ nó về proxy khi recorder được bật, về backend thật trong trường hợp còn lại — proxy không bao giờ chạy trong production.
// Point your app at the proxy when the recorder is enabled, at the real backend otherwise.
// The proxy never runs in production — TEST_PROXY_RECORDER_ENABLED is set only for e2e.
registerProxyFetch(); // no-op in production unless TEST_PROXY_RECORDER_ENABLED=true
Ghi lại, commit, phát lại
Đặt MODE = 'record', chạy một lần dựa trên API thật, rồi lật sang 'replay' và commit. Các bản ghi nằm trong git — đó là điều làm CI tất định. Đừng gitignore chúng.
Nếu nó giúp bạn tiết kiệm một buổi chiều, một star chỉ mất một giây — đó là cách người tiếp theo tìm thấy nó, và nó báo cho một maintainer độc lập rằng hãy tiếp tục xây dựng. Gặp trục trặc hay có ý tưởng? Mở một issue hoặc tham gia Discord.