Record & Replay로 이벤트 기반 테스트를 결정적으로 재현하는 방법

Record & Replay의 이벤트 캡처·재생 구조와 시간 동기화, 플랫폼 차이 대응, 회귀 테스트 자동화 설계를 정리한다.

2026-08-14 · 최초 발행 2025-12-15

재현되지 않던 이벤트를 테스트 자산으로 남기는 방식

복잡한 UI, 네트워크, 센서, OS 이벤트는 결함이 발생한 순간을 다시 만들기 어렵다. Record & Replay(R&R)는 테스트 케이스 실행 중 발생한 사용자 입력과 시스템·외부 이벤트를 저장하고, 동일한 시퀀스로 다시 실행해 결과를 비교하는 이벤트 기반 테스트 기법이다.

기록 대상은 키보드 스캔코드와 포인터 좌표 같은 UI 입력에 한정되지 않는다. OS 시그널과 IPC, 네트워크 패킷, 파일 I/O, 센서·하드웨어 인터럽트, 타이머 콜백도 이벤트 단위로 다룬다. 이벤트의 순서와 시간정보를 보존해 시간 제약이 있는 환경에서도 결함을 결정적으로 재현하고 회귀 테스트에 활용하는 것이 목적이다.

시간은 벽시계 기준의 절대 시간과 이벤트 사이 간격인 상대 시간을 함께 사용한다. 재현성을 확보하려면 순서 보존뿐 아니라 동시성의 인과관계 관리와 타임스탬프 정규화도 필요하다. 이벤트 데이터에는 이벤트 ID, 타입, 타임스탬프, 해상도·로케일·디바이스 상태 같은 컨텍스트, 페이로드, 체크섬을 담고 JSON/Protobuf 등의 직렬화 포맷 및 스키마 버전을 관리한다.

캡처부터 결과 판정까지의 구성

이벤트 캡처 레이어는 OS·런타임 후킹, 드라이버·프레임워크 인스트루멘테이션으로 입력을 수집한다. 저부하·저지연 캡처를 유지하면서 누락을 줄이기 위해 커널과 라이브러리 경로를 이중화할 수 있다.

타임 오케스트레이터는 고해상도 타임스탬프를 수집하고 클럭 드리프트와 지연 허용오차 윈도우를 관리한다. 시간 임계 테스트 케이스에서는 페이싱과 버스 부하 제어도 이 계층의 역할이다.

플랫폼마다 다른 키코드, 좌표계, 엔디안은 어댑터 계층에서 정규화한다. 정규화된 로그는 불변 이벤트 저장소에 보관하고 인덱싱해 대용량 재현 성능을 확보한다. 재생 엔진은 이벤트를 검색·변환하고 타임라인을 구성한 뒤 대상 시스템에 안전하게 주입한다. 실패 상황에서는 재동기화와 부분 재생을 지원한다.

결과는 스냅샷, 해시, 스크린샷, 도메인 어서션으로 판정한다. 검증기는 노이즈 허용치, 퍼지 매칭, 차등 테스트(diffing)를 제공할 수 있다.

기록과 재생이 이어지는 흐름

기록 단계에서는 기능테스팅 캡처를 시작한 뒤 이벤트를 후킹하고 송신·저장한다. 재생 단계에서는 기능테스팅을 다시 시작하고 저장된 이벤트를 검색·변환해 전송·전달한 뒤 결과를 받는다.

이벤트 후킹이벤트 송신이벤트 저장이벤트 검색/변환타임라인 구성이벤트 전송/전달결과전달저장된 이벤트 전달아니오기능테스팅 캡쳐시작OS/Runtime HookEvent BusEvent Store(Log/Index)기능테스팅 재수행시작Event Loader/MapperPacer(상대/절대 시간)Dispatcher/InjectorOracle/Report타임스탬프 오차 임계값지연 보정/스킵

스키마 버전이 맞지 않으면 변환 룰을 적용하고, 변환할 수 없다면 테스트를 중단한 뒤 최소 재현 가능한 시점까지 롤백한다. 시간 오차가 임계값을 넘으면 페이싱을 조정하거나 상대시간 모드로 전환한다. 네트워크 패킷은 배치 재생으로 버스 폭주를 막는다.

이벤트 배치에는 트랜잭션 단위의 원자성을 적용한다. 일부가 실패하면 지수 백오프를 사용하는 재시도 정책과 아이들 타임 삽입으로 재생 흐름을 관리한다.

시간·플랫폼 변동성을 다루는 운영 조건

시간 제약(Time Critical, TC) 환경에서는 고해상도 타이머와 커널 타임스탬프를 사용하고, 상대 간격을 기준으로 페이싱한다. 동시성을 재현하려면 같은 시간대의 이벤트 그룹을 처리하면서 인과관계를 보존해야 하며, 프레임 드롭 허용치도 정의한다.

플랫폼 안정성(Platform Stability, PS)을 위해서는 샌드박스나 컨테이너에서 격리 실행하고 워치독, 헬스체크, 자동 복구 루틴을 둔다. 드라이버, 윈도우 서버, 윈도잉 시스템의 결함에 대비해 리트라이와 백업 채널(예: 가상 HID)도 준비한다.

플랫폼 다양성(Platform Diversity, PD)은 키코드·좌표·로캘·해상도를 어댑터로 정규화하고 스케일, DPI, 입력 장치 차이를 보정하는 문제다. 장치 매트릭스에서 병렬 재생을 수행하고 capability 탐색 결과에 따라 조건부 재생을 적용한다.

개발 환경(Development Environment, DE)의 결정성도 확보해야 한다. 툴체인을 고정(pinning)하고 리프로듀서블 빌드와 아티팩트 스냅샷, 의존성 잠금파일을 사용한다. 디버그 심볼 수집, RNG 시드 고정, 시스템 시간·TZ·로케일 고정 역시 재현성을 뒷받침한다.

이벤트를 재생해 검증하는 대상

데스크톱·웹 UI 회귀 테스트에서는 사용 시나리오를 녹화해 다중 OS와 브라우저에서 재생하고, 크로스플랫폼 레이아웃·포커스·단축키를 검증한다. 모바일 앱은 터치 제스처와 센서 이벤트를 기록해 다양한 해상도·DPI·OS 버전에서 재생할 수 있다.

마이크로서비스에서는 API, 메시지, 네트워크 트래픽을 캡처하고 장애 시점의 트래픽을 샌드박스에서 결정적으로 재생해 결함을 분석한다. 임베디드·IoT 펌웨어는 센서와 버스(SPI/I2C/CAN) 이벤트 시퀀스를 재생하며, 전력·온도 프로파일과 결합한 내환경 테스트에 활용한다.

결함 재현 시간은 6090% 단축되고, 회귀 테스트 인력 투입은 4070% 절감될 수 있다. 다중 플랫폼 테스트를 병렬화하면 일일 케이스 처리량은 35배 증가하며, 시간과 환경을 고정하는 효과로 플레이크 테스트 비율은 3060% 감소한다. 결정적 재현은 원인 규명 속도와 이슈 재오픈 감소에 연결되고, 요구사항이 바뀔 때는 차등 재생으로 영향 범위를 신속히 파악할 수 있다. 테스트 지식이 스크립트로 남아 팀 간 전파도 쉬워진다.

캡처와 재생 수준을 선택할 때

캡처/재생 레벨 성능 확장성 일관성 안정성 운영 편의
UI 이벤트 레벨(키/마우스)
OS 입력 레벨(디바이스/드라이버)
프로토콜/네트워크 레벨
API/메서드 훅킹 레벨

운영에 넣기 전 확인할 항목

이벤트 모델에서는 타입, 스키마, 버전, 타임스탬프 정책을 먼저 정의한다. 수집·저장 경로는 손실 없는 캡처, 압축·인덱싱, 개인정보 마스킹을 고려한다.

재생 인프라는 페이싱과 재동기화, 병렬 실행, 격리 환경을 갖춰야 한다. 결과 판정에는 오라클, 허용오차·퍼지 매칭 기준, 리포팅 자동화가 필요하다. 모니터링과 로깅 상관분석, 실패 자동 triage를 운영 가드레일로 두면 재생 실패 자체도 분석 가능한 신호가 된다.

테스트 자동화이벤트 기반 테스트회귀 테스트결정적 재현