엔드투엔드 테스트(End-to-End Test, E2E Test)

엔드투엔드 테스트는 소프트웨어 시스템을 처음부터 끝까지 검증하는 테스트 방법이다.
이는 사용자의 관점에서 전체 애플리케이션의 흐름을 테스트하여 모든 구성 요소가 올바르게 작동하는지 확인한다.

온라인 쇼핑몰의 엔드투엔드 테스트 예시:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# Selenium을 사용한 E2E 테스트 예시
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

class ShoppingMallE2ETest:
    def setUp(self):
        # 브라우저 실행 및 초기 설정
        self.driver = webdriver.Chrome()
        self.driver.get("https://example-shop.com")
        
    def test_complete_purchase_flow(self):
        # 1. 로그인
        self.login("test@example.com", "password123")
        
        # 2. 상품 검색
        search_box = self.driver.find_element(By.ID, "search")
        search_box.send_keys("노트북")
        search_box.submit()
        
        # 3. 상품 선택
        product = WebDriverWait(self.driver, 10).until(
            EC.presence_of_element_located((By.CLASS_NAME, "product-item"))
        )
        product.click()
        
        # 4. 장바구니 담기
        add_to_cart = self.driver.find_element(By.ID, "add-to-cart")
        add_to_cart.click()
        
        # 5. 결제 진행
        checkout_button = self.driver.find_element(By.ID, "checkout")
        checkout_button.click()
        
        # 6. 배송 정보 입력
        self.fill_shipping_info({
            "name": "홍길동",
            "address": "서울시 강남구",
            "phone": "010-1234-5678"
        })
        
        # 7. 결제 완료 확인
        confirmation = WebDriverWait(self.driver, 20).until(
            EC.presence_of_element_located((By.CLASS_NAME, "order-confirmation"))
        )
        assert confirmation.is_displayed()
        
        # 8. 주문 내역 확인
        order_number = confirmation.find_element(By.CLASS_NAME, "order-number").text
        assert len(order_number) > 0

특징과 목적

  1. 사용자 중심: 실제 사용자의 경험을 시뮬레이션한다.
  2. 전체 시스템 검증: 모든 구성 요소와 외부 종속성을 포함하여 테스트한다.
  3. 실제 환경 유사성: 프로덕션 환경과 유사한 조건에서 테스트를 수행한다.

테스트 범위

엔드투엔드 테스트는 다음과 같은 요소를 포함한다:

  1. 사용자 인터페이스 (UI)
  2. 백엔드 서비스
  3. 데이터베이스
  4. 네트워크
  5. 외부 시스템과의 통합

수행 시점

엔드투엔드 테스트는 일반적으로 개발 주기의 후반부에 수행된다.
단위 테스트와 통합 테스트가 완료된 후, 시스템 테스트의 일환으로 진행된다.

검증 대상

  1. 기능적 요구사항: 모든 기능이 예상대로 작동하는지 확인
  2. 비기능적 요구사항: 성능, 보안, 사용성 등을 검증
  3. 데이터 무결성: 전체 프로세스에서 데이터가 올바르게 처리되는지 확인

종류

  1. 기능적 E2E 테스트: 핵심 비즈니스 프로세스의 정확성 검증
  2. 회귀 E2E 테스트: 새로운 변경사항이 기존 기능에 영향을 미치지 않는지 확인
  3. 성능 E2E 테스트: 전체 시스템의 성능과 응답 시간 평가

진행 방식

  1. 테스트 시나리오 작성: 실제 사용자 행동을 모방하는 시나리오 개발
  2. 테스트 환경 구축: 실제 환경과 유사한 테스트 환경 준비
  3. 테스트 실행: 자동화 도구를 사용하여 테스트 수행
  4. 결과 분석: 발견된 문제점 기록 및 개선 사항 도출

엔드투엔드 테스트에서 자주 발생하는 문제들과 해결 방법

  1. 테스트 안정성 문제

    • 문제: 동적 웹 페이지에서 요소를 찾지 못하는 경우
    • 해결: 명시적 대기 조건 사용
    1
    2
    3
    4
    5
    
    # 안정적인 요소 탐색
    def wait_for_element(selector, timeout=10):
        return WebDriverWait(driver, timeout).until(
            EC.presence_of_element_located((By.CSS_SELECTOR, selector))
        )
    
  2. 데이터 종속성

    • 문제: 테스트 데이터가 다른 테스트에 영향을 미치는 경우
    • 해결: 각 테스트 전후로 데이터 초기화
    1
    2
    3
    4
    5
    6
    
    def setUp(self):
        self.cleanup_test_data()
        self.prepare_test_data()
    
    def tearDown(self):
        self.cleanup_test_data()
    
  3. 성능 이슈

    • 문제: 테스트 실행 시간이 너무 긴 경우
    • 해결: 병렬 테스트 실행
    1
    2
    3
    4
    5
    
    from concurrent.futures import ThreadPoolExecutor
    
    def run_parallel_tests(test_cases):
        with ThreadPoolExecutor(max_workers=4) as executor:
            results = list(executor.map(run_test, test_cases))
    

엔드투엔드 테스트를 효과적으로 수행하기 위한 팁

  1. 중요 시나리오 우선 테스트
    핵심 비즈니스 프로세스를 먼저 테스트한다.

  2. 자동화 도구 활용
    Selenium, Cypress 등의 도구를 활용하여 테스트를 자동화한다.

  3. 테스트 결과 모니터링
    실패한 테스트의 원인을 빠르게 파악할 수 있도록 상세한 로그를 남긴다.

  4. 지속적인 유지보수
    시스템 변경사항에 맞춰 테스트 시나리오를 주기적으로 업데이트한다.

예시

온라인 쇼핑몰 애플리케이션의 엔드투엔드 테스트 시나리오를 살펴보자:

  1. 사용자 등록 및 로그인
  2. 상품 검색 및 상세 정보 확인
  3. 장바구니에 상품 추가
  4. 주문 프로세스 진행 (배송지 입력, 결제 방법 선택)
  5. 결제 완료 및 주문 확인
  6. 주문 내역 확인
  7. 로그아웃

이 시나리오는 사용자의 전체 여정을 포함하며, 각 단계에서 UI, 백엔드 서비스, 데이터베이스, 결제 게이트웨이 등 모든 구성 요소가 올바르게 작동하는지 확인한다.


참고 및 출처