[CSTS] 테스트 분류와 테스팅 방법(2장~8장)

2025. 7. 24. 23:11·csts

테스트는 다음 세가지의 기준으로 분류된다

  • 테스트 레벨(컴포넌트, 통합, 시스템, 인수)
  • 테스트 유형(기능, 품질/비기능)
  • 테스트 설계 기법(동적, 정적

 

테스트 레벨

  • 컴포넌트(단위) 테스트: 단위 모듈이 테스트 대상, 개별 단위 모듈을 독립적으로 테스트
    • 개별 모듈을 실행하는 테스트 드라이버, 테스트 스텁이 필요
    • FIRST 원칙
      • Fast: 컴포넌트 테스트는 빠르게 수행되어야 함
      • Isolated: 컴포넌트 테스트가 다른 컴포넌트 테스트에 의존하지 않도록 해야 함
      • Repeatable: 테스트를 몇 번 실행해도 동이한 결과가 나와야 함
      • Self-validating: 사람의 개입 없이 테스트가 통과되었는지 알수 있도록 작성
      • Timely: 제 때 수행되어야 함
  • 통합 테스트: 컴포넌트 간의 상호 연동이 제대로 수행되는지 검사
    • 상호작용에 초점 => 전송/수신된 데이터 중심, 기능에 초점 => 연결된 상황에서 전체적인 기능
    • 빅뱅 방식: 전체 컴포넌트를 한 번에 통합하여 테스트 => 어떤 컴포넌트가 문제인지 확인이 어려움
    • 점진적 통합 방식
      • 상향식 통합: 하위의 컴포넌트를 그룹화 후 테스트 드라이버를 작성하여 수행
        • 하위 컴포넌트를 충분하게 테스트 가능
        • 하향식 통합에 필요한 테스트 스텁을 제공하는 비용이 들지 않음
      • 하향식 통합: 상위에 있는 컴포넌트를 테스트 하기 위해 하위 컴포넌트를 테스트 스텁으로 대체한 후 수행
        • 테스트 스텁에서 실제 모듈로 대치되면 변경이 발생하므로 리그레션을 수행 => 새로운 모듈을 추가할 때 마다 리그레션 테스팅을 수행
        • 상위 컴포넌트의 결함을 빠르게 발견할 수 있음
        • 많은 수의 테스트 스텁이 필요 => 스텁 구현 비용이 높은 경우 비효율적
      • 샌드위치 통합: 상향식 + 하향식
  • 시스템 테스트: 전체 시스템을 대상으로 요구사항 명세서에 명시된 방식으로 시스템이 동작하는지 확인
    • 기능 측면 뿐만 아니라 비기능적인 요구사항을 만족하는지도 검증
  • 인수 테스트: 전체 시스템을 테스트, 시스템 테스트와 달리 고객 관점에서 확인
    • 알파테스트: 개발자 환경에서 통제된 상태로 수행
    • 베타테스트: 실제 환경, 실제 사용자가 수행하고 피드백

순서: 컴포넌트 => 통합 => 시스템 => 인수

테스트 레벨이 올라갈수록 테스트 범위도 넓어진다.

 

테스트 유형

  • 기능 테스트: 기능 요구사항을 확인, 모든 테스트 수준(컴포넌트, 통합, 시스템, 인수)에서 진행
  • 비기능 테스트: 성능, 보안성, 신뢰성 등 품질 요구사항을 확인, 일반적으로 시스템, 인수 테스트에서 진행

 

테스트 설계 기법

정적 테스트: 테스트 대상을 실행하지 않음

  • 리뷰: 결함을 검출하거나 프로젝트의 진행 상황을 점검, 전문가 그룹이 수행
    • 1)경영진 준비 2)리뷰계획 2)리뷰 절차 개요 설명 4)작업물 개요 설명 5)개별 준비 6)그룹검토 7)재작업 8) 후속작업
    • 관리 리뷰: 진행 상황을 모니터하고 계획과 현재 일정 상태를 평가
      • 그룹 검토 회의는 관리 스태프들이 참여하며 관리자가 주재
    • 기술 리뷰: 정의된 계획 및 명세를 준수하고 있는지 검토, 프로젝트의 기술적 상태를 확인
      • 대표 엔지니어가 주재
    • 인스펙션(inspection): 가장 형식화된 대표적인 리뷰 방식, 동료 검토
      • 가능한 한 개발 초기에 검사, 팀은 두 명 이상
      • 주재자: 인스펙션을 계획, 회의 자료 전달/주재, 퍼실리테이터가 담당
      • 작성자: 회의에 필요한 자료를 제출, 작성자는 주재자가 될 수 없음
      • 낭독자: 회의를 이끄는 역할
      • 기록자: 모든 회의 논쟁/질문/답변을 기록, 작성자는 기록자가 될 수 없음, 주재자는 가능
      • 검토자: 관리자 직책을 담당하는 사람은 금지
      • 리뷰 계획 => 인스펙션 절자 개요 설명 => 인스펙션 작업물에 대한 개요 설명 => 준비 => 검토 회의 => 재작업 => 후속작업
    • 워크스루(walk-through): 결함을 검출할 뿐만 아니라 참가자들의 교육이나 지식 교육을 위해 수행
      • 인스펙션보다는 비형식적
      • 작성자 본인이 보통 회의를 주재, 기록자 역할도 가능
      • 관리자 직책은 팀 멤버로 참여 금지
    • 감사: 객관적인 표준과 규제에 대한 준수를 독립적으로 평가
  • 정적 분석: 자동화된 방식으로 도구에 의해서 수행
    • 코딩 표준: 프로그램을 작성할 때 지켜야 하는 규약
      • 코딩 스타일: BSD, K&R, GNU
      • MISRA-C: C 프로그래밍 언어의 코딩 가이드라인
    • 복잡도 측정
      • McCabe의 순환 복잡도
        • 순환복잡도 = 간선 수 - 노드 수 + 2
        • 순환복잡도 = 닫힌 영역의 개수 + 1
        • 순환복잡도 = 분기 노드들의 개수 + 1
    • 자료 흐름 분석
      • d: defined, k: killed, u:used, ~x: 모든 선행 행위와 x와 관련이 없음, ~x: x이후 행위들이 x와는 관련이 없음
~d 문제없음
du 문제없음
dk 잠재적 결함, 전혀 자료가 사용되지 않음
~u 잠재적 결함, 정의되지 않고 바로 사용
ud 문제없음
uk 문제없음
~k 잠재적 결함, 정의되지 않고 무효화 됨
ku 심각한 결함, 무효화되었는데 사용
kd 문제없음
dd 잠재적 결함
uu 문제없음
kk 잠재적 결함
d~ 잠재적 결함
u~ 문제없음
k~ 문제없음

 

if(...)//BSD
{
	doSometing();
}
if(...){//K&R
	doSometing();
}
if(...)//GNU
	{
		doSometing();
	}

동적 테스트: 테스트 대상을 실행 => 테스트 케이스 생성 필요

  • 테스트 비용을 절감하고 결함을 누락하지 않고 테스트 하기 위해 테스트 케이스를 잘 설계해야 함
  • 명세 기반 테스트(블랙박스 테스트): 소스 코드를 참고하지 않고 테스트 케이스 결정
    • 동등분할, 분류 트리 기법, 경계값 분석, 조합 테스트, 상태 전이 테스트, 결정표 테스트...
  • 구조 기반 테스트(화이트박스 테스트): 소스 코드를 참고하여 테스트 케이스 결정
    • 문장, 결정, 조건, 결정/조건, 다중조건, MCDC(변형된 조건/결정)
  • 경험 기반 테스트: 기존의 경험을 바탕으로 수행하는 테스트
    • 오류추정: 테스터의 경험을 바탕으로 개발자가 범할 수 있는 실수를 추정하여 테스트 케이스 설계
    • 탐색적 테스트: 테스트 대상에 대한 이해, 설계, 실행을 병행하는 방식, 즉 문서화 없이 테스트 대상에 대한 이해를 바탕으로 즉석에서 테스트 케이스를 결정하여 수행

 

테스트 자동화

테스트 도구를 선정하는 프로세스

요구사항 정의 => 도구조사 => 도구평가 => 파일럿 프로젝트(도구의 시험판 버전을 사용하거나 파일럿 프로젝트를 수행하여 도구의 품질을 평가) => 도구 선정 => 도구 도입

 

테스팅 방법

리그레션(regression) 테스트: 소프트웨어가 변경된 후 실행, 변경이 결함을 만들었는지와 요구사항을 충족시키는지 검증

  • 수정이 발생하는 경우: 결함 수정 작업, 기능보강 작업, 적응 작업, 예방 작업 
  • Retest-all 전략: 모든 테스트 케이스를 사용하는 방식
  • 선택적 리그레션 테스트 전략: 기존의 테스트 케이스 중에서 일부만 선정
  • 테스트 최소화 전략: 중복된 테스트 케이스를 제거하여 테스트 케이스의 수를 줄이는 방식
  • 테스트 우선 순위화 전략: 테스트 케이스에 우선순위를 두어 우선순위가 높은 케이스만 활용
    • APFD: 우선순위의 효과성을 평가하는 척도/테스트 케이스 실행 수 대비 검출된 결함의 비율
  • 소프트웨어가 변경되면 각 레벨 테스트 순서대로(컴포넌트, 통합, 시스템, 인수) 각각 리그레션 테스트를 수행

 

소프트웨어 생명 주기 모델과 테스트

  • 순차적 개발 모델
    • 폭포수 모델: 테스트를 하나의 개발단계로 간주, 코딩 후에 테스트가 수행
    • V-모델: 개발과 테스트를 동등하게 보고 구분, 개발 시작과 동시에 테스트 활동 시작
  • 진화적 개발 모델: 이터레이션을 반복 수행
    • 나선형 모델: 우선 프로토타입을 개발 => 프로토타입에 대한 테스트 및 사용자 평가를 거쳐 다음 개발 주기 시작 => 새로운 개발 주기가 시작될 때마다 위험 분석을 수행, 매 단계에서 테스트를 수행 => 심각한 결함을 늦게 발견할 가능성이 낮음
    • 애자일 개발 모델
      • 애자일 선언 네가지 가치 
        • 사람 및 상호 의사 교환이 프로세스나 도구보다 우선
        • 동작하는 소프트웨어가 포괄적인 문서보다 우선
        • 고객과의 협력이 계약 협상보다 우선
        • 변화에 반응하는 것이 계획을 따르는 것보다 우선
      • TDD(테스트 주도 개발): 테스트 케이스를 먼저 작성하고 테스트 케이스로 테스트 되는 실제 프로그램의 코드를 나중에 작성하는 방식, TDD를 수행하는 도중에 리팩토링 수행
  • 위험 기반 테스트
    • 피처에 대한 위험 분석을 바탕으로 테스트에 대한 계획과 설계, 실행 등의 활동 
    • 테스트 대상과 범위를 결정할 때는 테스트 미수행에 따른 위험을 고려해야 함
    • 즉 위험도가 낮으면 테스트에서 제외할 수 있고 높으면 반드시 포함
    • 위험도 산정 방식
      • 심각성, 긴급성, 발생가능성
    • 고강도 테스트: 매우 높은 위험도, 즉각적인 수정이 요구되는 결함에 가능한 많은 자원을 사용
    • 균형적 테스트: 프로젝트의 주어진 예산과 일정을 고려하여 효율적인 테스트를 수행
    • 부가적 테스트: 수행되는 테스트 활동에 일부 추가적인 작업
    • 결함 보고: 테스트 범위에 포함시키지 않음
  • 모델 기반 테스트
    • 테스트 절차를 수행할 수 있는 정보가 자동으로 추출될 수 있을 정도록 정형화되고 상세한 모델을 바탕으로 수행
    • 대부분의 활동을 자동화 가능
    • 모델 자체에 존재할 수 있는 다양한 문제를 일찍 식별할 수 있음 => 장애가 발생하면 비용이 큰 곳에서 수행
    • 모델을 구축하는데 비용이 추가된다는 단점

 

품질 특성과 비기능 테스트

주특성 부특성 설명
기능 적합성 기능 완전성 명시된 요구사항의 구현 정도
기능 정확성 정확하게 결과를 제공하는 정도
기능 적절성 사용자 목적 달성에 도움을 주는 정도
성능 효율성 시간 반응성 기능 수행이 요구시간을 만족시키는지
자원 효율성 자원의 유형 및 양이 요구사항을 만족시키는지
수용성 시스템의 최대 한계가 요구사항을 만족시키는지
호환성 공존성 다른 소프트웨어에 해로운 영향을 주지 않고 환경 및 자원을 공유하면서 요구된 기능을 수행하는지
상호 운영성 둘 이상의 시스템이 정보를 공유할 때 이상이 없는지
사용성 적합 인식성 사용자의 요구에 적절한 기능인지
학습 용이성 사용자가 사용법을 익힐 수 있는지
운영 용이성 시스템을 작동 및 제어를 쉽게하는지
사용자 오류 방지성 시스템에서 발생한 오류로부터 사용자를 보호하는지
사용자 인터페이스 심미성 인터페이스가 만족스러운지
접근성 누구든 사용할 수 있는지
신뢰성 성숙성 소프트웨어 구성요소가 표준적 환경에서 신뢰도 요구를 충족시키는지
가용성 사용자가 원하는 시간에 사용 및 접근이 가능한지
결점 허용성 결함이 존재하더라도 의도한대로 시스템이 작동하는지
회복 가능성 중단 및 실패 발생시 데이터를 복구할 수 있는지
보안성 기밀성 권한이 있는 자만 데이터에 접근 가능
무결성 데이터가 무단으로 변경되지 않음
부인방지 사건 및 행동에 대해 부인하지 못하게
책임성 누가 책임을 져야 하는지 확인할 수 있어야 함
진본성(인증성) 사건 및 행위에 대해 행위자임을 증명할 수 있는 정도
유지보수성 모듈성 최소의 영향을 가진 개별 구성요소로 구성된 정도
재사용성 자산이 하나 이상의 시스템에 사용
분석성 변화에 대해 영향을 받는지 평가할 수 있는 정도
변경 용이성 시스템이 문제 없이 효과적으로 수정될 수 있는 정도
테스트 용이성 테스트 수행을 용이하게 하는 정도
이식성 적용성 다른 환경에서도 잘 사용 가능한지
설치 용이성 잘 설치되고 제거될 수 있는지
대체 용이성 동일한 환경, 동일한 목적을 위해 다른 소프트웨어에 대치될 수 있는 정도

 

성능 테스팅 종류

  • 부하 테스팅: 부하를 게속 증가시키면서 임계점을 찾음
  • 스트레스 테스팅: 임계점 이상의 부하를 가하여 비정상적인 상황에서의 처리를 테스트
  • 스파이크 테스팅: 짧은 시간에 부하가 몰릴 때 시스템의 반응을 측정
  • 내구성 테스팅: 오랜 시간 동안 시스템에 높은 부하를 가하여 시스템의 반응을 파악

 

사용성 평가 방법

  • 휴리스틱 평가: 전문가가 체크리스트를 통해 사용성에 관한 문제점을 도출, 3~5명 정도의 적은 인원의 전문가를 활용하여 비교적 쉽게 실시, 효율적이로 빠르게 수행
  • FGI(Focus Group Interview): 그룹 인터뷰, 공통점이 있는 사용자들을 그룹별로 모아 의견을 나누고 정보를 수집
  • 인지적 워크쓰루: 학습 용이성 분석에 중점을 둔 방법, 실제 사용자를 대상으로 사전 설명없이 주어진 과제를 달성하도록 함

 

 

'csts' 카테고리의 다른 글

[CSTS] 구조 기반 테스트 & 명세 기반 테스트 (9, 10장)  (1) 2025.07.25
[CSTS] 테스트 개요  (2) 2025.07.10
'csts' 카테고리의 다른 글
  • [CSTS] 구조 기반 테스트 & 명세 기반 테스트 (9, 10장)
  • [CSTS] 테스트 개요
chanhuy
chanhuy
  • chanhuy
    차늬
    chanhuy
  • 전체
    오늘
    어제
    • 분류 전체보기 (34)
      • algorithm (9)
      • Python (2)
      • database (8)
      • csts (3)
      • Operating System (0)
      • 오픈소스SW (1)
      • Git & Github (4)
      • 프로젝트 회고 (3)
      • 정보처리기사 (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Python
    D&C
    algorithm
    알고리즘
    graph algorithms
    Reduction
    pl/sql
    greedy
    backtracking
    시간복잡도
    dynamic programming
    프로젝트후기
    오픈소스SW
    index
    Git
    COMMIT
    recursion
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
chanhuy
[CSTS] 테스트 분류와 테스팅 방법(2장~8장)
상단으로

티스토리툴바