소프트웨어 테스트 기법 — 화이트박스 vs 블랙박스
🔥 매회 출제 (priority 3)
🌱 왜 배우나
자동차를 점검한다고 해 보자. 보닛을 열어 엔진을 뜯어보는 점검이 있고, 시동을 걸고 직접 운전해 보며 이상한 점을 찾는 점검이 있다. 소프트웨어 결함도 똑같이 두 종류다. 코드 내부를 들여다봐야만 보이는 결함(특정 조건에서만 누락되는 로직 등)과, 겉으로 기능을 써 봐야 드러나는 결함(입력값 범위 오류 등)이 있다. 한쪽만으로는 놓친다. 그래서 내부 구조를 보는 화이트박스 테스트와 외부 동작만 보는 블랙박스 테스트, 두 접근법이 함께 쓰인다.
📖 핵심 개념
소프트웨어 테스트는 “어디를 보고 판단하느냐”에 따라 두 축으로 나뉜다.
- 화이트박스(White-box) 테스트: 소스 코드(내부 로직)를 들여다보며 “코드의 모든 줄·모든 분기가 실행됐는가?”를 확인한다.
- 블랙박스(Black-box) 테스트: 코드를 보지 않는다. 기능 명세서(프로그램이 무엇을 해야 하는지 적은 문서)만 보고 “입력에 맞는 올바른 출력이 나오는가?”를 확인한다.
화이트박스는 커버리지(코드가 실행된 비율)를 높이는 데 초점을 둔다. 블랙박스는 요구사항 대비 기능의 정확성을 검증하는 데 초점을 둔다.
🔍 시각화
┌──────────────────────────────────────────┐
│ 소프트웨어 테스트 │
├────────────────────┬─────────────────────┤
│ 화이트박스 │ 블랙박스 │
│ (코드 내부를 봄) │ (겉 동작만 봄) │
├────────────────────┼─────────────────────┤
│ · 구문 커버리지 │ · 동치 분할 │
│ · 분기(결정)커버리지│ · 경계값 분석 │
│ · 조건 커버리지 │ · 원인-결과 그래프 │
│ · MC/DC │ · 의사결정 테이블 │
│ · 경로 커버리지 │ · 상태 전이 테스트 │
├────────────────────┼─────────────────────┤
│ 강도 순서(약→강): │ 입력 영역 기반: │
│ 구문<분기<조건 │ 유효 클래스 / 무효 │
│ <MC/DC<경로 │ 클래스로 나눠 테스트 │
└────────────────────┴─────────────────────┘
+ 경험 기반: 오류 추정, 탐색적 테스트
↔️ 이웃 개념 구분
- 검증(Verification) vs 확인(Validation): 검증은 “제품을 올바르게 만들고 있는가?”를 개발 과정 중에 점검한다. 확인은 “올바른 제품을 만들었는가?”를 최종 결과가 사용자 요구를 충족하는지 따진다. 둘 다 V로 시작하지만 대상이 다르다.
- 분기 커버리지 vs 조건 커버리지: 분기 커버리지는 if문 전체의 참/거짓 결과를 모두 실행한다. 조건 커버리지는 if문 안 개별 조건 하나하나가 참/거짓을 모두 갖도록 실행한다. 조건 커버리지를 만족해도 분기 커버리지가 자동으로 채워지지는 않는다.
🔑 핵심 용어
- 화이트박스 테스트 (구조적 테스트, White-box Test): 소스 코드의 내부 로직을 보고 테스트한다. 세부 기법: 구문 커버리지(Statement Coverage, 모든 코드 줄 실행), 결정 커버리지(Decision = Branch Coverage, 모든 분기의 참/거짓 실행), 조건 커버리지(Condition Coverage, 개별 조건식 각각 참/거짓 실행), 경로 커버리지(Path Coverage, 가능한 모든 실행 경로 실행), MC/DC(Modified Condition/Decision Coverage, 각 조건이 독립적으로 결과에 영향을 주는지 확인)
- 블랙박스 테스트 (기능적 테스트, Black-box Test): 코드를 보지 않고 기능 명세만으로 테스트한다. 세부 기법: 동치 분할(Equivalence Partitioning, 입력값을 유효/무효 그룹으로 나눠 대표값 테스트), 경계값 분석(Boundary Value Analysis, 그룹 경계 부근의 값으로 테스트), 원인-결과 그래프, 의사결정 테이블, 상태 전이 테스트, 유스케이스 테스트
- 커버리지 강도 순서: 구문 < 결정(분기) < 조건 < 조건/결정 < MC/DC < 경로. 경로 커버리지는 가장 강력하지만 경우의 수가 폭발해 현실적으로 달성 불가능한 경우가 많다. 조건 커버리지가 분기 커버리지를 자동으로 포함하지 않는다는 점도 함께 기억하자.
- 경험 기반 테스트: 오류 추정(Error Guessing, 자주 틀리는 부분을 경험으로 짐작해 테스트), 탐색적 테스트(Exploratory Testing, 계획 없이 실시간으로 탐색하며 테스트)
- 검증(Verification): “올바르게 만들고 있는가?” 개발 과정에서 설계·명세 대비 점검
- 확인(Validation): “올바른 것을 만들었는가?” 최종 제품이 사용자 요구를 충족하는지 점검
✅ 스스로 가르쳐보기
“무엇을 보고 테스트하느냐”라는 한 문장으로 화이트박스와 블랙박스의 차이를 본인 말로 정의해 보세요. 그다음 각 기법의 대표 예 2개씩을 골라 친구에게 설명해 보면 됩니다.
체크포인트:
- 동치 분할과 경계값 분석이 왜 블랙박스 기법인지 설명할 수 있나요?
- 커버리지 강도 순서(구문 < 분기 < 조건 < MC/DC < 경로)를 막히지 않고 말할 수 있나요?
- 검증(Verification)과 확인(Validation)이 각각 어떤 질문에 답하는지 한 줄로 말할 수 있나요?
🎯 기출 포인트
화이트박스 vs 블랙박스 분류 문제가 매회 단골로 나온다. 동치 분할·경계값 분석은 블랙박스, 구문/결정/조건/경로 커버리지는 화이트박스로 또렷이 구분하자. 커버리지 강도 순서와 각 커버리지 정의를 서술하는 문제도 자주 나온다. 검증(Verification)과 확인(Validation)의 차이도 빈칸 채우기로 반복 출제된다.
🔗 연결 개념
mt-testing-002mt-quality-001