‘Zombie Tests’를 배포하지 마세요: Project Vandal v0.2.0 소개

발행: (2025년 12월 21일 오후 01:16 GMT+9)
6 분 소요
원문: Dev.to

Source: Dev.to

Stop Shipping “Zombie Tests”용 표지 이미지: Project Vandal v0.2.0 소개

배울 내용

  • The Zombie Test Problem – 왜 통과한 테스트가 실패한 테스트보다 더 위험할 수 있는가
  • Runtime UI Mutation – Vandal가 소스 코드를 재구성하는 대신 실시간 DOM을 어떻게 방해하는가
  • Shadow DOM Support – 표준 셀렉터에서 숨겨진 최신 웹 컴포넌트를 어떻게 탐색할지
  • Kill Ratio Metrics – 테스트 스위트의 실제 회복력을 정량화하기
  • Quick Integration – 테스트를 전혀 수정하지 않고 바로 사용할 수 있는 Playwright 래퍼

좀비 테스트 문제

100 % 초록색 테스트 스위트를 보면서 “이게 실제로 뭔가를 테스트하고 있는 건가, 아니면 단지 정상 흐름만 바뀌지 않아서 통과하고 있는 건가?” 라고 생각해 본 적이 있나요?
테스트 자동화에서는 테스트 부패(test rot)라는 현상에 자주 시달리게 됩니다—애플리케이션 로직이 깨져도 여전히 초록색을 유지하는 테스트들. 이러한 테스트들을 좀비 테스트(Zombie Tests)라고 부릅니다.

숨겨진 위험

좀비 테스트는 잘못된 안도감을 줍니다. 방대한 자동화 스위트가 있음에도 불구하고 버그가 프로덕션에 넘어가는 주요 원인 중 하나가 바로 이들입니다.

Project Vandal이란?

Vandal은 프론트엔드를 위한 결정론적 카오스‑엔지니어링 도구입니다. 기존의 소스 코드를 수정하는 변이 테스트(느리고 재빌드가 많이 필요함)와 달리, Vandal은 테스트 실행 중 브라우저 안의 실시간 DOM을 방해합니다.

순간

전통적인 도구들은 React/Vue 소스에서 if 문을 else 로 바꿉니다. Vandal브라우저의 현실을 바꿉니다. 클릭 리스너를 제거하고, UI 요소를 이동시키며, 테스트가 진행되는 동안 폼 상태를 방해합니다.

Vandal v0.2.0: 새로운 기능?

  1. Persistent Chaos (Navigation Survival) ⚓
    UI 변형이 페이지 새로고침 및 전환 시에도 add_init_script와 깊은 MutationObserver의 조합을 사용해 유지됩니다.

  2. Recursive Shadow DOM Support 🕵️‍♂️
    Vandal은 이제 Shadow DOM 경계를 재귀적으로 침투하여 여러 개의 shadow root 안에 숨겨진 요소도 타깃팅할 수 있습니다.

  3. Automatic Revert (Live Healing) 🩹
    요소의 원래 상태를 캐시하고 await v.revert_mutation()을 사용해 실시간으로 복원합니다.

“Vandalism” 플레이북

  • Stealth Disablepointer-events: none을 설정합니다. 버튼은 완벽해 보이지만 사용자 상호작용에 대해 “죽은” 상태가 됩니다.
  • UI Shift – 요소를 100 px만큼 이동시킵니다. 하드코딩된 좌표에 의존하는 테스트는 실패합니다.
  • Slow Load – 요소를 일시적으로 숨겨 5초 UI 정지를 시뮬레이션합니다. 테스트가 적절히 대기하는지 확인합니다.
  • Data Sabotage – 중요한 라벨과 입력 값을 무의미한 데이터로 교체하여 데이터 검증 로직을 확인합니다.

설치

pip install project-vandal

기본 사용법

Vandal를 기존 Playwright 테스트에 비동기 컨텍스트 매니저로 통합하세요:

from vandal import Vandal

async def test_critical_path(page):
    async with Vandal(page) as v:
        # 1. Apply a persistent mutation
        await v.apply_mutation("stealth_disable", "#checkout-btn")

        # 2. Navigate – the mutation survives!
        await page.goto("https://myapp.com/cart")

        # 3. This SHOULD fail if your test is resilient
        try:
            await page.click("#checkout-btn", timeout=2000)
            print("🧟 MUTANT SURVIVED: Test is a Zombie!")
        except:
            print("💀 MUTANT KILLED: Test is Robust.")

    # Generate a beautiful HTML report
    v.save_report("ci_resilience_report.html")

보고: 콘솔에서 HTML로

Vandal v0.2.0은 이제 구조화된 JSON과 다듬어진 HTML 보고서를 내보냅니다. 콘솔 로그를 뒤져볼 필요가 없습니다—시각적인 점수표가 CI/CD 대시보드에 바로 준비됩니다.

고효과 사용 사례

  • CI/CD Gatekeeping – UI 변이체의 10 % 이상이 살아남는 경우 빌드를 실패시킵니다.
  • Shadow DOM Validation – 찾기 어려운 웹 컴포넌트를 자신 있게 테스트합니다.
  • Assertion Benchmarking – 자동화 스위트의 “Kill Ratio”를 정량화합니다.

Vandalism 운동에 참여하세요

코드 커버리지 라인 수를 세는 것을 멈추세요. assertion effectiveness 측정을 시작하세요. Project Vandal은 “녹색 체크마크”에 다시 의미를 부여합니다.

오픈 소스

Project Vandal은 오픈‑소스 이니셔티브입니다. PyPI에서 확인하고 오늘 바로 테스트 스위트의 회복력을 검증해 보세요.

Back to Blog

관련 글

더 보기 »

게임.html

죄송합니다, 제공해 주신 링크의 내용을 확인할 수 없습니다. 번역이 필요한 텍스트를 직접 입력해 주시면 한국어로 번역해 드리겠습니다.