TTA(한국정보통신기술협회)에서 주관하는 소프트웨어 테스트 전문가 자격시험(CSTS)를 공부하면서 정리한 포스팅으로,
목차는 크게 6개로 이루어지고 TTA 교육 + 홍릉과학출판사 테스터와 관리자를 위한 소프트웨어 테스팅 + 예제문제 를 기반으로 공부하였다.
1. 소프트웨어 테스트 개요
1.1 소프트웨어 테스트
> 결함을 발견할 목적으로 프로그램을 실행하는 과정
> 소프트웨어 품질을 측정하고 개선하기 위한 프로세스
> 해야 되는 일을 실제로 수행하는지/정확한 값인지 확인
> 오류가 존재함을 보일 수는 있지만 오류가 없음을 보일 수는 없음
> 프로그램의 신뢰도를 높이기 위한 과정
> 프로그램이나 문서들을 분석하는 과정
> 좋은 테스트는 성공적인 수행이 아니라 발견되지 않은 결함을 검출할 수 있도록 오작동을 발생시키는 것
1.2 소프트웨어 에러/결함/오작동
- 에러(Error): 사용자 요구사항을 잘못 파악하거나 잘못 이해할 때 발생하는 실수이며 사람에 의해 발생
예) 타이핑 실수, 프로그램 명령어 잘못 이해
- 결함(Defect, Fault): 에러가 표현된 것
소프트웨어가 제품 사양에 명시된 대로 작동하지 않거나 하지 말아야 한다고 하는 기능을 수행하는 경우
제품 사양에서 언급하지 않은 것을 수행하거나 언급하지는 않았지만 해야 할 일을 수행하지 않는 경우
이해하기 어렵거나, 사용하기 어려운 경우
- 오작동(Failure): 결함의 실행으로 예상과 다른 결과
오작동은 결함에 의해 발생하지만, 결함이 있다고 반드시 오작동이 발생하는 것은 아님
[Example] 오상식 차장은 추석에 가족과 함께 고향인 부산에 내려가지고 자가용을 운전하였다. 경부고속도로를 따라 운전하다가 깜빡 졸아 호남고속도로로 핸들을 틀어 들어서게 되었다. 계속 그대로 운전하여 결국에는 광주까지 오게 되었다.
에러: 운전하다가 깜빡 졸았다.
결함: 결부고속도로에서 호남고속도로로 핸들을 틀었다.
오작동: 부산을 가야하는데 광주에 도착하였다.
1.3 소프트웨어 결함 원인
- 요구사항 결함: 요구사항의 잘못된 정의, 고객과 개발자간의 의사소통 부족, 고의적인 요구사항 미준수
- 설계 결함: 소프트웨어 요구사항을 설계에 반영하는 과정에서 실수로 인한 결함 발생
- 코딩 결함: 설계 문서를 잘못 이해하거나 프로그래밍 언어 또는 개발 도구에 익숙하지 않아 발생하는 결함
- 기타 결함: 문서나 코딩 표준에 따르지 않는 경우, 미흡한 테스트 프로세스, 요구사항 불확실, 잦은 변경, 테스트 시간 부족
1.4 Beizer의 소프트웨어 테스트 진화 과정
| 레벨1 | Debugging-oriented | 테스트와 디버깅의 차이가 없다. 즉, 우연히 발견된 오류를 수정하는 디버깅에 중점을 두며 프로그램의 오류를 찾기 위한 별도의 노력을 기울이지 않는다. |
| 레벨2 | Demonstration-oriented | 프로그램이 올바르게 동작한다는 사실을 입증하기 위해 테스트를 수행한다. |
| 레벨3 | Destruction-oriendted | 프로그램에 결함이 존재함을 보여주기 위해 테스트를 수행한다. |
| 레벨4 | Evaluation-oriented | 소프트웨어 개발 후에 결함을 찾는 것이 아닌 개발 전 단계에 발생하는 결함을 발견하는 개념으로 확장한다. |
| 레벨5 | Prevention-oriented | 프로그램의 오류를 사후에 발견하는 것이 아니라 아예 결함이 발생하지 않도록 사전에 방지하자는 개념이며 테스트 용이성을 고려하여 프로그램을 설계한다. |
1.5 소프트웨어 테스트 한계 및 고려사항
[한계]
- 테스트는 결함이 존재함을 보일 수는 있지만, 결함이 없다는 것을 보일 수는 없다.
- 프로그램의 입력 영역은 무한히 크기 때문에 현실적으로 가능한 모든 입력 값들을 테스트 데이터로 선정할 수 없다.
[고려사항]
- 테스트는 반드시 프로그램을 개발한 프로그래머나 팀과는 무관한 그룹에 의해서 수행되어야 한다.
- 테스트 작업은 가장 능력이 뛰어난 사람에게 할당한다.
- 오류가 발견되지 않을 것이란 가정하에서 테스트 계획을 수립해서는 안된다.
- 타당한 경우뿐만 아니라 타당하지 않고 예상하지 못한 경우들에 대해서도 테스트를 수행한다.
- 프로그램의 어떤 부분에 오류가 남아있을 확률은 이미 발견된 오류의 수에 직접적으로 비례한다.(Pareto 원칙)
- 테스트 케이스를 체계적으로 관리한다.
- 각각의 테스트 결과를 철저하게 점검한다.
1.6 테스트 용이성
프로그램이 테스트 가능한지를 나타내는 특성 또는 요구사항이 테스트로 증명 가능한지를 나타내는 특성
| 제어용이성 | 실행 제어가 용이하게 설계, 제어용이성↑=테스트 자동화 가능성↑ |
| 관찰가능성 | 프로그램 내부상태(중간, 최종)를 쉽게 파악할 수 있도록 설계 |
| 단순성 | 시스템 구조 등을 단순하게 설계, 시스템 단순 = 효율적 테스트 |
| 운영용이성 | 프로그램이 오작동해도 테스트 작업을 계속할 수 있도록 설계 |
| 안정성 | 테스트 간 소프트웨어 변경이 자주 안되게 설계 |
| 이해용이성 | 조직화된 설계정보 → 쉬운 접근, 소프트웨어 이해 |
| 분할용이성 | 테스트 대상 모듈 분리 → 독립적 테스트 |
1.7 제품 품질의 예
| 기능 적합성 | 시험 대상 제품의 기능 정상작동 여부 |
| 성능 효율성 | CPU, Memory 사용량 시험 대상 제품의 목표 성능 정의 |
| 호환성 | 다른 제품과 충돌 없이 동작 가능한지 확인 |
| 신뢰성 | 비정상종료 발생 확인 이중화 기능, 데이터 복구 기능 존재 여부 확인 및 동작 확인 |
| 유지보수성 | 프로그램 운영 중 발생할 수 있는 문제에 대한 해결 정보 여부 확인 |
| 이식성 | 버전업 제품 경우, 이전 버전과 데이터 호환 가능 여부 확인 |
| 일반적 요구사항 | 제품 운영을 위한 정보 제공 여부 확인 |
| 사용성 | 용어 일관성, 화면 깨짐 등 확인 예) 용어 일관성 오류: '정보 수정' 화면에서 '환자 첫지료'로 표시되지만, 다른 화면에서는 '환자 초진'으로 표시되어 일관되지 않음 2020년 2회 출제됨 |
| 보안성 | 기밀성/무결성/부인방지성/책임성/인증성 |
1.8 개발 단계별 테스트
| 대상 | 테스터 | 환경 | 방법 | 대상 | 문서(산출물) | |
| 단위테스트 (컴포넌트 테스트) |
단위 모듈 | 개발자 | 개발환경 | 화이트박스 (스텁, 드라이버, 시뮬레이터) |
최소단위함수, 기능(모듈) | 요구사항정의서, 개념/상세설계서, 기능설계서, 명세서, 인터페이스 설계서 등 |
| 통합테스트 | 통합 모듈 | 개발자 | 개발환경 | 그레이박스 | 외부 인터페이스 연결 (서버, 네트워크, DB), 내부모듈간 연결 |
(단위산출물)_통합시험 계획서/절차서/결과서 |
| 시스템테스트 | 전체 시스템 | 테스터 (제3자) |
실환경 (실제와 유사) |
그레이박스 | 기능/비기능 테스트 | (단위+통합산출물)+실증시험계획서/절차서/결과서, 메뉴얼 |
| 인수테스트 | 전체 시스템 | 사용자, 고객 | 실환경 | 블랙박스 (알파, 베타, 운영/사용자, 계약인수 테스트) |
출시 예정 제품 | (단위+통합+시스템)+결함리포트, 결과보고서 피드백 등 |
1.8.1 단위테스트(Unit Test)
> 테스트가 가능한 최소 단위로 나누어진 소프트웨어(모듈, 프로그램, 객체, 클래스 등)내에서 결함을 찾고 그 기능을 검증하는 것
> 구현 단계에서 각 모듈이 구현된 후에 단위 테스트를 수행
> 모듈을 단독적으로 실행할 수 있는 환경이 필요

- 테스트 드라이버(Test driver): 테스트 대상이 되는 모듈을 호출하여 준비한 테스트 데이터를 제공하고 모듈의 실행 결과를 받는 모듈

- 테스트 스텁(Test stub): 호출되는 모듈의 개발이 완료되지 않은 경우, 호출하는 모듈을 시험하기 위해 생성한 더미 모듈로 모든 기능을 완전히 구현할 필요는 없다.

1.8.2 통합 테스트(Integration Test)
> 모듈을 통합하는 과정에서 수행하는 테스트
> 모듈 간의 상호 작용이 올바르게 되는지 검사
> 개별적인 모듈에 대한 테스트가 불충분하거나 개별 모듈에서 동일한 전역 변수를 사용하여 오류가 발생할 수 있음
> 통합 전략
- 빅뱅(Big-bang) 통합: 전체 시스템에 대해 한번에 통합 테스트를 수행하여 단시간에 테스트가 가능하지만, 오류가 발 생했을 경우 오류가 발생한 모듈 및 원인을 찾기가 매우 어려움
- 점진적 테스트: 한번에 모듈들을 통합하지 않고 점진적으로 통합하면서 테스트(상향식/하향식/샌드위치 통합 방식)

하향식 통합: 가장 상위 모듈을 테스트하기 위해 하위 모듈을 테스트 스텁으로 대치한 후 테스트 수행
깊이 우선(depth first) 방식은 M1,M2,M3,M4,M5,M6,M7 순서로 통합
너비 우선(breadth first) 방식은 M1,M2,M6,M7,M3,M4,M5 순서로 통합
설계상의 오류를 빨리 발견할 수 있음
많은 수의 테스트 스텁이 필요하고 구현되는 비용이 많이 소요된다면 효과적이지 않음

상향식 통합: 하위 모듈을 먼저 통합하고 상위에 있는 모듈들을 통합하는 방식으로 테스트 드라이버가 필요
하위에 있는 모듈들을 충분하게 테스트할 수 있음
설계 오류를 조기에 발견하지 못함

샌드위치 통합: 상향식 통합 방식과 하향식 통합 방식을 절충하여 통합하는 방식
1.8.3 스모크 테스트(Smoke Test)
> 빌드가 테스트할만한 수준인지를 확인
> 각 모듈의 중요한 기능의 일부분, 화면 이동 경로, 회귀 테스트 범위의 일부분 등 체크

1.8.4 시스템 테스트(System Test)
> 통합 테스트가 완료된 후에 완전한 시스템으로 수행
> 시스템의 기능측면뿐만 아니라 비기능적인 요구사항도 검증
> 견고성/신뢰성/성능 테스트
- 견고성 테스트: 시스템이 비정상적인 경우에도 얼마나 동작이 원활하게 이루어지는지 나타내는 속성(네거티브 테스트)
- 신뢰성 테스트: 시스템이 어느 기간동안 요구되는 서비스를 제공하는 능력 측정
- 성능 테스트: 부하 테스트/스트레스 테스트/스파이크 테스트/안정성 테스트
1.8.5 인수 테스트(Acceptance Test)
> 실제 사용자 환경에서 사용자가 테스트 수행
> 인수 기준을 만족하는 가를 검사
> 시스템 테스트에서 사용한 테스트 케이스를 이용할 수 있음
1.8.6 회귀 테스트(Regression Test)
> 소프트웨어가 수정된 후에 변경이 올바르게 되었는지 검사
> 프로그램 수정 전에 정상 작동했던 기능들이 수정 후에도 정상인지 시험
> 수정되기 전에 작성된 테스트 케이스를 실행하여 수정 전의 기능들이 정상 작동하는지 확인