---
type: knowledge
domain: engineering
status: active
last-reviewed: 2026-07-06
---

# QA 원리

> 한 줄 정의
> 버그가 실제로 숨는 곳과, 한정된 시간에 그것을 찾아내는 탐색 전략. 테스트 코드 작성법은 [[백엔드 원리]]·[[프론트엔드 원리]]의 테스트 섹션, 판정 기준 자체는 [[요구사항과 완료 조건]] — 이 문서는 **검증 행위**를 다룬다.

## 버그는 균등 분포하지 않는다 (결함 군집)

전체를 균등하게 훑는 것이 가장 비효율적인 QA다. 버그의 대부분은 소수 영역에 몰린다:

| 서식지 | 왜 몰리나 | 대표 사냥 케이스 |
|------|----------|----------------|
| 최근 변경분 | 코드가 움직인 곳이 깨진다 | diff 범위 + 그 파일을 부르는 곳 |
| 경계값 | 개발자는 가운데만 테스트한다 | 0, 1, -1, 빈 값, 최대치, 최대치+1, off-by-one |
| 상태 전이 | 해피패스만 설계된다 | 뒤로 가기, 중복 제출, 세션 만료 중 진행, 새로고침 |
| 통합 지점 | 소유자가 둘이라 아무도 안 본다 | 타임아웃, 부분 실패, 응답 포맷 변경 |
| 시간 | 로컬에선 안 드러난다 | 타임존, 월말·윤년, 자정 걸침, 서버-클라 시계 차 |
| 돈·수량 | 반올림 규칙이 암묵적 | 소수점 반올림, 통화 단위, 0원 결제, 환불 후 재시도 |
| 텍스트 입력 | "정상 문자열"만 넣어본다 | 이모지, 200자 초과, 공백만, `<script>`, 앞뒤 공백 |

## 회귀 범위는 RCRCRC로 좁힌다

전량 회귀는 불가능하다. 회귀 대상 선정 휴리스틱 (Karen Johnson):

- **R**ecent — 최근 추가·변경된 것
- **C**ore — 이게 죽으면 제품이 없는 핵심 플로우
- **R**isky — 원래 잘 깨지던 기술적 위험 지대
- **C**onfiguration — 환경·설정 따라 갈라지는 것
- **R**epaired — 최근 고친 곳 (수정은 새 버그의 산지)
- **C**hronic — 만성적으로 재발하는 곳

## 스모크 10분 규칙

> [!WARNING] 스모크 실패 = 상세 테스트 시작 금지
> 로그인 → 코어 플로우 1개 → 돈 흐름 1개를 10분 안에 확인한다. 여기서 깨지는 빌드에 상세 테스트를 시작하는 것은 시간 낭비 — 반려하고 기다린다.

## 탐색적 테스트 — 투어 메타포

체크리스트 밖의 버그는 투어로 잡는다. 시간 박스(30분~1시간)를 정하고 하나의 렌즈로만 돈다:

| 투어 | 렌즈 |
|------|------|
| 돈 흐름 투어 | 돈이 생기고 움직이고 사라지는 모든 경로만 따라간다 |
| 신입 투어 | 아무것도 모르는 첫 사용자로 온보딩을 통과한다 — 빈 상태가 다 보인다 |
| 파괴자 투어 | 모든 입력에 최악을 넣는다 (경계값·특수문자·연타) |
| 인터럽트 투어 | 모든 플로우를 중간에 끊는다 (뒤로, 새로고침, 네트워크 차단, 앱 전환) |

## 버그 리포트 품질이 수정 속도를 결정한다

- **최소 재현 단계**: 5단계를 넘으면 줄일 수 있는지 먼저 시도. 재현 안 되는 리포트의 절반은 버그가 아니라 리포트 문제다.
- **기대 vs 실제**를 반드시 분리해 쓴다 — "이상해요"는 리포트가 아니다.
- **심각도 ≠ 우선순위**: 심각도는 피해 크기(기술 판단), 우선순위는 수정 순서(비즈니스 판단). QA는 심각도만 확정하고 우선순위는 제안만 한다.
- 심각도 보정: **FAIL/Critical은 실제 결함에만.** 취향·개선 제안은 LOW로 — 사소한 이슈로 차단하면 판정 자체의 신뢰가 죽는다.

## 살충제 역설 — 시나리오는 늙는다

같은 테스트를 반복하면 그 테스트가 잡는 버그만 사라지고 나머지는 산다 (Beizer). 회귀 셋은 분기마다 갱신하고, 탐색적 투어로 사각을 순환 커버한다.

## 자동화 경제학

자동화 여부는 신념이 아니라 산수다: **실행 빈도 × 수동 비용 × 실패 시 피해**가 작성·유지 비용을 넘을 때만 자동화한다. 릴리즈마다 도는 스모크는 1순위, 한 번 보고 말 화면은 손으로.

## 에이전트 적용

- **Judge 독립성**: 검증자는 구현자의 자기 평가(dev-summary)를 읽지 않는다. 요구사항 원본 + 실제 변경 파일만 — 구현자의 서사에 오염되면 같은 사각을 공유한다.
- **완료 조건 1:1 대조**: 판정은 인상이 아니라 [[요구사항과 완료 조건]]의 기계 검증 가능 조건을 하나씩 실행한 결과다.
- LLM 판정자를 쓸 때의 편향 보정은 [[LLM-as-a-Judge]].

## 관련 문서

- [[요구사항과 완료 조건]] — 판정 기준의 원천
- [[디버깅 원리]] — 발견 이후 원인 수렴
- [[백엔드 원리]] · [[프론트엔드 원리]] — 테스트 코드 레이어
- [[실패사례-기록법]] — 만성(Chronic) 지대의 기록
