Testing
테스팅이란 응용 프로그램 또는 시스템(구성요소)의 동작과 성능, 안정성이 요구 하는 수준을 만족하는지 확인하기 위해 결함을 발견하는 과정이라고 할 수 있다.
- 정적 테스트: 프로그램을 개발하기 전에 요구사항 등을 리뷰 하는 것
- 동적 테스트: 프로그램 개발 이후에 실제 실행하면서 테스트 하는 것
소프트웨어 개발, 유지보수, 운영 시 테스팅의 역할
- Testing을 통해 release 전에 발견 되지 않은 결함들이 수정된다면, 운영 환경 내에서 발생하는 risk를 줄이는데 기여 할 수 있으며 소프트웨어 품질에 도움을 준다.
- Testing은 개발 초기의 요구사항 분석 단계 부터 review 및 insfection을 통해 정적으로 이뤄질 수 있으며 각각의 개발 단계에 대응하는 test level에 따른 testing이 이루어진다.
- 기존에 운영되는 소프트웨어 시스템이 유지 보수 활동으로 변경 및 단종되거나 환경이 변하는 경우, 변경된 소스트웨어에 대한 testing과 변경된 환경에서 운영 testing이 요구된다.
- 소프트웨어 testing은 계약상(법적) 요구조건들, 또는 산업에 특화된 표준들을 만족 시키기 위해서 필요하다.
Testing의 일반적인 원리
Testing이 결함이 존재함을 밝히는 활동이다.
Testing은 결함이 존재함을 드러내지만, 결함이 없다는 것을 증명할 수 없다.
즉, 프로그램이 완벽하다고 증명할 수 없다.
이는 Test한 부분까지만 잘 동작한다고 말할 수 있고 테스트를 하지 않은 부분은 결함이 있는지 없는지 예측할 수 없다.Exhaustive Testing은 불가능 하다.
모든 가능성(입력과 사전 조건의 모든 조합)을 Testing 하는 것은 지극히 간단한 소프트웨어를 제외하고 가능하지 않다.
- 한 프로그램 내의 내부 조건이 무수히 많음
- 입력이 가질 수 있는 보든 값의 조건이 무수히 많음
- GUI이벤트 발생 순서에 대한 조합도 무수히 많음
완벽한 Testing 대신, 리스크 분석과 결정된 우선순위에 따라 Testing 활동 노력을 집중 시켜야 한다. (Risk-based testing)
완벽한 Testing은 우주항공, 의료 등 안전이 최우선(Safety critical)인 소프트웨어를 개발 할 때 고려 할 수 있으나 실제로 완벽한 것은 아니고 강력한 Testing으로 볼 수 있다.
Test Driven Development
- 새로 추가 되는 기능에 해당하는 Test를 먼저 작성, 이때 각 test는 간결 해야함
- 테스트를 수행하고 새 테스트가 실패하는지 확인한다.
- 새 테스트는 항상 실패해야만 테스트가 잘 작성됐다고 할 수 있다.
- 코드를 작성
- 테스트 수행
- 코드의 refactor
- 반복