애플리케이션은 정상인데 테스트는 왜 실패하나요?
네트워크가 느리거나, DNS 조회가 실패하거나, 사이트가 403 또는 429로 응답하거나 봇 확인 절차를 표시하거나, 브라우저가 비정상 종료되면 종단 간 테스트가 실패합니다. 하지만 이 중 어느 것도 애플리케이션의 결함은 아닙니다. Verdict System LLC의 Nexus Studio는 이러한 실패에 TIMEOUT, UNREACHABLE, BLOCKED, CRASHED라는 별도의 판정을 부여합니다. 어느 것도 애플리케이션 버그로 보고하지 않습니다.
작성: Nexus Studio 팀, Verdict System LLC. 2026년 10월 7일.
버그가 없는데도 테스트가 실패하는 원인은 무엇인가요?
테스트는 어떤 일이 일어나지 않았다는 사실만 보고합니다. 원인은 코드와 무관한 다음 네 가지 영역에 있을 수 있습니다:
- 페이지가 느려서 테스트의 제한 시간이 초과됨;
- 이름을 해석하지 못하는 등의 이유로 호스트에 연결할 수 없음;
- 사이트가 403, 429, CAPTCHA 또는 봇 확인 절차로 스스로를 보호하여 요청이 제품에 도달하지 못함;
- 브라우저 또는 프로세스가 비정상 종료됨.
이 모든 상황이 단순한 실패로만 표시되면, 팀은 이를 버그로 등록하거나 실패 내용을 살펴보는 대신 다시 실행하는 습관을 들이게 됩니다. 어느 쪽이든 실제 결함은 잡음 속에 묻힙니다.
Nexus Studio는 버그가 아닌 실패를 어떻게 구분하나요?
테스트가 실패하면 엔진은 해당 실행의 오류 메시지와 네트워크 로그를 읽고, 정해진 순서대로 패턴 그룹과 대조합니다. 가장 먼저 일치하는 그룹이 판정을 결정합니다. 순서는 CONFIG_ERROR, CRASHED, BLOCKED, UNREACHABLE, TIMEOUT이며, 그다음에야 BREACHED_FLAKY 또는 BREACHED를 확인합니다. 따라서 버그 보고를 의미하는 BREACHED 판정은 환경이나 테스트 실행 도구의 어떤 패턴으로도 설명되지 않는 실패에만 내려집니다. 패턴은 Playwright와 Selenium WebDriver 양쪽의 오류 문구를 모두 포괄합니다.
TIMEOUT, UNREACHABLE, BLOCKED, CRASHED는 무슨 뜻인가요?
- TIMEOUT: 테스트가 제한 시간 내에 응답을 받지 못했습니다. 이것만으로 애플리케이션에 문제가 있다고도, 정상적으로 작동한다고도 할 수 없습니다: 해당 실행으로는 판단할 수 없습니다. 페이지 탐색이 시작되었지만 페이지가 느려 제한 시간을 초과했다면 TIMEOUT입니다.
- UNREACHABLE: 호스트에 전혀 연결할 수 없었습니다. 이름 해석 실패, 연결 거부, 컴퓨터의 네트워크 연결 끊김 등으로 페이지를 확인하기 전에 DNS 조회나 연결이 실패한 경우입니다. 인증서 오류는 여기에 해당하지 않습니다: 이는 발견된 문제로 처리됩니다.
- BLOCKED: 사이트가 403, 429, 차단 페이지 또는 봇 확인 절차로 스스로를 보호했습니다. 화면에 방어 수단이 표시되었다면 metadata.json에 해당 수단이 명시됩니다. 실제 Android 휴대전화가 절전 상태이거나 잠겨 있는 경우도 사전 조건이 충족되지 않았으므로 BLOCKED입니다.
- CRASHED: 브라우저 또는 프로세스가 비정상 종료되었습니다. 페이지가 닫히거나, DevTools 프로토콜 오류가 발생하거나, WebDriver 세션이 종료된 경우 등이 해당합니다. 이는 기반 환경의 문제입니다: 컴퓨터와 드라이버를 확인하세요.
판정 안내서에서 각 판정에 해당하는 정확한 오류 패턴을 확인할 수 있습니다.
CI 파이프라인에는 어떻게 표시되나요?
14개 판정 중 7개는 종료 코드 0을 반환합니다: SECURE, AUTO_RECOVER, FLAKY, CHAOS_RESILIENT, PERFORMANCE_DEGRADED, A11Y_VIOLATION, SECURITY_VIOLATION입니다. 나머지 7개는 종료 코드 1을 반환하며, TIMEOUT, UNREACHABLE, BLOCKED, CRASHED도 여기에 포함됩니다. 따라서 테스트를 통과하지 못했으므로 빌드는 여전히 실패로 표시되지만, 보고서와 기록에는 원인이 무엇인지 표시됩니다. pytest 및 Selenium 실행기는 실행을 아예 시작할 수 없을 때 종료 코드 2를 반환합니다.
버그가 아닌 각 실패에는 어떤 증거가 보관되나요?
네 가지 판정 모두 report.md, metadata.json, raw-data.json과 마지막 화면의 스크린샷을 보관합니다. 동영상은 판정에 따라 다릅니다:
- TIMEOUT 및 BLOCKED: 동영상은 기본적으로 꺼져 있습니다. 설정에서 실패 동영상 보관 대상 항목을 통해 켤 수 있습니다.
- UNREACHABLE: 페이지가 로드되지 않아 녹화해도 빈 화면만 나오므로 동영상을 제공하지 않습니다.
- CRASHED: 비정상 종료된 브라우저의 녹화본은 손상되므로 동영상을 제공하지 않습니다.
Playwright 웹 실행과 모바일 에뮬레이션 실행에서만 동영상을 녹화합니다. 실제 Android 휴대전화, Selenium 실행, API 테스트에서는 녹화하지 않습니다.
Jira 연동을 켜면 TIMEOUT은 이슈를 등록하지만, 차단, 비정상 종료, 사이트 연결 불가는 이슈를 등록하지 않습니다.
어떤 한계가 있나요?
- 분류는 오류 문구를 기준으로 합니다. 직접 작성한 메시지에
403,Forbidden또는Access Denied가 포함되어 있으면 BLOCKED로 분류됩니다. 사용자 지정 검증 메시지는 구체적으로 작성하고, 예상치 못한 판정이 나오면 metadata.json을 열어 확인하세요. - TIMEOUT은 애플리케이션이 정상적으로 작동한다는 증거가 아닙니다. 실행할 때마다 제한 시간을 초과하는 테스트는 살펴볼 필요가 있습니다.
- 제한 시간을 늘려도 제대로 작동하지 않는 요소를 숨길 수는 없습니다: 실패 시점만 늦어집니다.
- 이 판정들은 실행이 실패한 원인을 알려 줍니다. 원인을 없애 주지는 않습니다: 차단된 사이트는 접속 방식을 바꾸기 전까지 계속 차단된 상태로 남습니다.
어디에서 볼 수 있나요?
증거 페이지에서는 실패한 테스트 하나를 따라가며 각 판정이 디스크에 남기는 모든 파일을 나열합니다. 판정 안내서에서는 엔진이 14가지 판정을 어떤 순서로 내리는지 설명합니다. 30일 체험판으로 직접 만든 테스트에 동일한 엔진을 실행할 수 있습니다.