test-proxy-recorder vs MSW, routeFromHAR, Polly.js, Next.js 테스트 모드
여기 나오는 도구는 모두 엔드투엔드 테스트가 받는 API 응답을 제어합니다. 차이는 요청을 어디서 가로채는지(브라우저 안, 서버 안, 또는 별도의 프록시)와, 응답을 직접 작성하는지 기록하는지에 있습니다. 표는 문서 개요의 여섯 가지 도구를 그대로 두고 Next.js 테스트 모드, mockttp, scenarist, talkback, proxay를 더했습니다. 모든 칸은 2026-10-03 기준으로 각 도구의 문서, README, 소스에서 가져왔으며, 출처는 표 아래에 링크했습니다. “문서화되지 않음”은 그 출처에 언급이 없다는 뜻입니다.
기능 표
섹션 제목: “기능 표”| 도구 | 실제 트래픽 기록 | 서버 측(SSR) | 브라우저 측 | WebSocket | Playwright 네이티브 | 최신 릴리스 |
|---|---|---|---|---|---|---|
| test-proxy-recorder | 예 | 예, 프록시를 통해 | 예, HAR을 통해 | 예 | 예 | 1.3.1, 2026-08-05 |
Playwright routeFromHAR | 예 | 아니요 | 예 | 아니요 | 내장 | Playwright 1.63.0, 2026-09-04 |
| MSW | 아니요(핸들러, 또는 @msw/source를 통한 HAR) | 서버 프로세스 안에서 | 예 | 예 | @msw/playwright, 브라우저 요청 | 3.0.2, 2026-10-03 |
| Polly.js | 예 | 서버 프로세스 안에서 | 예 | 문서화되지 않음 | 서드파티 어댑터 | @pollyjs/core 6.0.6, 2023-07-20 |
| playwright-network-cache | 예 | 아니요 | 예 | 문서화되지 않음 | 예 | 0.3.0, 2026-05-12 |
| Mocky Balboa | 아니요(핸들러) | 예 | 예 | 문서화되지 않음 | 예 | @mocky-balboa/playwright 2.0.2, 2026-05-21 |
| Next.js 테스트 모드 | 아니요(핸들러) | 예, Next.js만 | 다른 오리진으로 가는 요청 | 문서화되지 않음 | 예 | 실험적, Next.js 16.3.8에 포함, 2026-09-30 |
| mockttp | 문서화되지 않음 | 예, 포워드 프록시로 | 예, 브라우저의 프록시로 | 예 | 아니요, 픽스처를 직접 작성 | 4.6.3, 2026-09-11 |
| scenarist | 아니요(코드로 작성한 시나리오) | Next.js와 Express | 아니요 | 문서화되지 않음 | 예 | 0.5.1, 2026-09-27 |
| talkback | 예 | 예, API 주소로 지정해서 | 문서화되지 않음 | 문서화되지 않음 | 아니요 | 4.2.0, 2024-07-10 |
| proxay | 예 | 예, API 주소로 지정해서 | 예, API 주소로 지정해서 | 문서화되지 않음 | 아니요 | npm 1.9.0, 2024-05-15; GitHub 2.0.0, 2026-01-29 |
출처와 참고
섹션 제목: “출처와 참고”릴리스 날짜는 GitHub 릴리스가 링크되어 있지 않으면 npm 레지스트리에서 가져왔습니다.
- test-proxy-recorder. 서버 측 호출은 프록시를, 브라우저 호출은 HAR을 거칩니다(작동 원리). 기록된 WebSocket 메시지는 프록시가 재생합니다(CLI). 릴리스: npm.
- Playwright
routeFromHAR.update: true이면 실제 트래픽으로 HAR을 기록합니다(Mock APIs). 재생은 “페이지에서 이루어지는 네트워크 요청”을 처리합니다(API). HTTP 요청에 응답하는route()핸들러를 거치며, WebSocket 경로는 없습니다(harRouter.ts). 릴리스: v1.63.0. - MSW. 요청 핸들러를 직접 작성합니다. MSW 자체는 아무것도 기록하지 않지만,
@msw/source는 브라우저 DevTools에서 내보낸 HAR 파일로 핸들러를 생성할 수 있습니다. Node.js에서는 요청을 보내는 프로세스 안에서 실행됩니다(setupServer). WebSocket은wsAPI를 사용합니다. 공식@msw/playwright바인딩은page.route()를 거치므로 브라우저 요청을 다룹니다. 릴리스: v3.0.2. - Polly.js. 저장소는 Polly.js를 “Record, Replay, and Stub HTTP Interactions”(HTTP 상호작용의 기록, 재생, 스텁)라고 소개합니다. node-http 어댑터는 Node의
http와https모듈을 패치하고, fetch 어댑터는 전역fetch를 감쌉니다. 따라서 Polly는 자신을 실행하는 프로세스 안에서 기록합니다. 문서의 어댑터 목록에는 WebSocket 어댑터가 없습니다. Playwright 지원은 서드파티 polly-adapter-playwright가 담당하며, Polly 문서가 이를 링크합니다. 릴리스: npm. - playwright-network-cache. README에 따르면 “네트워크 요청을 파일 시스템에 캐싱해” Playwright 테스트 속도를 높입니다.
CacheRoute는page.route()로 가로채므로(소스) 브라우저 요청만 봅니다. 릴리스: npm. - Mocky Balboa. 서버와 클라이언트 요청 모두에 대한 목을 하나의 API로 테스트 안에서 정의합니다. 테스트가 병렬로 실행되는 동안에도 목은 테스트별로 격리됩니다(기능). Next.js 14 이상에서는 Mocky Balboa의 CLI가 Next.js 서버를 시작합니다(Next.js). 문서에서 WebSocket은 서버와 테스트 러너 사이의 채널로만 언급됩니다. 릴리스: npm.
- Next.js 테스트 모드.
next.onFetch()로 등록한 핸들러는 서버의fetch호출과, 페이지가 다른 오리진으로 보내는fetch호출을 받습니다(README,page-route.ts). 설정, 현재 상태, MSW 3 관련 내용은 서버 측 모킹에서 다룹니다. 릴리스: Next.js 16.3.8. - mockttp. “node나 브라우저에서” 실행되는 테스트를 위한 HTTP·HTTPS 목 서버이자 프록시입니다(README).
forAnyWebSocket()은 WebSocket 연결을 모킹합니다(소스). README에는 기록 모드에 대한 설명이 없습니다. 작성해야 할 픽스처는 Playwright 팀의 글에 나와 있습니다. 릴리스: npm. - scenarist. README는 scenarist를 “런타임 시나리오 관리와 테스트 ID 격리를 갖춘, MSW 기반” 도구로 설명하며, 시나리오는 코드로 작성합니다. FAQ에서는 “Playwright의 클라이언트 측 모킹을 보완하는 서버 측 시나리오 관리를 제공한다”고 말합니다. 서버 코드가 각
fetch에x-scenarist-test-id를 전달하고(Next.js 어댑터),@scenarist/playwright-helpers가 Playwright 픽스처를 제공합니다. 릴리스: npm. - talkback. “HTTP 요청을 기록하고 재생하는 JavaScript HTTP 프록시”입니다(README). 앱은 요청을 talkback으로 보냅니다. 저장된 테이프와 일치하는 요청은 그 테이프의 응답을 받고, 알 수 없는 요청은 호스트로 전달된 뒤 새 테이프로 저장됩니다. README에는 브라우저나 테스트별 테이프에 대한 언급이 없습니다. 릴리스: npm.
- proxay. “웹 프론트엔드와 그 백엔드” 또는 “서버와 다른 서버” 사이에 쓰는 기록·재생 프록시입니다(README). 테스트는 예를 들어
beforeEach에서POST /__proxay/tape로 테이프를 고르며, README는 병렬 테스트를 다루지 않습니다. 2.0.0 버전은 GitHub 릴리스이며, npm은 여전히 1.9.0을 제공합니다.
Playwright용 Polly.js 대안
섹션 제목: “Playwright용 Polly.js 대안”Netflix의 Polly.js는 HTTP를 기록하고 재생하며 스텁으로 대체할 수 있고, test-proxy-recorder에 영감을 주었습니다. 2026-10-03 기준 상태는 다음과 같습니다.
@pollyjs/core는 2023-07-20의 6.0.6 이후 릴리스가 없습니다. 저장소의 마지막 변경은 2025-05-31에@pollyjs/adapter-fetch6.0.7을 배포한 것으로, Node에서 fetch 어댑터의 지원 중단(deprecation) 표시를 해제했습니다(Netflix/pollyjs#506).- Polly에는 자체 Playwright 어댑터가 없습니다. 문서는 브라우저 컨텍스트나 페이지에 연결되는 서드파티 polly-adapter-playwright를 안내합니다. 이 어댑터의 마지막 릴리스는 2024-04-18의 2.4.0입니다.
- 서버 측 호출을 다루려면 Polly가 node-http 또는 fetch 어댑터를 통해 서버 프로세스 안에서 실행되어야 합니다.
Polly.js에서 옮겨 온다면, Polly.js의 개념은 test-proxy-recorder에 다음과 같이 대응합니다.
| Polly.js | test-proxy-recorder |
|---|---|
record, replay, passthrough 모드(설정) | playwrightProxy.before()가 테스트별로 설정하는 record, replay, transparent 모드 |
| Polly 인스턴스마다 이름이 붙은 기록 하나, persister가 저장 | 기록 디렉터리에 Playwright 테스트마다 .mock.json(서버) 하나와 .har(브라우저) 하나 |
| 요청을 보내는 프로세스 안의 어댑터 | 서버 호출에는 프록시 프로세스, 브라우저 호출에는 HAR, 서버에는 registerProxyFetch() |
| 기본적으로 메서드, 헤더, 본문, 순서, URL로 요청을 매칭 | 서버 측 요청은 메서드, 경로, 쿼리 해시로 기록된 순서대로 매칭하며 본문은 비교하지 않음. 브라우저 요청은 POST 본문도 비교하는 Playwright의 HAR 규칙을 따름 |
Next.js와 Playwright에서의 MSW
섹션 제목: “Next.js와 Playwright에서의 MSW”Next.js 앱에서는 브라우저 요청과 서버 요청에 서로 다른 MSW 설정이 필요합니다.
- 브라우저 요청. 공식 바인딩인
@msw/playwright는 테스트별로 바꿀 수 있는network픽스처와 함께,page.route()를 통해 핸들러를 실행합니다. - 서버 요청. MSW는 Next.js 프로세스 안에서 실행됩니다. MSW 문서에는 Next.js 가이드가 없고, 참고 예제는 열려 있는 풀 리퀘스트인 mswjs/examples#101입니다. 런타임에 바꾼 핸들러는 그 서버에 닿는 모든 테스트가 공유합니다. 자세한 내용과 출처는 서버 측 모킹에 있습니다.
- 테스트별 서버 핸들러. Next.js 테스트 모드는 테스트별로 MSW 핸들러를 받지만, 그 MSW 진입점은 MSW 3.0에서 불러오지 못합니다(자세히). scenarist는 Next.js와 Express용으로 MSW 위에 테스트별 시나리오를 구성하며, 서버 코드가 각
fetch에 테스트 id 헤더를 전달합니다. - 기록. MSW는 트래픽을 기록하지 않습니다.
@msw/source는 브라우저 DevTools에서 내보낸 HAR 파일을 핸들러로 바꿉니다.
test-proxy-recorder는 반대쪽을 택합니다. 실제 API에서 서버와 브라우저 양쪽을 모두 기록하므로 작성할 핸들러가 없습니다. 그 대신 필요할 때 API에서 바로 받아 낼 수 없는 응답은 제어하기가 더 어렵습니다.
다른 도구를 선택해야 하는 경우
섹션 제목: “다른 도구를 선택해야 하는 경우”- 모든 트래픽이 브라우저 측인 경우. Playwright에 내장된
routeFromHAR는 추가 의존성이 필요 없습니다. 여기서 시작하고, 서버 측 요청이 생기면 test-proxy-recorder를 추가하세요. - 응답을 직접 작성하거나 오류와 엣지 케이스를 강제하고 싶은 경우. MSW의 핸들러가 더 잘 맞으며, MSW는 Playwright뿐 아니라 Vitest, Storybook, 브라우저에서도 실행됩니다. Playwright에서 테스트별 서버 측 핸들러가 필요하면 Mocky Balboa, scenarist, Next.js 테스트 모드를 살펴보세요.
- 설정 부담이 적은 브라우저 측 캐싱만 필요한 경우. playwright-network-cache는 픽스처 하나로 응답을 디스크에 캐싱합니다.
- 서버가 JavaScript로 작성되지 않았거나 서버 코드를 바꿀 수 없는 경우. mockttp 같은 포워드 프록시는
HTTPS_PROXY로 동작합니다. Playwright 팀의 글에 따르면 Python, Go, Ruby, Rust, .NET도 같은 방식으로 동작하며, Java에는-Dhttps.proxyHost와-Dhttps.proxyPort가 필요합니다. - 어떤 언어에서든 Playwright 밖에서 기록과 재생이 필요한 경우. proxay와 talkback은 기록을 테이프 파일로 저장하는 독립형 HTTP 서버입니다.