포스트

14. 애플리케이션 테스트케이스 설계

14. 애플리케이션 테스트케이스 설계

소프트웨어 테스트

개념

  • 구현된 소프트웨어에서, 사용자가 요구하는 기능의 동작과 성능, 사용성, 안정성 등을 만족하기 위하여 소프트웨어의 결함을 찾아내는 활동

  • 노출되지 않은 숨어있는 결함(Fault)을 찾기 위해 소프트웨어를 작동시키는 일련의 행위와 절차

  • 오류 발견을 목적으로 프로그램을 실행하여 품질을 평가하는 과정

  • 개발된 소프트웨어의 결함과 문제를 식별하고 품질을 평가하며 품질을 개선하기 위한 일련의 활동

필요성

  • 오류 발견 관점

  • 오류 예방 관점

  • 품질 향상 관점

기본 원칙

  • 테스팅은 결함이 존재함을 밝히는 활동
    = 완벽한 테스팅은 불가능

  • 테스팅은 개발 초기에 시작

  • 결함 집중 | Defect Clustering
    • 애플리케이션 결함의 대부분은 소수의 특정한 모듈에 집중되어 존재
    • 파레토 법칙 : 전체 결과의 80%가 전체 원인의 20%에서 일어나는 현상
  • 살충제 패러독스 | Pesticide Paradox
    • 동일한 테스트 케이스로 반복 실행하면 결함을 발견할 수 없으므로 주기적으로 테스트 케이스를 리뷰하고 개선
  • 테스팅은 정황 | Context에 의존
    • 정황과 비즈니스 도메인에 따라 테스트를 다르게 수행
  • 오류-부재의 궤변 | Absence of Errors Fallacy
    • 사용자의 요구사항을 만족하지 못하는 오류를 발견하고 그 오류를 제거하였다 해도, 해당 애플리케이션의 품질이 높다고 말할 수 없음

프로세스

  1. 테스트 계획
  2. 테스트 분석 및 디자인
  3. 테스트 케이스 및 시나리오 작성
  4. 테스트 수행
  5. 테스트 결과 평가 및 리포팅

산출물

테스트 계획서

  • 테스트 목적과 범위 정의

  • 대상 시스템 구조 파악

  • 테스트 수행 절차

  • 테스트 일정

  • 조직의 역할 및 책임 정의

  • 종료 조건 정의

테스트 케이스

  • 테스트를 위한 설계 산출물

  • 입력 값, 실행 조건, 기대 결과로 구성된 테스트 항목의 명세서

테스트 시나리오

  • 테스트를 위한 절차를 명세한 문서

  • 테스트 케이스의 동작 순서를 기술한 문서

테스트 결과서

  • 테스트 결과를 정리한 문서

  • 테스트 프로세스를 리뷰하고, 테스트 결과를 평가하고 리포팅하는 문서


테스트 케이스

개념

  • 고객의 요구사항을 준수하는지 확인하기 위해 설계된 입력 값, 실행 조건, 기대 결과로 구성된 테스트 항목의 명세서

작성 절차

  • 테스트 계획 검토 및 자료 확보

  • 위험 평가 및 우선순위 결정

  • 테스트 요구사항 정의

  • 테스트 구조 설계 및 테스트 방법 결정

  • 테스트 케이스 정의

  • 테스트 케이스 타당성 확인 및 유지 보수


테스트 시나리오

개념

  • 테스트 수행을 위한 여러 테스트 케이스의 집합

  • 테스트 케이스의 동작 순서를 기술한 문서

  • 테스트 절차를 명세한 문서

작성 시 유의점

  • 시스템 별, 모듈 별, 항목 별 테스트 시나리오를 분리하여 작성

  • 고객의 요구사항과 설계 문서 등을 토대로 테스트 시나리오 작성

  • 각 테스트 항목은 식별자 번호, 순서 번호, 테스트 데이터, 테스트 케이스, 예상 결과, 확인 등의 항목을 포함하여 작성


테스트 오라클

개념

  • 테스트의 결과가 참인지 거짓인지를 판단하기 위해서 사전에 정의된 참 값을 입력하여 비교하는 기법 및 활동

  • 테스트 케이스에 대해 프로그램의 실제 실행 결과가 올바른 결과인지 판단하는 매커니즘

유형

참 오라클 | True

  • 모든 입력 값에 대하여 기대하는 결과를 생성함으로써 발생된 오류를 모두 검출할 수 있는 오라클

  • 항공기, 임베디드, 발전소 소프트웨어 등

샘플링 오라클 | Sampling

  • 특정한 몇 개의 입력 값에 대해서만 기대하는 결과를 제공해 주는 오라클

  • 일반, 업무용, 게임, 오락 등의 일반적인 업무

추정 오라클 | Heuristic

  • 샘플링 오라클을 개선한 오라클

  • 특정 입력 값에 대해 올바른 결과를 제공, 나머지 값들에 대해서는 휴리스틱으로 처리하는 오라클

일관성 검사 오라클 | Consistent

  • 애플리케이션 변경이 있을 때, 수행 전과 후의 결과 값이 동일한지 확인하는 오라클

테스트 레벨

단위 테스트

  • 소프트웨어 개발에서 테스트 프로세스의 첫 단계

  • 에러를 줄이기 위한 의도로 작성된 코드에 대한 분석을 진행

  • 코드가 효율적으로 작성되었는지, 프로젝트 내에 합의된 코딩 표준을 준수하고 있는지 검증

  • 모듈 설계 단계에서 준비된 테스트 케이스를 이용하며, 코드를 개발한 개발자가 직접 수행

통합 테스트

  • 각각의 모듈들을 통합하여, 통합된 컴포넌트 간의 인터페이스와 상호작용 과정의 오류를 발견하는 작업 수행

  • 코드를 직접 확인하는 형태가 아닌 프로그램을 실행하며 테스트를 진행

  • 설계 단계에서 준비된 테스트 케이스를 사용하여 테스트가 진행, 일반적으로 개발자가 진행

시스템 테스트

  • 실제 구현된 시스템과 계획된 사양(Specifications)을 서로 비교하는 작업

  • 단위, 통합 테스트 후 전체 시스템이 정상적으로 작동하는지 확인

기능 테스트

  • 고객의 기능적 요구사항을 중점적으로 테스트
  • 요구사항에 따른 기능의 구현 여부 및 동작 여부에 대해 테스트를 진행
  • 테스트 기준은 명세에 따라 확인

비기능 테스트

  • 고객의 성능 요구사항을 중점적으로 테스트
  • 성능, 신뢰성, 안정성, 유효성, 적합성 등을 확인
  • 확인하고자 하는 특성에 따라 환경과 도구가 필요

인수 테스트 | Acceptance

  • 시스템을 배포하거나 실제 사용할만한 준비가 되었는지에 대해 평가

  • 사용자가 요구분석 명세서에 명시된 사항을 모두 충족하는지 판정하고, 시스템이 예상대로 동작하고 있는지를 판정하는 방안을 파악

알파 테스트

  • 개발자의 통제 하에 사용자가 개발 환경에서 수행하는 테스트
  • 내부에서 진행하는 자체 검사로 실제 사용 환경에서 동작시키며 관련자만 참여

베타(필드) 테스트

  • 개발된 소프트웨어를 사용자가 실제 운영환경에서 수행하는 테스트
  • 알파 테스트를 거친 후 정식으로 출시하기 전 사용자에게 테스트를 하도록 함

사용자 인수 테스트

  • 사용자가 시스템 사용의 적절성을 확인

운영상 인수 테스트

  • 시스템 관리자에 의한 시스템 인수 시 수행
  • 백업 & 복원 테스트, 재난 복구, 보안 취약성 점검

계약 인수 테스트

  • 계약 상의 인수조건을 준수하는지 확인

규정 인수 테스트

  • 정부의 지침, 법률 또는 안전 규정 등을 준수하는지 확인

소프트웨어 테스트 기법

프로그램 실행 여부

정적 테스트

  • 소프트웨어의 실행 없이 소스코드의 구조를 분석하여 논리적으로 검증하는 테스트

  • 경로 분석, 제어 흐름 분석, 데이터 흐름 분석 등 수행

코드 검사

  • 소스코드의 오류가 없는지 검사

워크스루

  • 계획된 개발자 검토 회의
  • 코드를 작성한 프로그래머가 같은 팀원에게 발표하며 오류를 탐색
  • 검토자들은 검토회의 전에 코드 사본을 전달받아 미리 분석하여 회의에 참석

인스펙션

  • 공식적인 검토 회의
  • 작성한 프로그래머를 제외한 검토 전문가들이 소스코드를 보며 결함을 발견

동적 테스트

  • 소프트웨어를 실행하여 실제 발생하는 오류를 발견해 문제를 해결하는 분석 기법

  • 다양한 환경에서 소프트웨어 분석

테스트 기법

화이트(글래스)박스 테스트

  • 소프트웨어의 내부 구조와 동작을 검사하는 테스트 방식

  • 모듈의 논리적인 구조를 체계적으로 점검하는 설계 절차에 초점을 둔 구조적 테스트

  • 소프트웨어 내부 소스코드를 테스트하는 기법

  • 개발자가 내부 소스코드 동작을 추적하여 동작의 유효성과 코드를 꼼꼼하게 테스트할 수 있음

  • 개발자 관점의 단위 테스트 방법

검증 기준 | Test Coverage

문장 검증 : 프로그램의 모든 문장을 한 번 수행하여 검증
선택 검증 : 선택하는 부분만 검증
경로 검증 : 수행 가능한 모든 경로 검사
조건 검증 : 조건이나 반복문 내 조건식을 검사

  • 기초 경로 검사Basic Path Test
    • McCabe가 제안한 것으로 대표적인 화이트 박스 테스트 기법
  • 데이터 흐름 검사Data Flow Test
    • 프로그램 내의 변수 정의의 위치와 변수들의 사용에 따라 프로그램 검사 경로를 선택하는 구조 검사 방식
  • 조건 검사, 루프 검사

블랙박스 테스트

  • 프로그램의 사용자 요구사항 명세를 보면서 테스트

  • 주로 구현된 기능을 테스트

  • 사용자가 소프트웨어에 요구하는 사항과 결과물이 일치하는지 확인

  • 사용자 관점의 테스트 방법

  • 인터페이스 오류나 행위 및 성능 오류, 초기화와 종료 오류 등을 발견

동등(동치) 분할 기법 | Equivalence Partitioning Testing

  • 입력 자료에 초점을 맞춰 테스트 케이스를 만들어 검사하는 방법
  • 입력 데이터의 영역을 유사한 도메인별로 유효값과 무효값을 그룹핑하여 나누어서 검사

경계값 분석 | Boundary Value Analysis

  • 입력 값의 중간 값보다 경계값에서 오류가 발생할 확률이 높다는 점을 이용해 입력 조건의 경계값을 테스트 케이스로 선정

원인-효과 그래프 검사 | Cause-Effect Graphing Testing

  • 입력 데이터 간의 관계와 출력에 영향을 미치는 상황을 체계적으로 분석한 다음 효용성이 높은 테스트 케이스를 선정하여 검사하는 기법

오류 예측 검사 | Error Guessing

  • 과거의 경험이나 테스터의 감각으로 테스트하는 기법

비교 검사 | Comparison Testing

  • 여러 버전의 프로그램에 동일한 테스트 자료를 제공하여 동일한 결과가 출력되는지 테스트하는 기법

상태전이 검사 | State Transistion Testing

  • 시스템에 반영되는 이전의 상태가 무엇인지, 상태 간 전이, 상태를 변화시키는 이벤트와 입력값을 파악

테스트에 대한 시각에 따른 분류

검증 | Verification

  • 소프트웨어의 개발 과정을 테스트

  • 올바른 소프트웨어가 만들어지고 있는지 검증

확인 | Validation

  • 완성된 소프트웨어의 결과를 테스트

  • 완성된 소프트웨어가 정상적으로 동작하는지 확인

  • 완성된 소프트웨어가 사용자의 요구사항을 만족하는지 확인

테스트 목적에 따른 분류

회복 | Recovery
시스템에 고의로 실패를 유도하고 시스템이 정상적으로 복귀하는지 테스트
안전 | Security
불법적인 소프트웨어가 접근하여 시스템을 파괴하지 못하도록 소스코드 내의 보안적인 결함을 미리 점검하는 테스트
강도 | Stress
시스템에 과다 정보량을 부과하여 과부하 시에도 시스템이 정상적으로 작동되는지를 검증하는 테스트
성능 | Performance
시스템의 응답하는 시간, 처리량, 반응속도 등을 테스트
구조 | Structure
시스템의 내부 논리 경로, 소스코드의 복잡도를 평가하는 테스트
회귀 | Regression
변경 또는 수정된 코드에 대하여 새로운 결함 발견 여부를 평가하는 테스트
병행 | Parallel
변경된 시스템과 기존 시스템에 동일한 데이터를 입력 후 결과를 비교하는 테스트

테스트 종류

명세 기반 테스트

  • 주어진 명세를 빠짐없이 테스트 케이스로 구현하고 있는지 확인하는 테스트

  • 동등 분할, 경계 값 분석, 유한상태 기계기반, 결정 테이블, 정형명세 기반, 유스케이스, 페어와이즈, 직교배열 테스트 등

구조 기반 테스트

  • 소프트웨어 내부 논리 흐름에 따라 테스트 케이스를 작성하고 확인하는 테스트

  • 구문 기반, 결정 기반, 조건 기반, 조건결정 기반, 변경조건 결정 기반, 멀티조건 기반 커버리지 테스트 등

경험 기반 테스트

  • 테스터의 경험을 토대로 진행하는 테스트

테스트 커버리지

개념

  • 주어진 테스트 케이스에 의해 수행되는 소프트웨어의 테스트 범위를 측정하는 테스트 품질 측정 기준

  • 테스트의 정확성과 신뢰성을 향상시키는 역할

  • 테스트를 얼마나 수행했는지 측정하는 기준

유형

기능 기반 커버리지

  • 테스트 대상 애플리케이션의 전체 기능을 모수로 설정하고, 실제 테스트가 수행된 기능의 수를 측정하는 방법

  • 기능 기반 테스트커버리지는 100% 달성을 목표로 하며, 일반적으로 UI가 많은 시스템의 경우 화면 수를 모수로 사용할 수 있음

라인 커버리지

  • 애플리케이션 전체 소스 코드의 Line 수를 모수로 테스트 시나리오가 수행한 소스코드의 Line 수를 측정하는 방법

  • 단위 테스트에서는 이 라인 커버리지를 척도로 삼기도 함

코드 커버리지

  • 소프트웨어 테스트 충분성 지표 중 하나로 소스코드의 구문, 조건, 결정 등의 구조코드 자체가 얼마나 테스트되었는지를 측정하는 방법

구문 커버리지 | Statement

  • 코드 구조 내의 모든 구문에 대해 한 번 이상 수행하는 테스트 커버리지

조건 커버리지 | Condition

  • 결정 포인트 내의 모든 개별 조건식에 대해 수행하는 테스트 커버리지
  • 개별 조건식이 각각 True와 False만 만족하면 됨
  • 개별 조건식의 T/F는 커버되지만 전체 결정포인트의 T/F는 보장받지 못함

결정 커버리지 | Decision

  • 결정 포인트 내의 모든 분기문에 대해 수행하는 테스트 커버리지
  • 결정 포인트가 각각 True와 False만 만족하면 됨
  • 개별 조건식에서 오류가 있는 경우 찾지 못할 수 있음

조건 / 결정 커버리지 | Condition / Decision

  • 결정 포인트 T/F, 개별 조건식 T/F를 가져야 함

변경 조건 / 결정 커버리지 | Modified Condition / Decision

  • 모든 결정 포인트 내의 개별 조건식은 적어도 한 번 T, F를 가져야 함
  • 이론적으로 가장 안전한 조합이며 케이스도 줄일 수 있음

다중 조건 커버리지 | Multiple Condition

  • 결정 포인트 내 모든 개별 조건식의 가능한 조합을 100% 보장해야 함
이 기사는 저작권자의 CC BY-NC 4.0 라이센스를 따릅니다.