테스트 성공을 멈춰라. Database를 죽여라. 🧨
Source: Dev.to
Introduction

QA를 위한 카오스 엔지니어링 소개. Docker와 Playwright를 사용해 실패를 주입함으로써 복원력을 테스트하는 방법을 배웁니다.
우리는 “행복한 경로”(Happy Path)에 집착합니다.
전통적인 QA에서는 모든 것이 완벽할 때 애플리케이션이 정상 작동하는지를 검증합니다:
- 네트워크가 안정적이다.
- 데이터베이스가 5 ms 안에 응답한다.
- 서드파티 API가 온라인이다.
하지만 실제 운영에서는 아무것도 완벽하지 않습니다. 파드가 충돌하고, 네트워크가 지연되며, 데이터베이스가 잠기기도 합니다.
이런 상황이 발생하면, 일반적인 Selenium/Playwright 테스트는 단순히 Failed라고 표시할 뿐이며 어떻게 애플리케이션이 실패했는지는 알려주지 않습니다. 오류 메시지를 우아하게 표시했나요? 아니면 흰 화면과 원시 스택 트레이스로 크래시했나요?
이때 카오스 엔지니어링이 등장합니다.
From QA to Resilience Engineering
카오스 엔지니어링은 SRE(사이트 신뢰성 엔지니어)만을 위한 것이 아닙니다. 현대 QA로서 우리는 “작동하나요?”라는 질문을 멈추고 “깨졌을 때는 어떻게 되나요?”라는 질문을 해야 합니다.
오늘은 Python, Playwright, Docker SDK를 사용해 카오스 테스트를 작성하는 방법을 보여드리겠습니다.
The Goal
우리는 데이터베이스가 실패하기를 기다리지 않을 것입니다. 테스트 중간에 데이터베이스를 의도적으로 죽이고 프론트엔드가 이를 우아하게 처리하는지를 검증할 것입니다.
The Stack
- Python – 테스트 로직
- Playwright – UI 상호작용
- Docker SDK – 카오스 주입기
The Code 🐍
import docker
import time
from playwright.sync_api import Page, expect
def test_database_failure_resilience(page: Page):
# 1. Setup: Connect to Docker
client = docker.from_env()
# Target your specific database container
try:
db_container = client.containers.get("postgres-prod")
except docker.errors.NotFound:
raise Exception("Database container not found! Is Docker running?")
# 2. Happy Path: Verify the app loads normally
print("✅ Step 1: Loading Dashboard...")
page.goto("http://localhost:3000/dashboard")
expect(page.locator(".user-balance")).to_be_visible()
# 🧨 CHAOS TIME: Kill the Database
print("🔥 Step 2: Injecting Chaos (Stopping DB)...")
db_container.stop()
# 3. Resilience Assertion
# The app should NOT show a white screen or crash.
# It SHOULD show a friendly "Connection Lost" toast or retry button.
print("👀 Step 3: Verifying graceful degradation...")
# Trigger an action that requires the DB
page.reload()
# Assert UI handles the error
expect(page.locator(".error-toast")).to_contain_text("Connection lost")
expect(page.locator(".retry-button")).to_be_visible()
# 🩹 RECOVERY: Bring the Database back
print("🩹 Step 4: Healing the infrastructure...")
db_container.start()
# Give the app a moment to reconnect (or trigger a manual retry)
page.locator(".retry-button").click()
# 4. Self‑Healing Assertion
# The app should recover without requiring a full page refresh
expect(page.locator(".user-balance")).to_be_visible()
print("✅ Test Passed: System is resilient.")
Why This Matters
이 테스트를 실행했을 때 애플리케이션이 500 Server Error 페이지를 보여준다면, 버그를 발견한 것입니다—기능 버그가 아니라 아키텍처 버그입니다.
회귀 테스트 스위트에 “카오스 테스트”를 추가하면 제품이 단순히 동작하는 것을 넘어 생존한다는 것을 보장할 수 있습니다.
Want More Chaos?
저는 The 5‑Minute QA라는 일일 뉴스레터를 운영합니다. 시니어 QA와 SDET를 위한 콘텐츠이며, 매일 아침 카오스 엔지니어링에 관한 실용적인 팁을 하나씩 보내드립니다.