일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- 얘들아 잘 지내니
- 다들 안잊어서
- 재택치료
- 수제비 2022
- 아싸의 생일
- FLUTTER
- 교육봉사
- 정보처리기사 2022
- 다음에 또 만나자
- 2022 정보처리기사
- 교수님 과제 이제 그만..
- 다행이야...ㅎ
- 대학생
- 지독한 컨셉충
- 뽀모도로 타이머
- 스프링 MVC
- 레이튼 교수와 이상한 마을
- 플러터
- 모바일 청첩장
- 생일축하해 나 자신
- AWS
- CRUDS
- pem키 분실
- N-Queen
- 개강해짐
- 대외활동
- 자가격리
- 수제비2022 정리
- 확진
- 정보처리기사2022
- Today
- Total
Rei’s Tech diary
Chapter 4. 애플리케이션 테스트 케이스 관리 본문
[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
#. 코드 최적화
- 클린 코드는 가독성이 높고, 단순하며, 의존성을 줄이고, 중복을 최소화하여 깔끔하게 잘 정리된 코드임.
#. 배드 코드 유형
- 오염
- 문서부족
- 의미 없는 이름
- 높은 결합도
- 아키텍처 침식
- 외계인 코드 : 매우 오래되거나 참고문서 또는 개발자가 없어 유지보구 작업이 몹시 어려운 코드
- 스파게티 코드 : 소스코드가 복잡하게 얽힘- 알 수 없는 변수명- 로직 중복
#. 클린 코드 작성 원칙 (가단의 중추)
- 가독성
- 단순성
- 의존성 최소
- 중복성 제거
- 추상화
'정보처리기사 > [2] 소프트웨어 개발' 카테고리의 다른 글
Chapter 5. 인터페이스 구현 (0) | 2022.03.13 |
---|---|
Chapter 3. 제품 소프트웨어 패키징 (2) | 2022.03.10 |
Chapter 2. 통합 구현 (0) | 2022.03.08 |
Chapter 1. 데이터 입출력 구현 (0) | 2022.03.08 |