양식과 사용자 흐름 엔드 투 엔드 테스트
Playwright 페이지 객체로 여러 단계의 양식 제출과 탐색 흐름을 자동화합니다.
양식과 사용자 흐름 엔드 투 엔드 테스트은(는) CoddyKit의 무료 React Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 React Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. React Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
종단 간 양식 테스트 전략
종단 간 양식 테스트는 전체 사용자 여정을 시뮬레이션합니다. 페이지에 도착하고 필드를 채우며 제출하고 유효성 검사 오류를 처리한 다음 성공 결과를 확인합니다.
페이지 객체 모델
페이지 객체 모델(POM)은 페이지의 선택자와 상호 작용을 하나의 클래스에 캡슐화하여 테스트를 읽기 쉽게 만들고 중복을 줄입니다.
class LoginPage {
constructor(private page: Page) {}
async goto() { await this.page.goto('/login'); }
async fillEmail(email: string) { await this.page.getByLabel('Email').fill(email); }
async fillPassword(pw: string) { await this.page.getByLabel('Password').fill(pw); }
async submit() { await this.page.getByRole('button', { name: /log in/i }).click(); }
async getError() { return this.page.getByRole('alert').textContent(); }
}테스트에서 페이지 객체 사용하기
페이지 객체를 사용하면 테스트가 사용자 작업을 의도 수준에서 설명하게 되어 읽고 유지 관리하기 쉬워집니다.
test('successful login redirects to dashboard', async ({ page }) => {
const loginPage = new LoginPage(page);
await loginPage.goto();
await loginPage.fillEmail('alice@example.com');
await loginPage.fillPassword('password123');
await loginPage.submit();
await expect(page).toHaveURL('/dashboard');
await expect(page.getByRole('heading', { name: 'Dashboard' })).toBeVisible();
});유효성 검사 오류 테스트하기
유효하지 않거나 빈 데이터를 제출하고 사용자 인터페이스에 표시되는 오류 메시지를 검증합니다.
test('shows validation errors on empty submit', async ({ page }) => {
await page.goto('/register');
await page.getByRole('button', { name: 'Create account' }).click();
await expect(page.getByText('Email is required')).toBeVisible();
await expect(page.getByText('Password must be at least 8 characters')).toBeVisible();
});다단계 양식 테스트
다단계 마법사의 경우 각 단계를 진행하면서 양식이 다음 단계로 이동하고 이전 입력을 유지하는지 검증합니다.
test('completes 3-step signup', async ({ page }) => {
await page.goto('/signup');
// Step 1
await page.getByLabel('First Name').fill('Alice');
await page.getByRole('button', { name: 'Next' }).click();
// Step 2
await page.getByLabel('Plan').selectOption('pro');
await page.getByRole('button', { name: 'Next' }).click();
// Step 3
await page.getByLabel('Card Number').fill('4242424242424242');
await page.getByRole('button', { name: 'Complete' }).click();
await expect(page.getByText('Welcome, Alice!')).toBeVisible();
});플레이라이트에서 API 모의하기
page.route()를 사용하여 API 호출을 가로채고 모의 응답을 반환합니다. 실제 백엔드 없이 예외 상황을 테스트할 때 유용합니다.
await page.route('/api/register', async route => {
await route.fulfill({
status: 200,
contentType: 'application/json',
body: JSON.stringify({ token: 'fake-token' }),
});
});
await page.goto('/register');
// ...fill and submit form
await expect(page).toHaveURL('/dashboard');파일 업로드 테스트하기
플레이라이트에서 파일 업로드를 시뮬레이션하려면 setInputFiles()를 사용합니다.
test('uploads a profile photo', async ({ page }) => {
await page.goto('/profile');
const fileInput = page.getByLabel('Profile photo');
await fileInput.setInputFiles('./fixtures/avatar.png');
await page.getByRole('button', { name: 'Upload' }).click();
await expect(page.getByAltText('Profile photo')).toBeVisible();
});인증 상태 재사용
한 번 로그인하고 브라우저 저장소 상태를 저장한 뒤, 반복되는 로그인 흐름을 건너뛰도록 여러 테스트에서 재사용합니다.
// auth.setup.ts
test('authenticate', async ({ page }) => {
await page.goto('/login');
await page.getByLabel('Email').fill('alice@example.com');
await page.getByLabel('Password').fill('password');
await page.getByRole('button', { name: 'Log in' }).click();
await page.context().storageState({ path: 'e2e/.auth/user.json' });
});
// playwright.config.ts — use storageState in other tests
use: { storageState: 'e2e/.auth/user.json' }오류 복구 테스트하기
네트워크 실패를 시뮬레이션하고 사용자가 다시 시도할 수 있는지 또는 이해하기 쉬운 오류 메시지를 확인할 수 있는지 검증합니다.
await page.route('/api/submit', route => route.abort());
await page.getByRole('button', { name: 'Submit' }).click();
await expect(page.getByText('Network error. Please try again.')).toBeVisible();
await page.unroute('/api/submit');
// Now the real request goes through
await page.getByRole('button', { name: 'Retry' }).click();키보드 탐색 테스트
필드를 탭으로 이동하고 Enter로 제출하여 양식 전체가 키보드로 접근 가능한지 테스트합니다.
test('submits form with keyboard only', async ({ page }) => {
await page.goto('/contact');
await page.keyboard.press('Tab'); // focus name
await page.keyboard.type('Alice');
await page.keyboard.press('Tab'); // focus email
await page.keyboard.type('alice@example.com');
await page.keyboard.press('Tab'); // focus submit
await page.keyboard.press('Enter');
await expect(page.getByText('Message sent!')).toBeVisible();
});테스트 데이터용 픽스처
여러 테스트에서 설정 로직(예: 테스트 사용자 생성)을 깔끔하게 공유하려면 플레이라이트 픽스처를 사용합니다.
// fixtures.ts
const test = base.extend<{ testUser: User }>({
testUser: async ({}, use) => {
const user = await createTestUser();
await use(user);
await deleteTestUser(user.id);
},
});
// In a test file:
test('edits profile', async ({ page, testUser }) => {
await page.goto(`/users/${testUser.id}/edit`);
});병렬 테스트 실행
플레이라이트는 기본적으로 여러 작업자에서 테스트를 병렬로 실행합니다. 순서대로 실행해야 하는 테스트에만 test.describe.serial을 사용하십시오.
빠른 확인
종단 간 테스트에서 페이지 객체 모델(POM)을 사용하는 가장 큰 이점은 무엇인가요?
요약
종단 간 양식 테스트는 유지 관리성을 위해 페이지 객체를 사용하고, API 모의를 위해 page.route()를 사용하며, 업로드를 위해 setInputFiles()를 사용하고, 인증 세션을 재사용하기 위해 저장소 상태를 사용합니다. 실제 사용자 여정을 다루려면 유효성 검사, 다단계 흐름, 키보드 탐색을 테스트하십시오.
AI 튜터와 함께 React을(를) 배우세요 — 무료
브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.
- 코스
- 88
- 레슨
- 324
자주 묻는 질문
“양식과 사용자 흐름 엔드 투 엔드 테스트” 강의는 무료인가요?
네 — “양식과 사용자 흐름 엔드 투 엔드 테스트” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 React Academy 강의 전체를 잠금 해제할 수 있습니다. React Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“양식과 사용자 흐름 엔드 투 엔드 테스트”에서 뭘 배우나요?
Playwright 페이지 객체로 여러 단계의 양식 제출과 탐색 흐름을 자동화합니다. 브라우저에서 직접 실행하는 실습 코드로 React Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
React Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 React Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“양식과 사용자 흐름 엔드 투 엔드 테스트” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 React Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 React Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- React Testing Library로 통합 테스트하기
- MSW로 비동기 UI와 API 호출 테스트하기
- React용 Playwright 시작하기
- 양식과 사용자 흐름 엔드 투 엔드 테스트