Rei’s Tech diary

Chapter 4. 애플리케이션 테스트 케이스 관리 본문

정보처리기사/[2] 소프트웨어 개발

Chapter 4. 애플리케이션 테스트 케이스 관리

Reiger 2022. 3. 12. 21:59

[1] 애플리케이션 테스트 케이스 설계

#. 테스트 케이스(Test Case) 개념

- 테스트 케이스는 특정 요구사항에 준수하는 지를 확인하기 위해 개발된 입력값, 실행 조건, 예상된 결과의 집합.

 

#. 테스트 오라클(Test Oracle)의 개념

- 테스트 오라클은 테스트의 결과가 참인지 거짓인지를 판단하기 위해서 사전에 정의된 참값을 입력하여 비교하는 기법.

 

#. 테스트 오라클 종류 (참샘휴일)

1) 참(True) 오라클

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

 

2) 샘플링(Sampling) 오라클

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

 

3) 휴리스틱(Heuristic) 오라클

: 샘플링 오라클을 개선한 오라클, 특정 입력값에 대해 올바른 결과를 제공하고, 나머지 값들에 대해서는 휴리스틱(추정)으로 처리하는 오라클

 

4) 일관성 검사(Consistent) 오라클

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

 

#. 테스트 레벨(Test Level)의 개념

- 테스트 레벨은 함께 편성되고 관리되는 테스트 활동의 그룹이다.

- 테스트 레벨은 프로젝트에서 책임과 연관 되어있다.

- 각각의 테스트 레벨은 서로 독립적이다.

 

①  단위 테스트(Unit Test)

- 단위 테스트는 소프트웨어 설계의 최소 단위인 모듈이나 컴포넌트에 초점을 맞춘 테스트.

- 단위 테스트에서는 자료 구조, 인터페이스, 외부적 I/O, 독립적 기초 경로, 오류 처리 경로, 경계 조건 등을 검사.

- 단위 테스트는 명세 기반 테스트(=블랙박스 테스트)와 구조 기반 테스트(=화이트박스 테스트)로 나뉘지만 주로 구조 기반 테스트 위주로 수행.

 

② 통합 테스트(Integration Test)

- 통합 테스트는 소프트웨어 각 모듈 간의 인터페이스 관련 오류 및 결함을 찾아내기 위한 체계적인 테스트 기법.

- 단위 테스트가 끝난 모듈 또는 컴포넌트 단위의 프로그램이 설계 단계에서 제시한 애플리케이션과 동일한 구조와 기능으로 구현된 것인지를 확인하는 테스트

 

③ 시스템 테스트(System Test)

- 시스템 테스트는 통합된 단위 시스템의 기능이 시스템에서 정상적으로 수행되는지를 검증하는 테스트

- 컴퓨터 시스템을 완벽하게 검사하기 위한 목적 또는 성능 목표를 가지고 테스트

 

④ 인수 테스트(Acceptance Test) ★

- 인수 테스트는 최종 사용자와 업무의 이해관계자 등이 테스트를 수행함으로써 개발된 제품에 대해 운영 여부를 결정하는 테스트

 

#. 인수 테스트의 종류

종류 설명
사용자 인수
테스트
비즈니스 사용자가 시스템 사용의 적절성 여부 등을 확인하는 테스트
운영상의 인수
테스트
시스템 관리자가 시스템 인수 시 수행하는 테스트 활동으로 백업/복원 시스템, 재해 복구, 사용자 관리, 정기 점검 등을 확인하는 테스트
계약 인수
테스트
계약상의 인수/검수 조건을 준수하는지 여부 등을 확인하는 테스트
규정 인수
테스트
정부 지침, 법규, 규정 등이 규정에 맞게 개발되었는지 확인하는 테스트
알파 테스트 선택된 사용자(회사 내의 다른 사용자 또는 실제 사용자)가 개발자 환경에서 통제된 상태로 개발자와 함께 수행하는 인수 테스트
베타 테스트 실제 환경에서 일정 수의 사용자에게 대상 소프트웨어를 사용하게 하고 피드백을 받는 인수 테스트
필드 테스팅(Field Testing)이라고도 불리며, 개발자 없이 고객의 사용 환경에 소프트웨어를 설치하여 검사를 수행하는 인수 테스트

 

#. 테스트 시나리오(Test Scenario) 개념

- 테스트 시나리오는 어플리케이션의 테스트되어야 할 기능 및 특징, 테스트가 필요한 상황을 작성한 문서.

 

#. 테스트 지식 체계 ★★★

 

1. 프로그램 실행 여부에 따른 분류

- 정적 테스트 : 테스트 대상을 실행하지 않고 구조를 분석하여 논리성을 검증하는 테스트

- 동적 테스트 : 소프트웨어를 실행하는 방식으로 테스트를 수행하여 결함을 검출하는 테스트

 

2. 테스트 기법에 따른 분류

① 블랙박스 테스트(Black-box Test) = 명세 테스트

- 블랙박스 테스트는 프로그램 외부 사용자의 요구사항 명세를 보면서 수행하는 테스트(기능 테스트)

- 블랙박스 테스트는 소프트웨어의 특징, 요구사항, 설계 명세서 등에 초점을 맞춰 테스트가 이루어짐.

- 블랙박스 테스트는 기능 및 동작 위주의 테스트를 진행하기 때문에 내부 구조나 작동 원리를 알지 못해도 가능하다.

 

▶ 블랙박스 테스트 유형

- 동등 분할 테스트

- 경곗값 분석 테스트

- 결정 테이블 테스트

- 상태전이 테스트

- 유스케이스 테스트

- 분류 트리 테스트

- 페어와이즈 테스트

- 원인-결과 스래프 테스트

- 비교 테스트

 

② 화이트박스 테스트(White-box Test)

- 화이트박스 테스트는 각 응용 프로그램의 내부 구조와 동작을 검사하는 소프트웨어 테스트.

- 화이트박스 테스트는 코드 분석과 프로그램 구조에 대한 지식을 바탕으로 문제가 발생할 가능성이 있는 모듈 내부를 직접 관찰하고, 테스트하는 방법.

- 소스 코드의 모든 문장을 한 번 이상 수행함으로써 진행

- 산출물의 기능별로 적절한 프로그램의 제어 구조에 따라 선택, 반복 등의 부분들을 수행함으로써 논리적 경로를 점검

- 화이트박스 테스트는 구조 기반 테스트, 코드 기반 테스트, 로직 기반 테스트, 글래스(Glass)박스 테스트라고 부름.

 

▶ 화이트박스 테스트 유형

- 구문 커버리지 (= 문장 커버리지)

- 결정 커버리지(= 선택 커버리지, 분기 커버리지)

- 조건 커버리지

- 조건/결정 커버리지

- 변경 조건/결정 커버리지

- 다중 조건 커버리지

- 기본 경로 커버리지

- 제어 흐름 테스트

- 데이터 흐름 테스트

 

3. 테스트 시각에 따른 분류

분류 설명
검증 (Verification) - 소프트웨어 개발 과정을 테스트
- 올바른 제품을 생산하고 있는지 검증
- 이전 단계에서 설정된 개발 규격과 요구를 충족시키는지 판단
- 개발자 혹은 시험자의 시각으로 소프트웨어가 명세화된 기능을 올바로 수행하는지 알아보는 과정
확인(Validation) - 소프트웨어 결과를 테스트
- 만들어진 제품이 제대로 동작하는지 확인
- 최종 사용자 요구 또는 소프트웨어 요구에 적합한지 판단
- 사용자 시각으로 올바른 소프트웨어가 개발되었는지 입증하는 과정

 

4. 테스트 목적에 따른 분류

분류 설명
회복 테스트
(Recovery Test)
시스템에 고의로 실패를 유도, 시스템의 정상적 복귀 여부를 테스트하는 기법
안전 테스트
(Security Test)
불법적인 소프트웨어가 접근하여 시스템을 파괴하지 못하도록 소스 코드 내의 보안적인 결함을 미리 점검하는 기법
성능 테스트
(Performance Test)
사용자의 이벤트에 시스템이 응답하는 시간, 특정 시간 내에 처리하는 업무량, 사용자 요구에 시스템이 반응하는 속도 등을 측정하는 기법
강도 테스트
(Stress Test)
시스템 처리 능력 이상의 부하 임계점 이상의 부하를 가하여 비정상적인 상황에서의 처리를 테스트
구조 테스트
(Structure Test)
시스템 내부 논리 경로, 소스 코드의 복잡도를 평가하는 테스트 기법
회귀 테스트
(Regression Test)
회귀 테스트는 오류를 제거하거나 수정한 시스템에서 오류 제거와 수정에 의해 새로이 유입된 오류가 없는지 확인하는 일종의 반복 기법
병행 테스트
(Parallel Test)
변경된 시스템과 기존 시스템에 동일한 데이터를 입력 후 결과를 비교하는 기법

 

#. 소프트웨어 테스트의 원리

원리 설명
결함 존재 증명 - 테스트는 결함이 존재함을 밝히는 활동
- 결함이 없다는 것을 증명할 수 없음
완벽 테스팅은 불가능 - 무한 경로, 무한 입력값으로 인한 완벽한 테스트가 어렵다는 원리
초기 집중 - 개발 초기에 체계적인 분석 및 설계가 수행되면 테스팅 기간 단축, 재작업을 줄여 개발 기간을 단축 및 결함을 예방할 수 있는 원리
- SW 개발 초기 체계적인 분석 및 설계가 수행되지 못하면 그 결과가 프로젝트 후반에 영향을 미치게 되어 비용이 커진다는 요르돈 법칙 적용
결함 집중 - 적은 수의 모듈(20%)에서 대다수의 결함(80%)이 발견된다는 원리
- 파레토 법칙(Pareto Principle)의 내용인 80 대 20 법칙 적용
살충제 패러독스 - 동일한 테스트 케이스에 의한 반복적인 테스트는 새로운 버그를 찾지 못한다는 원리
정황 의존성 소프트웨어 성격에 맞게 테스트를 수행해야 한다는 원리
오류-부재의 궤변 요구사항을 충족시켜주지 못한다면, 결함이 없다고 해도 품질이 높다고 볼 수 없다는 원리

 

[2] 애플리케이션 통합 테스트

#. 소프트웨어 결함 관련 용어

용어 설명
오류 (Error) 결함의 원인이 되는 것으로, 일반적으로 사람에 의해 생성된 실수
결점 (Fault) 소프트웨어 개발 활동을 수행함에 있어서 시스템이 고장을 일으키게 하며, 오류가 있는 경우 발생하는 현상
버그 (Bug) 프로그램 오류로 인해 예상치 못한 결과가 나는 현상
고장(Failure)/
문제(Problem)
소프트웨어 제품에 포함된 결함이 실행될 때 발생하는 현상

#. 통합 테스트 (Integration Test) 개념

- 통합 테스트는 소프트웨어 각 모듈 간의 인터페이스 관련 오류 및 결함을 찾아내기 위한 테스트

 

#. 통합 테스트 수행 방법의 분류

- 점증적인 방식 : 상위 또는 하위 컴포넌트부터 점증적으로 테스트하는 방식

- 비점증적 방식 : 모든 컴포넌트를 사전에 통합

 

① 하향식 통합 테스트 (스텁)

- 하향식 통합 테스트는 메인 제어 모듈로부터 아래 방향으로 제어의 경로를 따라 이동하면서 하향식으로 통합하는 테스트

- 메인 제어 모듈에 통합되는 하위 모듈과 최하위 모듈은 '깊이-우선'또는 '너비-우선'방식으로 통합

 

② 상향식 통합 테스트 (드라이버)

- 상향식 통합 테스트는 애플리케이션 구조에서 최하위 레벨의 모듈 또는 컴포넌트로부터 점진적으로 상위 모듈과 함께 테스트하는 기법

 

[3] 애플리케이션 성능 개선

#. 알고리즘(Algorithm) 개념

- 알고리즘은 어떠한 문제를 해결하기 위한 정해진 일련의 절차나 방법을 공식화한 형태로 표현한 기법

 

#. 알고리즘 기법

기법 설명
분할과 정복
(Divide and Conquer)
문제를 나눌 수 없을 때까지 나누고, 각각을 풀면서 다시 병합하여 문제의 답을 얻는 알고리즘
동적계획법
(Dynamic Programming)
어떤 문제를 풀기 위해 그 문제를 더 작은 문제의 연장선으로 생각하고, 과거에 구한 해를 활용하는 방식의 알고리즘
탐욕법
(Greedy)
결정을 해야할 때마다 그 순간에 가장 좋다고 생각되는 것을 해답으로 선택함으로써 최종적인 해답에 도달하는 방식의 알고리즘
백트랙킹
(Backtracking)
어떤 노드의 유망성 점검 후, 유망하지 않으면 그 노드의 부모 노드로 되돌아간 후 다른 자손노드를 검색하는 알고리즘

 

#. 시간 복잡도에 따른 알고리즘 분류

복잡도 설명 대표 알고리즘
O(1)  - 상수형 복잡도
- 자료 크기 무관하게 항상 같은 속도로 작동
- 알고리즘 수행 시간이 입력 데이터 수와 관계없이 일정
 해시 함수(Hash Function)
O($log_{2}n$)  - 로그형 복잡도
- 문제를 해결하기 위한 단계의 수가 $log_{2}n$번 만큼의 수행 시간을 가짐
 이진 탐색(Binary Search)
O($n$)  - 선형 복잡도
- 입력 자료를 차례로 하나씩 모두 처리
- 수행 시간이 자료 크기와 직접적 관계로 변함 정비례
 순차 탐색(Sequential Search)
O($nlog_{2}n$)  - 선형 로그형 복잡도
- 문제를 해결하기 위한 단계의 수가 $nlog_{2}n$번 만큼의 수행 시간을 가짐
 퀵 정렬, 합병 정렬, 힙 정렬
O($n^{2}$)  - 제곱형 주요 처리 루프 구조가 2중인 경우
- $n$크기 작을 때에는 $n^{2}$이 $nlog_{2}n$보다 빠를 수 있음
 거품 정렬, 삽입 정렬, 선택 정렬

 

#. 알고리즘 설명 ★

① 해싱 함수(Hashing Function) : 산곱숫 폴기무

- 해싱함수는 임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하는 함수

함수 설명
제산법
(Division)
나머지 연산자(%)를 사용하여 테이블 주소를 계산하는 방식
제곱법
(Square)
제곱법은 레코드 키값을 제곱한 후에 결괏값의 중간 부분에 있는 몇 비트를 선택하여 테이블의 홈 주소로 사용하는 방식
숫자 분석법
(Digit Analysis)
레코드 키를 구성하는 수들이 모든 키들 내에서 자리별로 어떤 분포인지를 조사하여 비교적 고른 분포를 나타내는 자릿수를 필요한 만큼 선택하여, 레코드의 홈 주소로 사용하는 방법
폴딩법
(Folding)
레코드 키를 여러 부분으로 나누고, 나눈 부분의 각 숫자를 더하거나 XOR 한 값을 홈 주소로 사용하는 방식
기수변환법
(Radix)
어떤 진법으로 표현된 주어진 레코드 키를 다른 진법으로 간주하고 키를 변환하여 홈 주소를 얻는 방식
무작위방법
(Random)
난수를 발생시켜 각 레코드 키의 홈 주소를 결정하는 방식

 

② 검색 알고리즘  

1) 순차 검색

- 배열의 처음부터 끝까지 차례대로 비교하여 원하는 데이터를 찾아내는 알고리즘

 

2) 이진 검색

- 정렬되어 있는 리스트에서 탐색 범위를 절반씩 좁혀가며 데이터를 탐색하는 알고리즘

- 탐색 효율이 좋고 탐색 시간이 적게 소요

 

정렬 알고리즘 ★

1) 퀵 정렬 (Quick Sort)

- 퀵 정렬은 피벗을 두고 피벗의 왼쪽에는 피벗보다 작은 값을, 오른쪽에는 큰 값을 두는 과정을 반복하는 알고리즘.

최적 수행 시간 O($nlog_{2}n$)
평균 수행 시간 O($nlog_{2}n$)
최악 수행 시간 O($n^{2}$)

 

2) 합병 정렬 (Merge Sort)

- 합병 정렬은 전체 원소를 하나의 단위로 분할한 후 분할한 원소를 다시 합병하여 정렬하는 알고리즘.

최적 수행 시간 O($nlog_{2}n$)
평균 수행 시간 O($nlog_{2}n$)
최악 수행 시간 O($nlog_{2}n$)

 

3) 힙 정렬 (Heap Sort)

- 힙 정렬은 정렬할 입력 레코드들로 힙을 구성하고 가장 큰 키 값을 갖는 루트 노드를 제거하는 과정을 반복하여 정렬하는 알고리즘

최적 수행 시간 O($nlog_{2}n$)
평균 수행 시간 O($nlog_{2}n$)
최악 수행 시간 O($nlog_{2}n$)

 

4) 거품 정렬 (Bubble Sort)

- 거품 정렬은 인접한 2개의 레코드 키값을 비교하여 그 크기에 따라 레코드 위치를 서로 교환하는 알고리즘.

 

※  거품 정렬 예제

4, 2, 3, 5, 1 을 거품정렬을 이용하여 오름차순으로 정렬

PASS 1.

4 2 3 5 1
2 4 3 5 1
2 3 4 5 1
2 3 4 5 1
2 3 4 1 5

PASS 1 종료 시 첫 번째로 큰 값은 맨 뒤에 위치

 

PASS 2.

2 3 4 1 5
2 3 4 1 5
2 3 4 1 5
2 3 1 4 5

 

PASS 3.

2 3 1 4 5
2 3 1 4 5
2 1 3 4 5

 

PASS 4.

2 1 3 4 5
1 2 3 4 5

 

5) 삽입 정렬 (Insertion Sort)

※  삽입 정렬 예제

4, 2, 3, 5, 1을 삽입 정렬을 이용해 오름차순으로 정렬

 

1) 처음에 4는 정렬되어 있다고 가정

4 2 3 5 1

2) 2를 이미 정렬된 부분 (4)에 삽입

4 2 3 5 1

3) 3을 이미 정렬된 부분 (2,4)에 삽입

2 4 3 5 1

4) 5를 이미 정렬된 부분 (2,3,4)에 삽입

2 3 4 5 1

5) 1을 이미 정렬된 부분 (2,3,4,5)에 삽입

2 3 4 5 1

 

6) 선택 정렬 (Selection Sort)

- 선택 정렬은 정렬되지 않은 데이터들에 대해 가장 작은 데이터를 찾아 정렬되지 않은 부분의 가장 앞의 데이터와 교환해나가는 알고리즘

※  선택 정렬 예제

4, 2, 3, 5, 1을 선택 정렬을 이용해 오름차순 정렬

1) 정렬되지 않은 값 중 가장 작은 값(1) 선택 후 정렬되지 않은 첫번째 요소(4)와 교환

4 2 3 5 1

2) 정렬되지 않은 값 중 가장 작은 값(2) 선택 후 정렬되지 않은 첫 번째 요소(2)와 교환

1 2 3 5 4

3) 정렬되지 않은 값 중 가장 작은 값(3) 선택 후 정렬되지 않은 첫 번째 요소(3)와 교환

1 2 3 5 4

4) 정렬되지 않은 값 중 가장 작은 값(4) 선택 후 정렬되지 않은 첫 번째 요소(5)와 교환

1 2 3 5 4

5) 정렬되지 않은 값 중 가장 작은 값(5) 선택 후 정렬되지 않은 첫 번째 요소(5)와 교환

1 2 3 4 5

 

#. 소스 코드 품질 분석

- 소스 코드 품질 분석은 소스 코드에 대한 코딩 스타일, 설정된 코딩 표준, 코드의 복잡도, 코드 내에 존재하는 메모리 누수 현황, 스레드의 결함 등을 발견하기 위한 활동

 

#. 소스 코드 품질 분석 도구

1) 정적 분석 도구

- pmd

- cppcheck

- SnoarQube

- checkstyle

- ccm

- cobertura

 

2) 동적 분석 도구

- Avalanche

- Valgrind

 

#. 맥케이브 회전 복잡도

- 맥케이브 회전 복잡도는 소프트웨어의 제어 흐름을 그래프로 표현라고 소스 코드 복잡도를 정량적으로 나타내는 지표

 

#. 맥케이브 회전 복잡도 측정 방식

맥케이브 회전수 계산

E = 화살표 수 = 6

N = 노드 수 = 4

 

V(G) = E - N + 2       

         = 6 - 4 + 2 = 4

 

#. 코드 최적화

- 클린 코드는 가독성이 높고, 단순하며, 의존성을 줄이고, 중복을 최소화하여 깔끔하게 잘 정리된 코드임.

 

#. 배드 코드 유형

- 오염

- 문서부족

- 의미 없는 이름

- 높은 결합도

- 아키텍처 침식

- 외계인 코드 : 매우 오래되거나 참고문서 또는 개발자가 없어 유지보구 작업이 몹시 어려운 코드

- 스파게티 코드 : 소스코드가 복잡하게 얽힘- 알 수 없는 변수명- 로직 중복

 

#. 클린 코드 작성 원칙 (가단의 중추)

- 가독성

- 단순성

- 의존성 최소

- 중복성 제거

- 추상화