본문 바로가기
AI

"로그인 테스트 짜줘" 말 한마디면 끝? Playwright Agent가 가져올 테스트 자동화의 미래

by JavaPark 2025. 10. 31.

 

"로그인 테스트 짜줘" 말 한마디면 끝? Playwright Agent가 가져올 테스트 자동화의 미래

안녕하세요! E2E(End-to-End) 테스트 자동화, 웹 개발자나 QA 엔지니어라면 누구나 그 필요성에 공감하실 겁니다. 하지만 동시에, 솔직히 번거롭고 시간이 많이 드는 작업이기도 하죠.

  • 수많은 사용자 시나리오를 코드로 옮겨야 하는 부담
  • 프론트엔드 UI가 조금만 변경되어도 쉽게 깨지는 테스트 코드 (Flaky Tests)
  • 이렇게 깨진 코드를 찾아 수정하는 데 드는 지속적인 유지보수 비용

이 모든 것이 우리의 퇴근 시간을 늦추는 주범이었습니다.

하지만 만약, AI에게 **"회원가입 플로우 테스트 계획해줘"**라고 말만 하면 테스트 계획서가 나오고, **"이 계획대로 코드 짜줘"**라고 하면 테스트 코드가 완성되며, **"테스트 깨졌는데 고쳐줘"**라고 하면 AI가 알아서 코드를 수정해 준다면 어떨까요?

공상 과학 같던 이 이야기가 Playwright Agent의 등장으로 현실이 되었습니다.

Playwright Agent는 단순한 코드 생성기(Codegen)를 넘어, AI가 테스트의 전체 수명 주기인 '계획(Plan) - 생성(Generate) - 유지보수(Maintain)'에 깊숙이 관여하는 혁신적인 시스템입니다.

이 글에서는 Playwright Agent를 구성하는 세 가지 핵심 요소와 실제 작동 방식을 자세히 파헤쳐 봅니다.

🤖 Playwright Agent를 움직이는 3가지 핵심 요소

Playwright Agent는 하나의 거대한 AI가 아닙니다. 마치 잘 훈련된 전문가 팀처럼, 각자의 명확한 역할을 가진 세 가지 전문 에이전트가 협력하여 작동합니다.

1. 🎭 Planner (기획자): 자연어로 테스트를 설계하다

  • 역할: 사용자의 자연어 프롬프트(요구사항)를 이해하고, 테스트 계획을 수립합니다.
  • 입력: "우리 쇼핑몰 장바구니 결제 시나리오 테스트해줘"와 같은 간단한 자연어 명령.
  • 출력: 사람이 읽을 수 있고, 다음 단계의 Generator가 이해할 수 있는 Markdown (.md) 형식의 테스트 계획서를 생성합니다.

더 이상 복잡한 시나리오를 처음부터 코드로 고민할 필요가 없습니다. Planner에게 맡기면, 필요한 테스트 단계와 검증 항목(Assertion)이 포함된 체계적인 계획이 순식간에 완성됩니다.

2. ✍️ Generator (생성자): 계획을 코드로 구현하다

  • 역할: Planner가 작성한 Markdown 계획서를 실제 실행 가능한 Playwright 테스트 코드로 변환합니다.
  • 입력: Planner가 생성한 payment-plan.md 파일.
  • 출력: Playwright의 모범 사례(Best Practice)와 올바른 로케이터(Selector)를 사용한 테스트 스펙 파일 (.spec.ts 또는 .spec.js).

Generator는 반복적인 코드 작성을 대신 처리해 줌으로써 개발자의 생산성을 극대화합니다. 우리는 AI가 생성한 코드를 검토하고 다듬기만 하면 됩니다.

3. ❤️‍🩹 Healer (치료사): 깨진 테스트를 자동으로 수정하다

  • 역할: 테스트 실행 중 실패가 발생했을 때, 원인을 분석하고 코드를 **자동으로 수정(Self-Healing)**합니다.
  • 작동 방식: 개발 과정에서 UI가 변경되어(예: 버튼의 ID나 텍스트가 바뀜) 기존 테스트가 실패하는 경우, Healer가 개입합니다.
  • 출력: 현재 UI 상태를 분석하여 깨진 로케이터를 새롭고 더 견고한 로케이터로 변경하는 등, 코드 수정 패치(Patch)를 제안하거나 자동으로 적용합니다.

'테스트 코드가 깨졌다'는 알림을 받고 한숨부터 쉬던 과거는 안녕입니다. Healer는 테스트 유지보수 비용을 획기적으로 절감시키는 Playwright Agent의 핵심 무기입니다.

🛠️ Playwright Agent 실제 사용 워크플로우 (Step-by-Step)

그렇다면 이 똑똑한 AI 에이전트들을 어떻게 사용할까요? 간단한 '투두리스트(Todo List) 앱' 테스트 시나리오를 예로 들어보겠습니다.

1단계: Agent 초기화

먼저, 기존 Playwright 프로젝트에 Agent 설정을 추가합니다. (VS Code 통합 기준)

# 프로젝트에 Agent 설정 파일들을 초기화합니다.
npx playwright init-agents --loop=vscode

2단계: Planner에게 계획 요청 (자연어 → Markdown)

AI 챗(VS Code, Claude 등)을 통해 Planner에게 자연어로 테스트 계획을 요청합니다.

[👤 User Prompt]

"투두리스트 앱 테스트 계획 세워줘.

  1. 새 할 일 추가하기
  2. 추가된 할 일 완료 처리하기"

Planner는 이 요청을 분석하여 다음과 같은 todo-plan.md 파일을 생성합니다.

[🤖 Planner Output: todo-plan.md]

Markdown

## Todo List 테스트 계획

시나리오 1: 새 할 일 추가

  1. 앱 페이지에 접속한다.
  2. 'What needs to be done?' 입력창을 찾는다.
  3. 입력창에 '우유 사기'를 입력하고 Enter 키를 누른다.
  4. 할 일 목록에 '우유 사기' 항목이 보이는지 확인한다.

시나리오 2: 할 일 완료 처리

  1. '우유 사기' 항목 옆의 체크박스를 클릭한다.
  2. '우유 사기' 항목에 취소선이 생겼는지 확인한다.

3단계: Generator로 코드 생성 (Markdown → Code)

이제 Generator에게 이 계획서를 코드로 바꿔달라고 요청합니다.

[👤 User Prompt]

"todo-plan.md 파일을 기반으로 테스트 코드를 생성해줘."

Generator는 즉시 tests/todo.spec.ts 파일을 생성합니다.

[🤖 Generator Output: tests/todo.spec.ts]

TypeScript

import { test, expect } from '@playwright/test';

test.describe('Todo List', () => {

test.beforeEach(async ({ page }) => {

await page.goto('/');

});

test('시나리오 1: 새 할 일 추가', async ({ page }) => {

// 2. 'What needs to be done?' 입력창을 찾는다.

const input = page.getByPlaceholder('What needs to be done?');

// 3. 입력창에 '우유 사기'를 입력하고 Enter 키를 누른다.
await input.fill('우유 사기');
await input.press('Enter');
// 4. 할 일 목록에 '우유 사기' 항목이 보이는지 확인한다.
await expect(page.getByTestId('todo-item-label')).toHaveText('우유 사기');

});

test('시나리오 2: 할 일 완료 처리', async ({ page }) => {

// (시나리오 1의 코드가 먼저 실행되었다고 가정)

// 1. '우유 사기' 항목 옆의 체크박스를 클릭한다.

await page.getByTestId('todo-item-toggle').check();

// 2. '우유 사기' 항목에 취소선이 생겼는지 확인한다.
await expect(page.getByTestId('todo-item-label')).toHaveClass(/completed/);

});

});

4단계: 테스트 실행 및 Healer의 마법 (Self-Healing)

이제 평소처럼 테스트를 실행합니다.

npx playwright test

여기서 마법이 일어납니다. 만약 프론트엔드 개발자가 getByTestId('todo-item-label')을 getByTestId('todo-content')로 변경했다고 가정해 봅시다.

기존 테스트라면 시나리오 1은 100% 실패했을 겁니다. 하지만 Playwright Agent가 활성화된 상태라면, Healer가 이 실패를 감지합니다.

[❤️‍🩹 Healer의 분석]

"테스트 실패: getByTestId('todo-item-label') 로케이터를 찾을 수 없음.

원인 분석: DOM을 스캔해 보니, 텍스트 '우유 사기'는 getByTestId('todo-content') 내부에 존재함.

해결책: 로케이터를 getByTestId('todo-content')로 수정해야 함."

Healer는 이 분석을 바탕으로 코드 수정을 제안하거나, 설정에 따라 자동으로 패치를 적용하여 테스트 코드를 '자가 치유'합니다.

✨ Playwright Agent가 가져올 변화 (핵심 장점)

Playwright Agent는 단순히 코드를 몇 줄 덜 쓰게 해주는 도구가 아닙니다. 테스트 자동화의 패러다임 자체를 바꾸고 있습니다.

  • 🚀 압도적인 생산성 향상: 아이디어를 테스트 코드로 옮기는 시간이 '몇 시간'에서 '몇 분' 단위로 단축됩니다.
  • 📉 낮은 진입 장벽: Playwright 문법에 익숙하지 않은 기획자나 주니어 개발자도 자연어로 테스트 시나리오를 만들고 자동화에 기여할 수 있습니다.
  • 🔧 강력한 유지보수성: '자가 치유(Self-Healing)' 기능 덕분에, UI 변경에 따른 테스트 코드 파손(breakage) 스트레스에서 해방됩니다.
  • 💡 더 나은 테스트 품질: AI는 사람이 놓치기 쉬운 엣지 케이스를 고려하고, Playwright의 모범 사례에 따라 견고한 코드를 생성합니다.

맺음말: AI는 대체가 아닌, 강력한 조수

Playwright Agent의 등장은 개발자나 QA 엔지니어의 역할이 끝났음을 의미하지 않습니다. 오히려 AI라는 강력한 '조수'를 얻게 되었음을 의미합니다.

우리는 이제 반복적인 코드 작성과 지루한 디버깅에서 벗어나, 더 창의적이고 복잡한 사용자 시나리오를 설계하거나, AI가 제안한 코드를 검토하며 더 높은 수준의 품질을 고민하는 데 집중할 수 있습니다.

테스트 자동화의 새로운 시대가 열렸습니다. Playwright Agent와 함께 더 스마트하게 일할 준비, 되셨나요?