Development··5 min read

Playwright E2E 테스트 솔직 후기

Cypress에서 Playwright로 갈아탔다. 빠르고 안정적인데 솔직히 불편한 점도 있다.

Cypress가 느려서 갈아탔다

E2E 테스트를 Cypress로 돌리고 있었는데, 테스트 42개 실행에 7분 38초가 걸렸다. CI에서 이 시간이 병목이었다. PR 올릴 때마다 8분을 기다려야 하는 건 좀 아니었다.

Playwright가 빠르다는 얘기를 듣고 전환을 결심했다. 같은 테스트를 Playwright로 옮기니까 2분 12초. 3.5배 빨라졌다. 병렬 실행이 기본이라 그렇다.

마이그레이션은 생각보다 수월했다

Cypress와 Playwright의 API가 비슷해서 기계적으로 변환할 수 있는 부분이 많았다. cy.get('.button').click()page.locator('.button').click()으로 바뀌는 정도. 42개 테스트를 옮기는 데 이틀 걸렸다.

근데 cy.intercept() 같은 네트워크 모킹 부분은 Playwright의 page.route()로 바꿔야 했는데, API가 미묘하게 달라서 여기서 시간을 좀 먹었다.

자동 대기가 진짜 좋다

Cypress도 자동 대기를 하지만 Playwright의 auto-waiting이 더 세밀하다. click()을 하면 요소가 보이는지, 클릭 가능한지, 애니메이션이 끝났는지까지 자동으로 확인한다. Cypress에서 cy.wait(1000) 같은 하드코딩 대기를 넣었던 곳이 8군데 있었는데, Playwright에서는 전부 필요 없어졌다.

flaky test가 확 줄었다. Cypress에서 10번 돌리면 1-2번 실패하던 테스트가 Playwright에서는 50번 돌려도 전부 통과했다.

(flaky test 잡느라 쓴 시간을 생각하면 진작 옮길 걸.)

근데 불편한 점도 있다

디버깅 경험이 Cypress보다 떨어진다. Cypress는 브라우저에서 시간 여행 디버깅이 된다. 각 스텝에서 DOM 상태를 스냅샷으로 볼 수 있다. Playwright의 Trace Viewer도 있긴 한데, 별도로 trace를 활성화해야 하고 파일을 열어서 봐야 한다.

그리고 Playwright는 headless가 기본이다. 테스트가 뭘 하는지 눈으로 보고 싶으면 --headed 옵션을 줘야 한다. 디버깅할 때마다 옵션을 추가로 쳐야 하는 게 약간 귀찮다.

크로스 브라우저 테스트

Playwright의 강점 중 하나가 크로스 브라우저 테스트다. Chromium, Firefox, WebKit을 한 번에 테스트할 수 있다. 근데 솔직히 이걸 실제로 쓰는 프로젝트가 많을까? 우리도 Chromium에서만 돌리고 있다. 다른 브라우저까지 돌리면 CI 시간이 3배로 늘어나니까.

WebKit에서만 터지는 버그를 한 번 경험하면 생각이 바뀔 수도 있는데, 아직 그런 일은 없었다.

결론적으로

Cypress에서 Playwright로 옮기길 잘했다. 속도와 안정성 면에서 확실히 낫다. 근데 Cypress가 나쁜 도구라는 건 아니다. 디버깅 경험은 Cypress가 여전히 좋고, 학습 곡선도 Cypress가 완만하다.

새 프로젝트라면 Playwright를 추천한다. 기존 Cypress 프로젝트를 옮길 만한 가치가 있는지는... 테스트가 30개 이상이고 CI 시간이 고통스러우면 옮기고, 아니면 굳이 안 해도 될 것 같다.

관련 글