본문으로 건너뛰기
입문약 35분

테스트 분류와 테스팅 방법 — 3축 분류, 점진적 통합, 테스트 더블·FIRST, 리그레션 전략, 생명 주기 모델

CSTS는 테스트를 레벨·유형·설계 기법의 독립된 세 축으로 분류한다. 레벨별 테스트 기준 문서(V 모델), 빅뱅·상향식·하향식·샌드위치 통합과 스텁·드라이버의 쓰임, 더미·스텁·스파이·목·페이크와 FIRST 원칙, ISO/IEC 25010:2011 8개 주특성과 비기능 테스트, 리그레션 테스트의 네 가지 전략, 폭포수·V·진화적·애자일 모델에서 테스트가 시작되는 시점, 위험 기반·모델 기반 테스트의 정의를 시험 문장 단위로 정리한다.

  • #CSTS
  • #테스트레벨
  • #통합테스트
  • #테스트더블
  • #FIRST
  • #리그레션
  • #생명주기모델
  • #ISO25010

개념

세 축은 서로 독립이다

CSTS 가이드는 테스트를 세 개의 독립된 축 으로 분류한다.

축값
테스트 레벨컴포넌트(단위) · 통합 · 시스템 · 인수
테스트 유형기능 / 비기능(성능·신뢰성·보안 …)
테스트 설계 기법정적(리뷰·정적 분석) / 동적(명세 기반·구조 기반·경험 기반)

독립이라는 말은 어떤 조합도 가능하다 는 뜻이다. "통합 레벨에서 성능 유형을 명세 기반 기법으로" 테스트할 수 있다. 그래서 "구조 기반 테스트는 시스템·인수 테스트 단계에서만 수행한다" 같은 문장은 틀렸다 — 구조 기반은 주로 컴포넌트 레벨에서 쓰지만 어느 레벨에서도 쓸 수 있다(예: 통합 레벨의 호출 커버리지, 시스템 레벨의 메뉴 커버리지).

레벨 — 무엇을 기준으로 테스트하는가 (V 모델)

레벨대상기준 문서
컴포넌트(단위)함수·클래스·컴포넌트를 독립적으로상세 설계
통합컴포넌트 사이의 인터페이스·상호작용구조(아키텍처) 설계
시스템전체 시스템요구사항 명세
인수전체 시스템을 고객·사용자 관점 에서고객·사용자의 필요와 기대

진행 순서는 컴포넌트 → 통합 → 시스템 → 인수 다. 시스템 테스트와 인수 테스트는 둘 다 전체 시스템이 대상이지만 관점 이 다르다. 함정 보기: "단위 테스트는 모듈을 통합할 때 쓰는 인터페이스를 대상으로 한다"(X — 그것은 통합 테스트).

통합 방식 — 빅뱅과 점진적 통합

컴포넌트를 한 번에 붙이는 빅뱅(Big-bang) 은 준비가 간단하지만, 장애가 나면 어느 컴포넌트가 원인인지 찾기 어렵다. 그래서 몇 개씩 차례로 붙이는 점진적(Incremental) 통합을 쓴다. 원인 찾기는 쉬워지는 대신 스텁과 드라이버를 여러 번 만들어야 한다.

방식순서필요한 것장점단점
상향식(Bottom-up)하위 → 상위드라이버 (상위 호출자를 대신)하위 컴포넌트를 충분히 테스트, 스텁 불필요시스템 전체 모습이 늦게 보임
하향식(Top-down)상위 → 하위스텁 (하위 피호출자를 대신)주요 제어 흐름·골격을 일찍 확인스텁이 많이 필요, 하위 테스트가 늦음
샌드위치상·하 동시둘 다병행 진행관리 복잡

외우는 법: 드라이버는 위에서 "운전해(호출해)" 주고, 스텁은 아래에서 "받아 주는" 가짜 다. 하향식은 아직 없는 아래를 스텁으로, 상향식은 아직 없는 위를 드라이버로 채운다. 하향식은 다시 깊이 우선·너비 우선으로 나뉜다.

테스트 더블 — 컴포넌트를 고립시키는 다섯 가지 가짜

컴포넌트 테스트는 독립적으로 해야 하므로 협력 객체를 가짜로 바꾼다. 가이드가 쓰는 구분은 다음과 같다(모의 객체는 절차 지향의 스텁을 객체 지향으로 옮긴 것이다).

이름하는 일한 줄 판별
더미(Dummy)자리만 채움. 기능 불필요, 호출되면 예외"인자로 넘기기만 한다"
스텁(Stub)정해진 값을 돌려줌"잔액 조회하면 850을 준다"
스파이(Spy)대상이 협력 객체로 보낸 출력 을 기록해 검증"몇 번, 무엇으로 호출됐나 기록"
목(Mock)기대 호출을 미리 정하고 상호작용 을 검증verify(acct, times(1)).withdraw(500)
페이크(Fake)실제 기능을 단순하게 동작하는 구현으로 대체메모리 DB, 가짜 파일 시스템

Mockito 예시로 보면 when(acctMock.balance()).thenReturn(850) 이 스텁 역할, verify(acctMock, times(1)).withdraw(500) 이 목의 상호작용 검증이다.

FIRST 원칙 — 좋은 컴포넌트 테스트의 다섯 성질

글자원칙위반 예
FFast — 빨라야 한다실제 DB·네트워크를 호출해 전체 실행에 수 분
IIsolated — 다른 테스트에 의존하지 않는다테스트 A가 만든 데이터를 테스트 B가 읽음 → 순서 바꾸면 실패
RRepeatable — 몇 번 실행해도 같은 결과현재 시각·난수에 의존
SSelf-Validating — 사람 개입 없이 통과/실패 판정로그를 사람이 눈으로 확인
TTimely — 제때(대상 코드 작성 직전·직후) 작성릴리스 직전에 몰아서 작성

Isolated가 깨지면 실행 순서에 따라 결과가 달라진다. 단독 실행은 통과하는데 전체 실행에서만 실패하는 테스트가 전형적 증상이다.

유형 — ISO/IEC 25010:2011 8개 주특성과 부특성

주특성부특성대표 테스트
기능 적합성기능 완전성·정확성·적절성기능 테스트
성능 효율성시간 반응성·자원 효율성·용량부하·스트레스·용량 테스트
호환성공존성·상호 운용성상호 연동, 크로스 브라우징
사용성적절성 인식·학습성·운용성·사용자 오류 방지·UI 미학·접근성사용성 테스트, 접근성 진단
신뢰성성숙성·가용성·결함 허용성(장애 허용성)·회복 가능성장애 주입, 복구 테스트
보안성기밀성·무결성·부인 방지·책임성·진정성취약점 점검, 침투 테스트
유지보수성모듈성·재사용성·분석성·수정성·시험성정적 분석, 복잡도 측정
이식성적응성·설치성·대체성설치·이전 테스트

단답형은 "부특성 넷(성숙성·가용성·장애 허용성·회복 가능성)을 주고 주특성을 묻는" 형태가 많다 (답: 신뢰성). 가이드는 호환성 테스트 예로 Selenium Grid(허브-노드 구조로 여러 OS·브라우저 조합에서 병렬 실행)를 들고, 자동화만으로는 사람 눈으로 확인할 부분이 남으므로 수동 테스트를 병행 하라고 쓴다. 기능 테스트를 뺀 나머지가 비기능 테스트 이고, 품질 특성별로 수행하는 테스트를 묶어 유형 테스트 라 부른다.

테스팅 방법 ① 리그레션 테스트

변경(결함 수정·기능 추가·성능 개선·환경 적응·유지보수성 개선) 뒤에 의도치 않은 결함이 생기지 않았는지, 기존 요구를 여전히 충족하는지 확인한다. 전략 네 가지를 이름으로 외운다.

전략뜻
Retest-all기존 TC를 전부 다시 실행. 안전하지만 비싸다
선택적 리그레션변경 영향을 받는 TC만 골라 실행
테스트 최소화커버리지를 유지하면서 중복 TC를 줄인 집합 실행
테스트 우선순위화결함을 빨리 찾을 가능성이 높은 순서로 실행

변경이 생기면 컴포넌트 → 통합 → 시스템 레벨 순서로 각 레벨마다 리그레션을 수행한다. 리그레션은 반복성이 높아 자동화 1순위 다.

테스팅 방법 ② 생명 주기 모델별 테스트 시점

모델테스트가 시작되는 때특징
Code-and-Fix따로 없음(디버깅의 일부)소규모·일회성에만 타당
폭포수구현 완료 후 한 번모든 산출물이 갖춰진 상태에서 시작하지만 결함 해결 비용이 크다
V 모델개발 시작과 함께요구분석 단계에서 시스템 테스트 계획·설계, 구조 설계 단계에서 통합 테스트 계획. 산출물 리뷰·정적 분석 병행
진화적(반복·점진)이터레이션마다이터레이션마다 테스트 계획을 세움
나선형주기마다주기마다 위험 분석 후 테스트 조정
프로토타이핑시제품마다점진적 완성, 안에 작은 V 모델이 들어 있다
애자일스프린트 안에서 지속TDD(테스트 먼저 → 통과하는 코드), 지속적 통합(CI)

TDD의 순서는 "실패하는 테스트 작성 → 통과할 최소 코드 → 리팩터링"이다. CI는 개발자가 저장소에 반영할 때마다 통합·빌드·테스트가 돈다는 뜻이고, 하루에도 여러 번 일어날 수 있다.

테스팅 방법 ③ 위험 기반·모델 기반

  • 위험 기반 테스트 — 피처별 위험 분석 결과로 테스트 계획·설계·실행을 정한다. 테스트하지 않았을 때 위험이 낮은 것은 제외할 수 있지만 높은 것은 반드시 포함 한다. 고위험 피처에는 이른 레벨부터, 더 강한 기법, 더 엄격한 완료 기준을 적용한다(레슨 7의 L × I)
  • 모델 기반 테스트 — TC·절차·입력·예상 결과를 자동으로 뽑을 수 있을 만큼 정형적이고 상세한 모델 에서 생성한다. 모델 구축 비용이 추가되지만 이후 자동화로 효율이 높고, 모델 자체의 결함을 일찍 찾는다. 자동차·의료 같은 안전 필수 분야에서 쓴다(s1-m03-l11, s4-m54 모듈)

실무에서 왜 필요한가

통합 방식은 일정과 직결된다. 하위 모듈(결제 게이트웨이 연동 등)이 먼저 끝나는 프로젝트에서 하향식을 고집하면 스텁만 쌓이고, 반대로 화면 골격을 먼저 고객에게 보여야 하는 프로젝트에서 상향식을 고르면 시연이 늦어진다. "어느 쪽이 먼저 준비되는가"로 방식을 정하고, 그에 맞춰 스텁· 드라이버 작업을 계획에 넣는다.

테스트 더블 용어는 개발자와의 대화에서 곧바로 쓰인다. "여기는 목으로 호출 횟수를 검증해야 하나요, 스텁이면 충분한가요?"라는 질문을 할 수 있으면 단위 테스트 리뷰에서 QA의 발언권이 생긴다. FIRST의 Isolated·Repeatable 위반은 CI에서 플래키 테스트 로 나타난다(s2-m07-l03).

실습 과제

과제 1 — 통합 방식 고르기 (8분)

호출 구조가 Main → {Order, Member}, Order → {Payment, Stock} 인 시스템이 있다. (가) 하향식(너비 우선)으로 통합할 때 각 단계에서 필요한 스텁을 적는다. (나) 상향식으로 통합할 때 필요한 드라이버를 적는다. 힌트: 하향식 1단계는 Main만 실제이고 Order·Member가 스텁이다.

과제 2 — 테스트 더블 이름 붙이기 (7분)

다음을 더미·스텁·스파이·목·페이크로 분류한다. ① 로그인 테스트에서 쓰지 않는 Logger 인자에 빈 객체를 넘긴다 ② 환율 API 대신 항상 1,300을 돌려주는 객체를 쓴다 ③ 메일 발송 객체가 몇 번 호출됐는지 기록해 뒀다가 테스트 끝에 확인한다 ④ 실제 DB 대신 메모리에서 동작하는 저장소를 쓴다 ⑤ "결제 승인이 정확히 한 번, 금액 500으로 호출되어야 한다"를 미리 정하고 검증한다 정답: 더미 / 스텁 / 스파이 / 페이크 / 목.

과제 3 — FIRST 위반 고치기 (10분)

자기 팀 테스트 코드(또는 공개 저장소)에서 FIRST를 위반한 테스트 하나를 찾아, 어떤 글자를 위반했는지와 고치는 방법(스텁 도입, 고정 시각 주입, 데이터 초기화 등)을 적는다.

과제 4 — 부특성 역추적 (5분)

다음 부특성 묶음의 주특성을 쓴다. (가) 공존성·상호 운용성 (나) 기밀성·무결성·부인 방지 (다) 모듈성·분석성·시험성 (라) 적응성·설치성·대체성. 정답: 호환성 / 보안성 / 유지보수성 / 이식성.

자가 체크리스트

  • 레벨·유형·설계 기법 세 축과 각 축의 값을 쓸 수 있다
  • 레벨별 기준 문서를 V 모델로 짝지을 수 있다
  • 상향식은 드라이버, 하향식은 스텁이 필요한 이유를 설명할 수 있다
  • 다섯 가지 테스트 더블을 한 줄로 구분할 수 있다
  • FIRST 다섯 글자와 위반 예를 하나씩 댈 수 있다
  • 25010:2011 8개 주특성과 신뢰성의 부특성 넷을 쓸 수 있다
  • 리그레션 전략 네 가지 이름을 쓸 수 있다
  • 폭포수와 V 모델의 테스트 시작 시점 차이를 설명할 수 있다

흔한 실수

  • 스텁과 드라이버를 거꾸로 쓴다. "하향식 = 스텁"으로 한 쌍만 외우면 나머지는 따라온다
  • 재테스팅과 리그레션을 같은 것으로 본다. 재테스팅은 고친 결함을 같은 TC로 확인, 리그레션은 변경이 다른 곳을 깨뜨렸는지 확인
  • V 모델을 "테스트를 나중에 하는 모델"로 기억한다. V 모델은 개발 시작과 함께 테스트 계획·설계가 시작된다는 점이 폭포수와의 차이다
  • 목과 스텁을 구분하지 않는다. 시험에서는 "출력·상호작용을 검증하느냐(목·스파이), 값을 돌려주기만 하느냐(스텁)"로 갈린다
  • 비기능 = 성능 으로 좁혀 생각한다. 보안·사용성·이식성도 모두 비기능 유형이다

참고 자료

  • TTA, 『CSTS 가이드 — 일반등급』 2장 테스트 분류와 테스팅 방법, 3장 소프트웨어 개발 단계와 테스트, 4장 품질 특성과 비기능 테스트, 6장 소프트웨어 생명 주기 모델과 테스트
  • ISO/IEC 25010:2011 Systems and software Quality Requirements and Evaluation (SQuaRE) — System and software quality models — 2023년 개정으로 대체되었으나 CSTS 가이드 기준판
  • Meszaros, G., xUnit Test Patterns: Refactoring Test Code, Addison-Wesley, 2007 — 테스트 더블 분류의 원전
  • Langr, J., Hunt, A., Thomas, D., Pragmatic Unit Testing in Java 8 with JUnit, Pragmatic Bookshelf, 2015 — FIRST 원칙
  • Mockito 공식 문서 — when·verify 사용법
  • Selenium Grid 공식 문서 — 허브·노드 구조(현행 Grid 4는 라우터·분배기 등으로 세분화)
  • 이 커리큘럼 안: s1-m01-l03 「테스트 레벨」, s1-m01-l04 「테스트 유형」, s2-m07-l04 「개발 방법론과 테스트」, s2-m07-l05 「BDD와 TDD」

낯선 말 풀이

이 레슨에 나온 약어입니다. 본문에서도 처음 나올 때 점선으로 표시해 두었습니다 (제목과 링크 글자는 그대로 둡니다).

DB — 데이터베이스
데이터를 넣어 두고 꺼내 쓰는 저장소. 보통 표 여러 개가 서로 연결된 형태다.
ISO/IEC — 국제표준화기구·국제전기기술위원회 공동 표준
두 국제 단체가 함께 낸 표준이라는 표시. 뒤에 붙는 숫자가 문서 번호다.
UI — 사용자 인터페이스
사람이 직접 보고 누르는 부분 — 화면, 버튼, 입력창.
OS — 운영체제
기기를 돌리는 바탕 프로그램 — 윈도우, 맥, 안드로이드 같은 것.
TC — 테스트 케이스
무엇을 어떻게 해보고 무엇이 나와야 하는지를 한 건으로 적어 둔 것. 시험 문제 한 문항에 해당한다.
CI — 지속적 통합
코드를 올릴 때마다 자동으로 합쳐서 빌드하고 시험까지 돌리는 방식.
QA — 품질보증
만든 것이 쓸 만한지 확인하고, 애초에 덜 망가지게 만드는 방법을 정하는 일. "테스트"는 그 일의 일부다.
API — 응용 프로그램 인터페이스
프로그램끼리 주고받는 창구. 사람이 화면 버튼을 누르는 대신, 프로그램이 정해진 주소로 요청을 보내 답을 받는다.
TTA — 한국정보통신기술협회
국내 정보통신 표준을 만들고 시험·인증도 하는 기관.
SQuaRE — 소프트웨어 품질 요구·평가 규격군
소프트웨어 품질을 무엇으로 보고 어떻게 재는지 정한 국제 규격 묶음의 이름.
JUnit — 제이유닛
자바로 만든 프로그램의 단위 시험을 쓰고 돌리는 가장 널리 쓰이는 도구.
BDD — 행위 주도 개발
"어떤 상황에서 무엇을 하면 무엇이 된다"는 문장으로 요구사항을 적고, 그 문장을 그대로 시험으로 돌리는 방식.

용어집 전체 보기