소프트웨어 테스팅(Software Testing)
“테스트는 프로그램이나 시스템이 예상대로 작동할 것이라는 확신을 증진시키는 과정이다.” - 윌리엄 C. 헷젤(Willian C. Hetzel)
테스팅이란 기능적 측면에서 제품 또는 서비스가 고객의 요구사항을 충족하는지 확인하고 프로덕트 기능, 시스템 로직/성능/안전성 등 제품 내/외부적 요인에 의해 발생되는 결함이 없는지 확인하는 활동과 관리적 측면에서 품질 보증 활동으로 쌓아온 품질 데이터를 활용하여 리스크를 판단하고 문제를 예방하는 활동을 통해 제품의 신뢰도를 향상하는 과정입니다.
지금까지의 테스팅은 조직적 차원에서 기획/개발과 분리하여 특정 조직이 수행하는 역할이라고 인식해왔습니다. 하지만 테스팅은 테스트 조직만의 업무가 아닙니다. 기획은 최종 결과물의 완성도를 생각하며 제품을 디자인하고 개발은 설계부터 코딩까지 개발 프로세스 전반에 제품의 품질을 고려하며 작업합니다. 테스터나 테스트 리더는 제품 설계단계부터 출시 이후까지 제품에 영향을 미치는 모든 요소를 발견하고 제어하며 차단하고 예방하는 활동을 수행합니다.
제품을 만드는 구성원 각자의 작업 범위안에서 관점과 목적과 방법이 다를뿐 테스팅은 제품을 만드는 모두의 작업에서 빠질수 없는 활동의 한 부분입니다.
기존에 배워왔던 테스트조직 내 활동범위에 한정된 ‘테스팅'에 대한 인식은 이제는 바뀌어야 합니다. 인식이 바뀔때 품질을 대하는 태도와 책임도 특정 조직의 것에서 제품을 만드는 구성원 모두의 것으로 바뀔 수 있습니다.
제품의 최종 품질 목표를 모두가 같은 지점을 바라보고 추구할때 고객의 기대수준{‘사용자는 제품의 소프트웨어는 ‘제대로 작동' 할 것이라 기대한다.’}에 맞는 제품을 만들 수 있습니다.
[ISO/IEC9126 품질모델 기준]
*ISO/IEC 9126은 소프트웨어 품질특성과 척도에 관한 표준 지침으로, 개발 중에 있거나 또는 개발완료 된 소프트웨어의 품질을 측정하는 척도로 사용될 수 있다.
1) 기능성 : SW가 특정 조건에서 요구를 충족 시키는 기능을 제공할 수 있는 능력
2) 신뢰성 : SW가 특정 상황에서 특정 기간 동안 일정 수준 이상으로 동작할 수 있는 능력
3) 사용성 : 특정 조건에서 소프트웨어를 쓰고 배우고 이해하기 쉽게 만드는 능력
4) 효율성 : 특정 조건에서 적절한 자원을 소모하면서 적절한 성능을 제공할 수 있는 능력
5) 유지보수성 : SW를 얼마나 쉽게 수정(정정, 개선, 환경변화 수용, 요구사항 수용, 기능 추가 등) 할 수 있는지 측정한 능력
6) 이식성 : SW가 다른 환경으로 이식될 수 있는 능력
소프트웨어 또는 시스템 실행 중 기능이 정상적으로 동작하지 않을 때나 동작하지 않아야 함에도 동작하는 오류(Error)를 만날때가 있습니다. 이런 오류를 버그(Bug) 또는 결함(Defects) 또는 이슈(Issue)라고 부릅니다. 이는 사용자 관점에서의 버그이고 제품을 만드는 개발 관점에서 버그는 소프트웨어나 시스템의 오작동의 원인이 되는 코드상 오류 외,
▣ 요구사항과 다르게 동작하거나 요구사항이 누락된 소프트웨어/시스템
▣ API, 네트워크, 하드웨어상 문제로 인하여 발생되는 오류 또는 기대하지 않은 동작의 발생
▣ 해커의 공격, 어뷰징 등으로 발생되는 보안 이슈
▣ 고객 요구사항/기획명세/개발설계 등 문서상 존재하는 결함
▣ 복잡한 코드, 아키텍처의 복잡도로 인해 발생되는 문제
▣ 유지보수의 어려움
▣ OS/시스템/하드웨어 등 개발환경 변경
▣ 유저 시나리오상 사용성 문제
▣ 소프트웨어가 다양한 환경으로 이식되지 못하는 문제
▣ 시스템, 모듈 간 인터페이스가 안되는 문제
위와같은 다양한 원인으로 발생되는 결함은 장애의 원인이 될 수 있습니다.
소프트웨어 테스팅 활동은 소프트웨어 수명주기 전반에 걸쳐 테스트 레벨과 테스트 유형으로 구별되어 수행되며 각 테스팅 활동은 개발 활동과 밀접한 관계를 가지고 있습니다.
각각의 테스트들은 테스트 목적과 목표가 별도로 존재하고 테스트 대상과 테스트 방법이 구별됩니다. 또한 발견되는 결함의 유형이나 장애도 다르고 테스트를 수행하는 주체도 다릅니다. 예를들어 단위 테스팅은 프로그래밍 코드단에서 개발자에 의해 테스트가 수행되고 테스트 조직으로 인수된 이후 시스템 테스팅 단계에서 테스트 조직에 의해 실제 사용자가 사용하게 될 빌드를 대상으로 테스트가 수행됩니다.
단위 테스팅 또는 코드 테스팅
단위 테스트는 하나의 모듈이나 프로그램, 클래스, 메소드 등 가장 작은 단위의 소프트웨어를 대상으로 요구사항대로 작동되는지 확인하는 테스트입니다. 예를들어 로그인, 회원가입, 결제 등 하나의 기능에 대한 독립된 테스트를 말합니다.
단위 테스트는 프로그래밍 코드를 중심으로 개발자에 의해 테스트가 수행되고, 별도 테스트 케이스 없이 개발 설계서, 컴포넌트 명세서와 같은 개발 산출물로 테스트가 수행됩니다.
단위 테스트 특징은 코드를 작성한 개발자 또는 개발팀에 의해 테스트가 수행되어서 발견되는 결함을 별도 디버깅 기간을 두고 처리하지 않고 발견 즉시 수정되며 결함에 대한 기록을 남기지 않습니다.
단위 테스트가 잘 정착되면 제품의 모듈별 품질이 향상되어 안정성을 확보할 수 있고 전반적인 테스팅 시간을 절감하고 비용을 감소할 수 있습니다.
통합 테스팅
각각의 모듈이 개발이 완료되면 모듈을 통합하게 됩니다. 이때 통합하는 과정에서 발생될 수 있는 모듈간 인터페이스 즉, 모듈 간 상호작용하는 동작을 확인하는 테스트가 바로 통합 테스트입니다. 예를들어 스마트폰 어플리케이션을 실행하면 API를 호출하여 고객의 요청에 대한 응답을 내려줍니다. 어플리케이션으로부터 API를 호출하여 응답을 내려주는 동작이 정상적으로 작동되는지를 확인하는 것이 통합테스트입니다.
통합 테스트에는 모듈간 상호작용뿐 아니라 OS나 하드웨어 등 시스템간 상호작용도 포함하여 테스트를 수행합니다.
시스템 테스팅
시스템 테스트는 통합이 완료된 완벽한 소프트웨어 제품을 하드웨어와 결합한 뒤 시스템 기능과 하드웨어 통합간 인터페이스 전체를 확인하는 테스트입니다. 시스템 테스트는 일반적으로 사용자가 실제 사용하게될 환경 또는 그와 유사한 환경에서 테스트가 수행됩니다. 이유는, 시스템 테스트의 목적이 기능적 요구사항과 비기능적(시스템 성능, 상호작용 및 응답 속도 등) 요구사항 모두를 포함하고 있고 각각의 요구사항에 대한 정확한 검증 결과는 실제 사용자 환경에서 테스트가 수행되어야 환경이 가진 제한적인 결함이나 장애, 리스크를 최소화할 수 있기 때문입니다.
인수 테스팅
실제 시스템을 사용하게 될 최종 사용자(고객)가 제품이 요구사항을 충족하는지 확인하고 이에 대한 평가를 얻기위한 테스트입니다. 또 다른 목적은 제품이 실제 운영 환경에서 사용할 준비가 되었는지 확신을 얻기위한 과정입니다.
인수테스팅은 ‘알파 또는 베타 테스팅'이라는 이름으로 실 사용자에의해 테스트가 수행되기도 하고, 고객의 직접 참여가 어려울 경우 테스트조직이나 제품 관련자가 ‘고객의 입장'에서 제품 완성도를 확인하는 테스트를 수행합니다.
기능 테스팅
기능 테스트는 기획서 또는 고객 요구사항 명세서, 개발 설계서와 같은 문서를 기반으로 도출된 테스트 케이스를 사용하여 시스템 기능과 특징 그리고 시스템간 상호작용을 확인하는 테스트입니다.
비기능 테스팅
비기능 테스트는 시스템 성능, 유용성, 안정성, 확장성 등 비기능적인 측면을 확인하는 것으로 시스템이 어떻게 동작하는지 확인하는 테스트입니다. 예를들어 신규 게임이 출시되고 많은 사용자가 한꺼번에 게임에 접속하였을때 서버가 다운되지 않고 잘 버틸수 있는지 확인하는 부하테스트가 비기능 테스트에 해당됩니다.
이 외 클라이언트 성능테스트, 서버 성능(부하, 스트레스)테스트, 호환성테스트 등 테스트가 포함됩니다.
스모크(Smoke) 테스팅
스모크 테스트는 시스템 기본 기능을 확인하는 테스트로 테스트 조직에서 정식 테스트를 시작하기 앞서 인수된 제품이 테스트가 가능한 상태인지 확인하기위한 용도로 신속하게 주요 기능과 해당 기능에 연관된 상호작용을 확인하는 테스트입니다.
스모크 테스트 또는 새너티Sanity 테스트 또는 BAT(Build Acceptance Test) 등으로 불리고 있습니다.
리그레션(Regression) 테스팅
리그레션 테스트는 이미 테스트 된 시스템을 반복해서 확인하는 것으로 결함 수정 이후 변경의 결과로 이전에 제대로 작동하던 기능에 문제가 발생되지 않는지, side-effect로 인해 새롭게 발생된 결함이 없는지, fix된 결함이 재발생되지 않는지 확인하는 테스트입니다.
마이그레이션(Migration) 테스팅
데이터 마이그레이션은 서버 버전이 업데이트되거나, 서버 또는 디바이스가 교체되거나, 데이터베이스를 통합하거나 폐기할때 데이터를 한 위치에서 다른 위치로 이동하는 것을 의미합니다.
데이터 마이그레이션 테스트는 데이터 이동 후 분실되거나 변경되는 데이터, 기능상 작동되지 않는 문제, 새롭게 발생되는 결함은 없는지 확인하고 시스템 안정성을 보장하기위해 수행되는 테스트입니다.
테스팅이 제품을 만드는 구성원 모두의 활동이라면 테스트 조직에서 수행하는 테스팅 활동 범위를 제품 개발이 완료된 후 SW를 실행하면서 결함을 찾아내는 반복적이고 수동적인 업무를 수행하는 것이라고 정의할 수 있을까요.
아닙니다. 이것은 테스팅 활동 중 일부에 해당될 뿐입니다.
테스트 조직의 테스팅 활동은 테스트 계획/전략, 품질 목표 기준 설정, 테스트 분석과 설계, 품질 요소 및 리스크 정의, 테스트 케이스 수행, 테스트 품질 평가, 프로세스 준수 감사 및 개선 등 제품 설계단계부터 출시 이후까지 모든 영역과 단계에서 활동이 존재합니다.
테스트 조직의 테스팅 활동에 대해서는 다른 페이지에서 상세히 다뤄보겠습니다.