소프트웨어 테스팅의 필요성

1. 소프트웨어 시스템관점에서 테스팅의 필요성

- 소프트웨어가 기대한대로 동작하지 않는 경우 다양한 문제가 발생됨

(다양한 문제: 금전적 손실, 시간 낭비, 비지니스 이미지 손상, 부상, 사망 등)

- 테스팅은 이러한 소프트웨어 시스템의 문제를 최소화 하기 위해 반드시 필요


2. 소프트웨어 에러, 결함. 장애 (에러 → 결함  장애)

1) 에러(Error)

- 사람에 의해 발생, 잘못된 결과를 낳는 인간의 행위(Action)

- 사용자의 요구사항을 잘못 파악, 이해할 때 발생하는 실수(Mistake)를 의미

- 보통 버그(Bug)를 에러라고 함


2) 결함(Defects, Fault)

- 에러의 표현, 에러 또는 실수의 결과

- 잘못된 정보를 프로그램에 반영하는 경우와 올바른 정보를 빠뜨리는 경우 두 종류의 결함이 존재

- 개발자가 코드를 쓰거나 소프트웨어나 시스템 또는 문서를 작성할 때 결함을 만드는 오류(error)를 범할 수 있음

- 코드에 존재하는 결함은 장애(Failure)의 원인이 됨(모든 결함이 장애를 일으키는 것은 아님)

- 결함 발생의 기타 원인: 시간적 압박, 복잡한 코드, 기반환경(Infrastructure)의 복잡성, 기술이나 시스템의 변경, 수많은 시스템 상호간의 연동 등의 이유


3) 장애(Failure)

- 결함에 의해, 코드에 존재하는 결함이 실행될 때 장애가 발생 됨

- 장애 발생 시 시스템은 의도된 대로 동작하지 않거나 동작하지 말아야 함에도 동작함

- 결함 또는 환경적 조건에 의한 시스템의 부적절한 처리

- 장애 발생의 기타 원인: 환경적인 조건(방사, 자기, 전자기장, 물리적 오염 등)이 하드웨어 조건을 변경시켜 소프트웨어의 실행에 영향을 미칠 수 있음


3. 소프트웨어의 개발과정에서의 테스팅

- 발견하지 못했던 시스템 또는 문서의 결함들을 체계적인 테스팅을 통해 릴리즈 전에 발견, 수정

- 운영 환경 내에서 발생하는 결함들의 리스크(위험)을 줄이데 기여, 소프트웨어 시스템의 품질 향상에 도움을 줌

- 개발 과정에서의 테스팅: 컴포넌트(단위), 통합 테스팅, 인수 테스팅


1) 소프트웨어 개발과정에서의 테스팅

- 개발 초기의 요구사항 분석 단계부터 리뷰와 정적 분석을 통해 정적으로 테스팅 시작

- 각각의 개발 단계에 대응하는 테스트 레벨(Test Level)에 따른 테스팅이 이루어짐

- 개발과정에서 테스팅은 소프트웨어의 품질을 높이고 소프트웨어가 고객에 전달된 이후 결함이 발생할 가능성을 최소화 함

- 개발 초기에 테스팅을 통해 발견한 결함은 개발 후반부에서 발생한 테스팅 비용을 현저하게 줄일 수 있고, 결함을 수정하는 비용도 저렴


2) 개발과정에서의 테스팅 종류, 주체

- 개발조직이 중심 테스팅: 컴포넌트(단위) 테스팅, 통합 테스팅

- 독립성을 가진 테스트조직이 중심 테스팅: 시스템 테스팅, 시스템이 갖춰진 이후의 테스팅

(개발 조직의 지원을 받음)

- 인수 테스팅: 최종 소프트웨어 사용자가 인수하는 과정에서의 테스팅, 전체 개발 과정에서의 한 가지 테스팅임


4. 소프트웨어 유지보수 과정에서의 테스팅

1) 유지보수 과정에서 테스팅이 필요한 경우 (변경, 단종, 운영환경 변경)

- 기존에 운영하던 소프트웨어 시스템이 유지보수 활동으로 변경(Modification) 되었을 때

- 기존에 운영하던 소프트웨어 시스템이 단종되었을 때 

- 기존에 운영하던 소프트웨어 시스템의 운영환경이 변했을 경우


2) 유지보수 과정에서의 테스팅 필요성, 역할

- 변경된 시스템의 대상에 대한 그리고 변경된 환경에서의 운영 테스팅이 요구됨

- 변경으로 야기될 수 있는 결함과 그로 인해 발생 가능한 장애를 예방하는 활동


5. 소프트웨어 테스팅이 필요한 기타 이유

- 계약상(법적) 요구조건들 또는 산업에 특화된 표준들을 만족시키기 위해 필요


6. 테스팅과 품질

1) 품질 측정 가능

- 품질(Quality): 컴포넌트, 시스템, 프로세스가 명시된 요구사항은 물론 사용자와 고객의 필요와 기대를 충족시키는 정도

- 발견한 결함에 근거하여 대상 소프트웨어의 기능, 비기능적 요구사항과 품질 특성 관련 품질측정이 가능함

- 기능 및 비기능 테스트에서 찾은 결함은 소프트웨어의 품질을 판단하는 수단

- 품질 특성: 기능성, 신뢰성, 사용성, 효율성, 유지보수성, 이식성 등

(자세한 내용은 국제표준 소프트웨어 공학 - 소프트웨어 제품 품질(Software Engineering - Software Product Quality)' (ISO/IEC9126)에 기술)


2) 품질에 대한 확신, 품질 향상

- 테스팅으로 발견된 결함이 극소수이거나 없을 경우, 테스트 설계 및 실행이 정상적으로 진행되었으면 소프트웨어의 품질에 대한 확신을 가질 수 있음

- 올바르게 설계된 테스팅은 시스템의 전반적인 리스크 수준 향상

- 테스팅을 통해 결함을 발견, 발견된 결함을 수정하여 소프트웨어 시스템의 품질을 향상시킬 수 있음

- 테스트는 품질보증(QA, Quality Assurance)활동과 함께 수행하는 것이 좋음

- 품질을 높이기 위해서는 이전 프로젝트를 통해 많은 테스트 경험과 정보를 확보해야 함(품질보증의 관점)

- 과거의 프로젝트에서 얻은 결함의 주 원인과 관련 경험이 현재 프로젝트의 품질 향상에 기여

- 다른 프로젝트에서 발견된 결함의 근본 원인에 대한 이해를 바탕으로 프로세스 개선할 수 있음, 결함 재발을 방지함으로써, 차후 시스템의 품질을 개선

- 개발표준, 교육, 훈련, 결함 분석 등과 함께 테스팅을 품질 보증 활동의 하나로 통합하여 품질 향상을 확보


7. 테스팅의 수행 정도(테스팅, 얼마나 해야 충분 한가?)

1) 적절한 테스팅의 정도 파악: 리스크의 수준을 고려해야 함

2) 프로젝트 제약사항(기술적인 내용, 비지니스, 제품, 프로젝트 리스크, 시간, 비용 등)을 고려해야 함

3) 프로젝트 이해 관계자들이 릴리즈 결정을 내릴 수 있도록 충분한 정보를 제공해야 함

테스팅은 테스트된 소프트웨어나 시스템을 다음 단계로 전달하는 데 있어 프로젝트 이해관계자들이 릴리즈 결정을 내릴 수 있도록 충분한 정보를 제공해야 함