불안정한 테스트인가요, 실제 버그인가요?
불안정한 테스트는 아무도 수정하지 않았는데 실패 후 재시도에서 통과하지만, 실제 버그는 재시도로 달라지지 않는 원인 때문에 실패합니다. Verdict System LLC의 Nexus Studio는 모든 재시도를 기록하여 둘을 구분합니다: 재시도에서 통과한 실패는 FLAKY, 실제로 발견된 결함은 BREACHED, 실패 자체가 일관되지 않으면 BREACHED_FLAKY입니다. 재시도로 결함이 정상 실행으로 바뀌는 일은 없습니다.
작성: Nexus Studio 팀, Verdict System LLC. 2026년 10월 7일.
불안정한 테스트란 무엇인가요?
불안정한 테스트란 시도마다 결과가 다른 테스트입니다: 코드와 테스트가 그대로인데 한 번은 실패하고 다른 시도에서는 통과합니다. Nexus Studio에서 이 용어의 의미는 하나뿐입니다. FLAKY는 실패한 뒤 아무것도 복구되지 않은 상태에서 재시도로 통과한 테스트입니다. 애플리케이션이나 테스트의 무언가가 불안정하며, 수정된 것은 없습니다.
모든 시도에서 발생하는 확실한 실패는 자동 복구 단계에서 선택자 복구를 시도했다가 실패했더라도 불안정한 테스트가 아닙니다. 이전 버전의 엔진은 이런 경우를 FLAKY로 분류했습니다. 팀은 FLAKY를 "테스트가 잘못됐다"는 뜻으로 받아들이고 넘어가므로, 고장 난 애플리케이션이 잡음으로 취급되어 그대로 출시되었습니다. 이제 엔진은 그렇게 처리하지 않습니다.
재시도가 실제 버그를 숨기나요?
그럴 수 있으며, 그 이유는 상태의 개수에 있습니다. 통과와 실패만 있다면 재시도에서 통과하는 순간 실패한 실행이 정상으로 바뀌고, 애플리케이션의 간헐적 결함은 보이지 않게 됩니다. 이런 버그는 찾아내는 데 가장 큰 비용이 드는 유형 중 하나입니다. 실패가 순간적인 네트워크 끊김이나 브라우저 중단을 뜻할 수도 있다면, 팀은 실패 내용을 읽기보다 다시 실행하는 데 익숙해지고 테스트 모음은 신뢰를 잃습니다.
Nexus Studio는 재시도 사실을 숨기지 않습니다. 실패 후 통과한 테스트는 SECURE가 아닙니다. CI에서는 종료 코드 0을 반환하므로 빌드를 중단하지 않지만, 보고서와 기록에는 유보 사항이 있는 통과인 FLAKY로 표시됩니다. 전체 검사 순서는 14가지 판정이 결정되는 방식을 참조하세요.
FLAKY, BREACHED, BREACHED_FLAKY는 어떻게 다른가요?
- FLAKY: 실패 후 재시도에서 통과했으며, 복구된 것은 없습니다. 실패한 시도의 raw-data.json을 읽은 다음 기록의 추세를 확인하세요. 종료 코드 0을 반환합니다.
- BREACHED: 한 번의 시도에서 테스트가 실패했으며, 환경이나 테스트 실행 도구의 어떤 양상으로도 오류가 설명되지 않습니다. 검증문이 실패했습니다. 이것이 버그 보고이며, 종료 코드 1을 반환합니다.
- BREACHED_FLAKY: 앞서 재시도가 있었고 마지막 시도에서 테스트가 실패했으며, 환경이나 테스트 실행 도구의 어떤 양상으로도 설명되지 않습니다. 실패 자체가 일관되지 않습니다. 버그를 등록하기 전에 시도별 결과를 비교하세요. 종료 코드 1을 반환합니다.
이와 인접한 두 판정이 상황을 정확히 보여 줍니다. AUTO_RECOVER는 자동 복구로 선택자가 교체되어 통과한 경우이므로, 작성자가 지정한 요소 탐색자는 더 이상 작동하지 않으며 온전한 통과가 아닙니다. 첫 시도에서 시간 초과만으로 실패했다가 재시도에서 통과한 경우는 불안정성이 아닌 지연을 나타내므로 SECURE입니다.
실패를 BREACHED나 BREACHED_FLAKY로 판정하기 전에 분류기는 정해진 순서로 다른 원인을 배제합니다: 테스트 실행 도구 오류, 비정상 종료, 차단, 호스트 연결 불가, 시간 초과입니다. 어느 것으로도 설명되지 않는 실패만 결함으로 판정됩니다. 따라서 시간 초과나 CAPTCHA는 버그 보고로 처리되지 않습니다.
재시도 횟수는 어떻게 계산하나요?
엔진은 실행의 시도 번호를 읽습니다. 재시도 번호가 0보다 큰 통과 테스트는 FLAKY이지만, 선택자가 복구되었다면 AUTO_RECOVER입니다. 재시도 번호가 0보다 크고 환경적 원인으로 설명되지 않는 실패 또는 시간 초과 테스트는 BREACHED_FLAKY입니다. 온전한 통과가 되려면 재시도 번호가 0이고 복구된 선택자가 없어야 합니다.
FLAKY는 시도별 결과가 달랐다는 뜻일 뿐, 다른 의미는 없습니다. 재시도 없이 한 번의 시도에서 실패한 경우에는 절대 불안정한 테스트로 표시하지 않습니다. 기록의 각 행에도 retry_attempt와 attempts가 기록되므로 실행에 횟수 정보가 함께 남습니다.
각 판정은 어떤 증거를 남기나요?
- FLAKY: screenshot.png, metadata.json 및 raw-data.json. 폴더에는 실패한 시도의 raw-data.json이 보관되므로 재시도가 실패를 가렸더라도 해당 로그는 남습니다. 이는 기본적으로 켜져 있는 FLAKY / AUTO_RECOVER 통과 증거 보관 설정을 따릅니다.
- BREACHED_FLAKY: report.md, metadata.json, raw-data.json 및 screenshot.png가 남으며, 실패 영상도 기본적으로 보관됩니다.
- BREACHED: 동일한 파일이 남으며, 영상도 기본적으로 보관됩니다.
판정은 증거 폴더 이름에 포함됩니다. 예를 들어 이름이 [BREACHED]로 끝납니다. 증거 페이지에서는 실패한 테스트 하나를 대상으로 각 파일을 살펴봅니다.
기록에서는 결과가 뒤바뀌는 테스트를 어떻게 식별하나요?
실행 기록은 각 테스트와 브라우저 또는 기기별로 실행당 한 행을 보관하며, 판정, 재시도 차수, 오류 시그니처를 담습니다. 이 행을 바탕으로 세션별, 일별 또는 주별 추세를 표시합니다: 회귀 발생, 정상 복구, 계속 실패, 속도 저하. 통과했다가 실패하고 다시 통과한 테스트도 재실행 결과 속에 묻히지 않고 여기에 표시됩니다.
Evidence Locker와 Patrol의 위험 순위는 결과가 바뀌거나, 실패하거나, 시간을 소모하는 빈도에 따라 테스트를 정렬합니다. 또한 실행 기록에 로지스틱 회귀를 적용한 예측 위험도를 표시하며, 데이터가 부족하면 EWMA를 대신 사용합니다. 한두 번의 실행으로는 패턴을 알 수 없으므로, 실행 횟수가 5회 미만이면 어떤 테스트도 불안정하다고 분류하지 않습니다.
한계
- FLAKY와 SECURE, BREACHED_FLAKY와 BREACHED를 구분하는 기준은 재시도입니다. 재시도를 끄면 간헐적인 실패도 BREACHED로 판정됩니다.
- FLAKY는 시도마다 결과가 달랐다는 뜻입니다. 이유까지 알려주지는 않습니다. 애플리케이션이나 테스트에서 원인을 찾는 일은 여전히 사람의 몫입니다.
- 분류는 오류 텍스트를 읽어 이루어지므로, 사용자 지정 검증 메시지에
403또는Forbidden같은 단어가 포함되어 있으면 환경 문제로 해석될 수 있습니다. 예상과 다른 판정이 나오면 metadata.json을 열어 보세요. - 실행 횟수가 5회 미만이면 실행 기록과 위험 순위에서 어떤 테스트도 불안정하다고 분류하지 않습니다.
다음으로 살펴볼 내용
증거 페이지에서는 실패한 테스트가 남긴 모든 파일을 볼 수 있으며, Nexus Studio의 14가지 테스트 판정 방식에서는 검사 순서를 설명합니다. 30일 체험판으로 자체 테스트에 동일한 엔진을 사용할 수 있습니다.
먼저 자신의 컴퓨터에서 검증을 실행해 보려면, 실제 버그와 간헐적으로 실패하는 테스트를 어떻게 구별하나요?에 있는 실행 가능한 예제를 사용하세요.