#DevOps

쉼 없이 도는 테스트, 사람이 어디까지 돌봐야 할까요? - 토스닥터(Toss Doctor)

쉼 없이 도는 테스트, 사람이 어디까지 돌봐야 할까요? - 토스닥터(Toss Doctor)
01

Summary

토스는 매주 쏟아지는 수백 개의 빌드를 어떻게 손 하나 까딱 않고 테스트할까?

스스로 테스트 코드를 작성하고 화면 변화에도 자가 치유(Self-healing)하는 AI QA 엔진 '토스닥터 V2'의 모든 것

매주 반복되는 앱 배포 스모크 테스트를 효율화하기 위해 토스가 고안해 낸 자가 치료형 QA 자동화 도구 '토스닥터 V2'의 동작 메커니즘을 파헤칩니다. 시나리오 작성만으로 코드가 자동 빌드되는 코드젠, 팝업 블로커를 치우는 자가 치유 기술, 그리고 실패 원인을 판별해 스스로 코드를 고치는 자동 복구 프로세스까지, 플랫폼 테스팅의 극적인 혁신 방안을 담았습니다.

  • 01사람은 Given-When-Then 시나리오만 작성하고, 코드는 LLM과 Appium MCP가 실제 디바이스 UI 요소를 보며 직접 코딩하는 방식 도입
  • 02전체 화면의 XML 트리를 넘기지 않고 화면 목록 수준에서 단계별 탐색을 진행하여 LLM 토큰 소모량을 획기적으로 감축
  • 03팝업이나 가림막 툴팁으로 계좌 입력이 가로막히는 긴급 상황에서, 쓰러진 즉시 화면을 분석해 치워주는 심폐소생술 '스마트파인더' 탑재
  • 04실패 분석 결과 'recoverable' 판정이 내려지면 실제 기기에 접속하여 스스로 코드를 수정한 뒤 'lessons.md'에 변경점 기록까지 완료
  • 05세 명의 수동 QA가 이틀 동안 매달려야 했던 1,375개 리그레션 테스트를 단 3주 만에 자동화 프레임워크 '토스체커'로 완전 마이그레이션

RECOMMENDATION

수동 모바일 QA 업무의 자동화 한계를 극복하고 싶거나, 화면 UI 변경 시마다 깨지는 깨지기 쉬운(Flaky) 테스트 코드로 인해 소모적인 유지보수 업무에 고통받고 있는 플랫폼/DevOps 엔지니어와 QA 엔지니어에게 적극 추천합니다.

The Problem

토스 앱은 매주 플랫폼별로 5~7개의 배포 후보 빌드가 나와 회원가입부터 송금까지 반복적인 수동 스모크 테스트를 진행해야 했습니다. 이를 해결하고자 도입한 토스닥터 V1 역시 화면 UI가 조금만 바뀌어도 테스트가 쉽게 깨지고, 실패 원인을 사람이 직접 분석해야 하는 유지보수 리소스 문제가 뒤따랐습니다.

The Solution

토스닥터 V2는 Gherkin 문법의 BDD 시나리오를 바탕으로 LLM과 Appium MCP를 연결해 코드를 자동 생성하도록 개선했습니다. 또한 테스트 중 예기치 않은 UI 변경이나 팝업을 동적으로 인지 및 복구하는 스마트파인더(SmartFinder)와, 실패의 수동 복구 가능 여부를 판별해 스스로 코드를 수정하고 회고를 작성하는 자가 치유 및 자동 복구 메커니즘을 설계했습니다.

The Result

이러한 고도화된 자가 치유와 분석 프로세스를 통해 스모크 테스트의 유지보수 비용을 크게 아꼈으며, 이를 전사 리그레션 영역으로 확장한 '토스체커'를 구축했습니다. 결과적으로 테스터 3명이 꼬박 이틀 동안 매달려 수동으로 검증해야 했던 1,375개의 리그레션 테스트 케이스를 3주 만에 자동화하는 데 성공했습니다.

Trade-off

검증(then) 단계에 대해서는 유사도 기반 매칭(similar-match) 기능을 비활성화하여 눈속임 방식의 거짓 성공 연쇄 반응을 차단했으며, 화면 구조 전체(XML)를 매번 분석하는 데 드는 막대한 LLM 토큰 비용을 최소화하기 위해 단계별 요소 탐색 기법을 적용해야 했습니다.

03

Key Concepts

Concept · 01

Appium MCP (Model Context Protocol)

모바일 앱 테스트 프레임워크인 Appium과 LLM 모델을 실시간으로 중계하여, AI가 직접 디바이스의 UI 상태를 조회하고 적절한 조작 명령을 내릴 수 있도록 돕는 통신 프로토콜 환경입니다.

  • 토스닥터 V2에서 LLM이 코드 생성을 위해 가상/실제 장비의 UI 요소들을 검출하고 활용 가이드를 짚어낼 수 있도록 기기와 AI 사이의 통로를 마련해 줍니다.
  • 테스트가 실패해 즉시 멈춘 상황에서 Appium MCP를 연결해 실제 요소의 XML 노드 타입을 판별한 뒤 코드를 고치도록 연계했습니다.
Concept · 02

자가 치유 (Self-Healing)

소프트웨어 테스트 환경에서 타겟 엘리먼트의 속성(ID, XPath 등)이 변경되거나 예상치 못한 방해 요소(팝업 등)가 생겼을 때, 테스트가 실패로 중단되지 않고 동적으로 요소를 재식별하거나 블록을 우회하여 테스트를 완주하는 기술입니다.

  • 어제 없던 이벤트 팝업이나 화면 가림 툴팁을 블로커로 자동 판단해 스스로 닫은 뒤, 원래 수행하려던 송금 등의 핵심 태스크를 계속 수행합니다.
  • 성공적으로 복구된 이력은 JSONL 로그로 적재하여 유사한 UI가 나타났을 때 보다 빠르게 자가 치유를 완수하도록 튜닝했습니다.
Concept · 03

BDD (Behavior-Driven Development) 및 Gherkin 문법

사용자의 비즈니스 시나리오를 중심으로 테스트 케이스를 명세화하는 개발 방법론으로, 'Given(준비)-When(행동)-Then(결과)'의 자연어 구조(Gherkin 문법)를 활용해 누구나 코드가 검증하고자 하는 핵심 목적을 한눈에 파악할 수 있도록 해 줍니다.

  • 테스터가 장황한 테스트 시퀀스를 기계적인 코드로 작성하지 않고, 오직 시나리오(.feature) 레벨에서 요구사항 명세에만 집중할 수 있도록 테스트 이원화를 구현했습니다.
  • 이렇게 사람이 설계한 시나리오 문맥은 LLM이 코드를 한 단계씩 안전하게 짤 수 있는 훌륭한 구현 가이드 역할을 수행합니다.