유스케이스 테스트란?기본·대체·예외 플로우의 설계 방법+Playwright 구현

테스트 자동화

유스케이스 테스트란 사용자가 목적을 달성하기까지의 일련의 조작 플로우(유스케이스)를 테스트 시나리오로 변환하는 테스트 설계 기법입니다. E2E 테스트의 시나리오 설계·리그레션 테스트의 우선순위 결정에 특히 효과를 발휘합니다.

💡 한 마디로 말하면
유스케이스 테스트 = 「사용자가 목적을 달성하기까지의 조작을 통째로 테스트하는 기법

유스케이스 테스트를 사용하면 「사용자가 실제로 수행하는 조작」을 그대로 테스트 시나리오로 변환할 수 있어 「동작은 하지만 사용할 수 없다」는 사용자 관점의 버그를 근본적으로 발견할 수 있습니다.

📌 이런 분께 추천합니다

  • 유스케이스 테스트를 처음 배우는 QA 엔지니어·개발자
  • E2E 테스트의 시나리오를 어떻게 설계하면 좋을지 고민하는 분
  • 사용자 관점의 테스트 케이스를 체계적으로 만들고 싶은 분
  • Playwright × pytest로의 E2E 테스트 설계에 활용하고 싶은 분

✅ 이 글을 읽으면 얻을 수 있는 것

  • 유스케이스 테스트의 개념과 기본 플로우·대체 플로우의 설계 방법을 알 수 있다
  • 구매 플로우·회원 가입 등 실무에서 자주 사용하는 장면에의 적용 방법을 알 수 있다
  • Playwright × pytest로의 E2E 테스트 변환 방법을 알 수 있다

👤 이 글을 쓴 사람

QA 엔지니어·테스트 자동화 엔지니어로서 15년 이상의 실무 경험을 가진 Yoshi가 집필. 유스케이스 테스트는 E2E 테스트의 시나리오 설계에서 매일 활용하는 기법입니다. 구현 코드는 GitHub에 공개 중입니다: github.com/YOSHITSUGU728/automated-testing-portfolio

「단위 테스트는 모두 통과하고 있는데 실제로 사용해보면 동작하지 않는다」「정상계만 테스트하고 있어서 사용자가 할 것 같은 조작의 버그가 본번에서 발생했다」——이런 문제는 사용자 관점의 테스트 설계가 부족하기 때문입니다.

  • 단위 테스트나 기능 테스트만으로는 「사용자의 조작 플로우 전체」를 검증할 수 없다
  • 정상계(기본 플로우)만 테스트하여 대체 플로우·예외 플로우가 누락된다
  • 테스트 시나리오가 엔지니어의 시점으로 작성되어 실제 사용자 조작과 괴리가 있다

유스케이스 테스트는 이런 문제를 해결하는 기법입니다. 이 글에서는 개념부터 구체적인 시나리오 설계·Playwright E2E 테스트로의 응용까지 한 번에 해설합니다.

📌 결론

  • 「사용자의 목표로의 일련의 조작」을 기본 플로우·대체 플로우·예외 플로우로 나누어 설계하는 테스트 설계 기법
  • 기본 플로우로 정상계를·대체 플로우로 분기를·예외 플로우로 에러 처리를 검증한다
  • Playwright × pytest에서는 1유스케이스=1테스트 파일의 구성이 베스트 프랙티스

유스케이스 테스트란?

유스케이스 테스트란 「사용자가 시스템을 사용하여 목적을 달성하기까지의 일련의 조작 플로우(유스케이스)」를 테스트 시나리오로 변환하는 테스트 설계 기법입니다.

예를 들어 「상품을 구매한다」는 유스케이스라면 로그인→상품 선택→카트 추가→결제 정보 입력→주문 확정→완료 확인이라는 일련의 플로우를 그대로 테스트 시나리오로 만듭니다. 사용자의 시점에서 시스템을 검증하기 때문에 단위 테스트로는 발견할 수 없는 「플로우 전체에서 처음 나타나는 버그」를 찾아낼 수 있습니다.

비교 항목단위 테스트·기능 테스트유스케이스 테스트
시점개발자·기능 단위사용자·목표 단위
테스트 범위개별 기능·입출력조작 플로우 전체·화면 전환
발견할 수 있는 버그로직 버그플로우·통합·UX 버그
자동화 도구pytest·unittestPlaywright·Selenium

상태 전이 테스트와의 차이란?

같은 「플로우를 테스트하는」 기법이어도 유스케이스 테스트와 상태 전이 테스트는 시점과 목적이 다릅니다. 실무에서는 혼동되기 쉽기 때문에 정리해 둡니다.

비교 항목유스케이스 테스트상태 전이 테스트
시점사용자의 목적 달성 플로우시스템의 상태와 전이의 올바름
검증 내용기본 플로우·대체 플로우·예외 플로우정상 전이·무효 전이
적합한 시스템UI 조작이 주체인 시스템 전반상태를 가진 시스템(EC·예약)
자주 사용하는 장면구매 플로우·회원 가입·검색주문 상태·로그인 상태 관리

💡 판단 기준

  • 「사용자가 몇 단계로 목적을 달성하는가」를 확인하고 싶다 → 유스케이스 테스트
  • 「이 상태에서 이 조작은 유효한가·무효인가」를 확인하고 싶다 → 상태 전이 테스트
  • 실무에서는 양쪽을 조합하는 것이 표준. 유스케이스 테스트로 정상 플로우를, 상태 전이 테스트로 무효 전이를 보완한다.

유스케이스 테스트와 E2E 테스트의 차이란?

자주 혼동되는 두 가지 개념이지만 역할이 완전히 다릅니다.

항목유스케이스 테스트E2E 테스트
종류테스트 설계의 기법테스트 실행의 방식
역할「무엇을 테스트하는가」를 설계한다「어떻게 테스트를 실행하는가」의 수단
도구설계서·스프레드시트Playwright·Selenium·Cypress
💡 관계성:유스케이스 테스트로 설계한 시나리오를 Playwright 등의 도구로 E2E 테스트로서 구현한다는 흐름이 실무의 표준입니다. 설계 없이 바로 E2E 테스트를 작성하면 무엇을 확인하고 있는지 모호한 테스트 코드가 만들어집니다.

유스케이스 테스트의 기본 구조란?

유스케이스 테스트는 「기본 플로우」「대체 플로우」「예외 플로우」의 3가지로 구성됩니다.

플로우 종별내용예(상품 구매)
기본 플로우
(Basic Flow)
가장 흔한 정상계 조작 순서로그인→상품 선택→카트 추가→결제→완료
대체 플로우
(Alternative Flow)
정상이지만 다른 경로를 따르는 조작비회원 구매(로그인 없음)·쿠폰 적용·품절 시 다른 상품 선택
예외 플로우
(Exception Flow)
에러나 이상이 발생하는 조작결제 실패·세션 기한 만료·필수 항목 미입력
💡 포인트:많은 QA팀이 「기본 플로우(정상계)」만 테스트하고 있습니다. 유스케이스 테스트의 진정한 가치는 대체 플로우·예외 플로우를 도출하는 것에 있습니다. 「비회원 구매는?」「쿠폰은?」「결제 실패는?」이라고 계속 물어 플로우를 망라하세요.

📊 유스케이스「상품을 구매한다」의 플로우 도표

기본
👤 시작
로그인
상품선택
카트추가
결제
🎯 완료

대체
쿠폰 적용
🎯 완료
← 다른 경로·정상

예외
결제 실패
🔄 에러처리
← 에러·이상

기본 플로우(정상계) 
대체 플로우(다른 경로·정상) 
예외 플로우(에러·이상)

실례①:상품 구매 유스케이스의 테스트 설계

EC 사이트의 「상품을 구매한다」 유스케이스를 기본 플로우·대체 플로우·예외 플로우로 나누어 테스트 시나리오를 설계합니다.

기본 플로우(정상계)

스텝사용자 조작시스템 응답(확인 포인트)
Step 1로그인한다대시보드가 표시된다
Step 2상품을 검색·선택한다상품 상세 페이지가 표시된다
Step 3카트에 추가한다카트의 배지 수가 증가한다
Step 4카트에서 구매 절차로 진행한다주문 확인 페이지가 표시된다
Step 5결제 정보를 입력·주문 확정한다주문 완료 페이지가 표시되고 확인 메일이 발송된다

대체 플로우(정상이지만 다른 경로)

대체 플로우발생 조건확인 포인트
비회원 구매로그인하지 않고 구매한다비회원 구매 플로우가 올바르게 완료되는가
쿠폰 적용쿠폰 코드를 입력하여 할인한다할인 후 금액이 올바르게 계산되는가
복수 상품 구매복수의 상품을 카트에 담아 구매한다합계 금액·배송비가 올바르게 계산되는가

예외 플로우(에러·이상)

예외 플로우발생 조건확인 포인트
결제 실패신용카드가 결제 거부됐다에러 메시지가 표시되고 카트 내용이 유지되는가
품절결제 중에 재고가 없어졌다적절한 에러가 표시되고 이중 청구가 발생하지 않는가
세션 만료결제 화면에서 세션이 기한 만료됐다로그인 페이지로 리다이렉트되고 카트가 유지되는가

실례②:회원 가입 유스케이스의 테스트 설계

또 다른 대표적인 유스케이스 「회원 가입을 한다」의 테스트 설계입니다.

플로우 종별시나리오확인 포인트
기본 플로우이메일·비밀번호를 입력하여 등록 완료확인 메일 수신·로그인 가능하게 되는가
대체 플로우①SNS 연동(Google / Apple)으로 등록OAuth 인증이 올바르게 완료되고 계정이 생성되는가
대체 플로우②초대 링크에서 등록초대 혜택이 올바르게 부여되는가
예외 플로우①이미 등록된 이메일 주소로 등록중복 등록 에러가 표시되는가
예외 플로우②메일 확인 링크가 기한 만료재전송 버튼이 표시되는가

Playwright × pytest에의 응용

유스케이스 테스트로 설계한 시나리오는 Playwright × pytest의 E2E 테스트에 직접 변환할 수 있습니다. 1유스케이스=1테스트 파일의 구성이 실무의 베스트 프랙티스입니다.

폴더 구성 예시

tests/
├── conftest.py
└── e2e/
    ├── test_purchase.py        # 유스케이스:상품을 구매한다
    ├── test_register.py        # 유스케이스:회원 가입을 한다
    └── test_login.py           # 유스케이스:로그인한다

test_purchase.py:상품 구매 유스케이스의 E2E 테스트

import pytest
from playwright.sync_api import Page, expect

# ── 기본 플로우 ──────────────────────────────────
def test_purchase_basic_flow(logged_in_page: Page):
    """기본 플로우:로그인 완료 사용자가 상품을 구매한다"""
    # Step 2: 상품 선택
    logged_in_page.goto("localhost:3000/products/1")
    expect(logged_in_page.locator("h1.product-title")).to_be_visible()

    # Step 3: 카트에 추가
    logged_in_page.click("#add-to-cart")
    expect(logged_in_page.locator(".cart-badge")).to_have_text("1")

    # Step 4: 구매 절차로
    logged_in_page.goto("localhost:3000/cart")
    logged_in_page.click("#checkout-btn")

    # Step 5: 주문 확정
    logged_in_page.fill("#card-number", "4111111111111111")
    logged_in_page.fill("#expiry", "12/26")
    logged_in_page.fill("#cvv", "123")
    logged_in_page.click("#confirm-order-btn")
    expect(logged_in_page.locator(".order-complete")).to_be_visible()

# ── 대체 플로우 ──────────────────────────────────
def test_purchase_with_coupon(logged_in_page: Page):
    """대체 플로우:쿠폰 적용하여 구매한다"""
    logged_in_page.goto("localhost:3000/cart")
    logged_in_page.fill("#coupon-input", "DISCOUNT10")
    logged_in_page.click("#apply-coupon-btn")
    # 쿠폰 적용 후 금액이 올바른지 확인
    expect(logged_in_page.locator(".discount-amount")).to_be_visible()

# ── 예외 플로우 ──────────────────────────────────
def test_purchase_payment_failure(logged_in_page: Page):
    """예외 플로우:결제 실패 시 에러 메시지가 표시되고 카트가 유지된다"""
    logged_in_page.goto("localhost:3000/cart")
    logged_in_page.click("#checkout-btn")
    # 무효한 카드 번호로 결제
    logged_in_page.fill("#card-number", "0000000000000000")
    logged_in_page.click("#confirm-order-btn")
    # 에러 메시지가 표시되는가
    expect(logged_in_page.locator(".payment-error")).to_be_visible()
    # 카트 내용이 유지되는가
    expect(logged_in_page.locator(".cart-badge")).to_have_text("1")
💡 실무 팁:기본 플로우·대체 플로우·예외 플로우를 같은 파일에 모으면 「이 상품 구매 유스케이스의 테스트는 전부 여기에 있다」는 일람성이 생깁니다. 테스트 파일의 이름을 유스케이스 이름으로 하면 어떤 시나리오를 커버하고 있는지가 파일 이름에서 한눈에 알 수 있습니다.

⚠️ 유스케이스 테스트에서 자주 있는 실패 패턴 4선

실무에서 유스케이스 테스트를 설계할 때 빠지기 쉬운 실패를 소개합니다.

① 기본 플로우(정상계)만으로 끝내버린다

「상품을 구매할 수 있는 것」만 확인하고 끝내버리는 케이스입니다. 유스케이스 테스트의 본래 가치는 대체 플로우·예외 플로우를 도출하는 것에 있습니다. 「비회원 구매는?」「쿠폰은?」「결제 실패는?」이라고 계속 물어 플로우를 망라하세요.

② 1개의 테스트 함수에 복수의 유스케이스를 집어넣는다

「가입→로그인→구매→로그아웃」을 모두 1개의 테스트 함수에 써버리는 케이스입니다. 어디에서 실패했는지 특정하기 어려워지고 앞부분 단계가 실패하면 뒷부분 테스트를 실행할 수 없게 됩니다. 1유스케이스=1테스트 함수의 원칙을 지키세요.

③ 사용자 시점이 아닌 엔지니어 시점으로 시나리오를 만든다

「API의 파라미터를 테스트한다」「DB에 올바르게 저장되는지 확인한다」는 시점으로 작성된 시나리오는 유스케이스 테스트가 아니라 기능 테스트입니다. 유스케이스 테스트에서는 「사용자가 화면에서 어떻게 조작하는가」를 기점으로 시나리오를 작성합니다.

④ 모든 유스케이스를 같은 우선순위로 테스트하려 한다

유스케이스 수가 많은 경우 모두를 같은 빈도로 테스트하는 것은 비현실적입니다. 「구매 완료」「로그인」등의 핵심 유스케이스는 매번, 「비밀번호 변경」「주소 변경」등은 주 1회 등 리스크와 이용 빈도에 따라 우선순위를 정하는 것이 실무에서는 중요합니다.

FAQ

Q. 유스케이스 테스트는 어떤 시스템에 사용해야 하나요?

사용자가 조작하는 UI를 가진 시스템 전반에 유효합니다. 특히 EC 사이트(구매·등록·검색)·예약 시스템(검색·예약·변경·취소)·사내 업무 시스템(신청·승인·거부)등 복수의 단계로 이루어진 조작 플로우가 있는 시스템에 가장 효과적입니다.

Q. 유스케이스 테스트와 상태 전이 테스트의 사용 구분은?

유스케이스 테스트는 「사용자의 목표로의 일련의 조작 플로우」를 검증합니다. 상태 전이 테스트는 「시스템의 상태와 전이가 올바른가·무효 전이가 거부되는가」를 검증합니다. 실무에서는 양쪽을 조합하는 경우가 많아 유스케이스 테스트로 정상 플로우를 망라하면서 상태 전이 테스트로 무효 전이를 보완하는 구성이 일반적입니다.

Q. ISTQB에서 유스케이스 테스트는 어느 정도 출제되나요?

ISTQB Foundation Level에서는 「유스케이스 테스트의 개념·기본 플로우와 대체 플로우의 정의」가 출제됩니다. 「유스케이스에서 도출되는 테스트 케이스는 기본 플로우·대체 플로우·예외 플로우를 포함한다」는 개념을 이해해 두면 대응할 수 있습니다.

실무에서는 사용자 스토리(「〜로서、〜하고 싶다」)나 프로덕트의 요건 정의서에서 유스케이스를 추출하여 Playwright × pytest의 E2E 테스트로 변환하는 워크플로우가 자주 사용됩니다. 설계서와 테스트 코드가 1대1로 대응하기 때문에 기능 추가·변경 시 어떤 테스트를 업데이트해야 하는지가 한눈에 알 수 있는 장점이 있습니다.

📋 이 글의 정리

  • 유스케이스 테스트는 「사용자의 목표로의 조작 플로우」를 설계하는 테스트 설계 기법
  • 기본 플로우·대체 플로우·예외 플로우의 3가지를 망라함으로써 정상계부터 이상계까지 체계적으로 커버할 수 있다
  • 대체 플로우·예외 플로우의 도출이 최대 포인트. 「비회원 구매는?」「결제 실패는?」이라고 계속 물어보자
  • 1유스케이스=1테스트 파일의 구성이 Playwright × pytest 구현의 베스트 프랙티스
  • 리스크와 이용 빈도에 따라 유스케이스의 우선순위를 정하는 것이 실무에서는 중요

유스케이스 테스트의 최대 가치는 「사용자가 실제로 수행하는 조작」을 기점으로 함으로써 단위 테스트로는 발견할 수 없는 「플로우를 넘나드는 버그」를 체계적으로 발견할 수 있는 점입니다. 먼저 가까운 서비스의 「상품을 구매한다」「회원 가입을 한다」는 유스케이스에서 기본 플로우·대체 플로우·예외 플로우를 써내는 것부터 시작해 보세요.

제목과 URL을 복사했습니다