테스팅 모델의 중요성
테스팅 모델이란 테스팅 범위에 대한 정의이자 그 범위를 탐색하는 설명서라 할 수 있다. 테스팅 모델은 개발하는 제품의 품질에 대한 목표와 지향을 반영하며, 품질 달성에 대한 전략적인 지침을 포함한다. 테스팅 모델을 테스트 케이스의 집합이라 할 수는 없지만 일반적으로 테스트 케이스의 집합으로 구체화되는 경우가 많다.
A라는 제품이 임베디드 소프트웨어로 자동차 운행에 관련된 ECU와 같은 소프트웨어라면 사용성보다는 신뢰성, 효율성 등이 중요할 것이며 테스팅 모델 또한 신뢰성과 효율성을 검증하는 데 중점을 둔 테스트 케이스로 이뤄질 것이다. B 제품이 웹 기반의 불특정 다수의 사용자를 위한 소프트웨어라면, 보안성과 사용성이 신뢰성보다 중요하게 테스트될 수 있으며, 이러한 품질에 대한 지향과 그것을 달성하기 위한 전략 및 방안이 테스트 케이스를 통해 모델로 구체화될 수 있다.
이러한 테스팅 모델은 그 정의가 명시적이든 묵시적이든 간에, 테스팅이라는 활동에 반드시 필요한 항목이라 하겠다.
쉽게 예를 들어 넓은 운동장에서 휴지를 주우려고 학생 다섯 명을 동원하여 일을 한다고 하자. 다섯 명을 한 명씩, 또는 동시에 운동장에서 출발시킨다면 비슷한 패턴의 움직임을 보이면서 운동장을 지나며 휴지를 줍는다. 즉 앞사람을 쫓아 가면서 줍는다거나, 좌우로 움직이며 운동장을 가로지른다고 하더라도 비슷한 패턴으로 움직인다는 것이다. 물이 괸 웅덩이나, 운동장 가에 놓여 있는 철봉, 그네, 강단 등은 모두 피하고 싶은 장소 아닌가. 이럴 때 효과적인 방법은 휴지를 주워야 하는 영역을 정하고 나름의 방안을 적용하는 것이 되겠다. 다섯 명이 운동장 한쪽 끝에서 출발할 때 일정한 간격을 벌려 출발하고 직선으로 운동장을 가로지르며 자신의 영역 내에서 휴지를 줍는 등의 방법이 그런 방법 중 하나라 하겠다.
이러한 것이 모델이라 할 수 있다. 테스팅 모델은 테스팅을 효과적으로 하기 위해 반드시 준비해야 할 필수 항목이다.
테스팅과 비용
익히 알려진 것처럼 테스팅을 통해 소프트웨어를 버그가 전혀 없는 무결점 제품으로 만들기란 (거의) 불가능하다. 테스팅 활동의 의의는 제품의
무결함을 증명하는 것이 아니라, 소프트웨어의 개발 목적과 소프트웨어를 비교하여 그 차이(버그)를 찾아 제품의 품질을 높이는 것이다.
소프트웨어의 품질(사용자가 기대하는 수준의 서비스와 기능)을 높이기 위해 소프트웨어를 개발 요구 사항과 비교하여 검증(verification, validation)하는 테스팅 활동은 검증 범위와 영역을 넓힐수록 비용이 더 많이 든다는 점을 인지할 필요가 있다.
테스트 케이스의 대표성
사용자가 요구하는 수준의 서비스와 기능을 소프트웨어가 만족하는지에 대한 테스팅 활동의 목적을 달성하는 데 첫 번째로 필요한 고민은 테스팅
모델의 적용 범위(coverage)가 되겠다.
앞서 언급한 ‘운동장 휴지 줍기’ 모델처럼 운동장의 휴지를 줍기 위한 적용 범위는 활동의 성과와 효율성에 중요한 영향을
끼친다.
먼저 적용 범위를 얘기하기 전에 테스트 케이스의 대표성을 이해할 필요가 있다. 운동장 휴지 줍기 B 모델과 A 모델을 비교해 결국 발자국의 면적(발자국 30개*250mm*100mm=500cm3)은 똑같다고 생각할 수 있다 하지만 테스트 케이스가 갖는 ‘대표성’의 특성을 고려한다면 훨씬 효과적인 모델이라 할 수 있다.
테스트 케이스의 대표성이란 테스트 케이스는 근접한 테스트 케이스와 비슷한 결과를 보이기 때문에 일정한 기준을 가지고 분할된 테스트 케이스 중 선정된 하나의 테스트 케이스는 같은 영역에서 대표성을 가질 확률이 높다는 것이다. 예를 들어 다음과 같은 함수의 경우에 매개변수 1은 1부터 무한대까지의 양수 매개변수를 대표하고, -1은 -1부터 무한대 음수 매개변수를 대표하는 테스트 케이스의 대표성을 갖는다는 것이다.
이러한 속성을 실제 테스트 사례로 확장해 생각해 보자. 휴대전화에 탑재된 소프트웨어를 테스팅할 때 카메라와 메시지, 일정 관리, 화면 관리 등을 테스트해야 하는데, 카메라 해상도가 네 가지 모드(1600*1200, 1280*960, 1024*768, 800*600)를 지원하는 경우 이 중 하나의 테스트 케이스 결과가 다른 테스트 케이스 결과와 비슷할 확률이 높고 이러한 경우 카메라 해상도 중 하나(1600*1200)는 다른 테스트 케이스의 대표성을 갖는다고 할 수 있다.
이러한 경우 하나의 카메라 해상도 테스트 케이스를 테스트한 후 문자 메시지나 일정 관리 기능을 테스트하는 것이 더 효과적인 테스팅 방법일
것이다(물론 모든 테스트 케이스를 다 확인해 볼 수 있다면 더욱 좋겠지만 말이다).
테스팅할 때 흔히 얘기하는 임의 테스팅(random testing)의 경우도 이러한 속성을 고려해 다음 번 테스트 케이스 선정시 가장 먼 거리(논리적 거리, 예를 들면 카메라 해상도 테스트 후 메시지 테스트 등)의 테스트를 수행하는 것이 효과적이라는 주장과 모델이 학계에 제안되고 있다.
이러한 테스트 케이스의 대표성을 고려할 때 다음 두 개 모델 중 비록 B 모델이 테스트 항목은 A 모델에 비해 적지만 A 모델에 비해 적용
범위가 높고 효율적인 모델이라 할 수 있겠다.
테스팅 모델 최적화
앞서 논한 것처럼 테스트 범위를 넓혀 테스트를 많이 수행할 경우 무한대의 비용이 예상된다. 현실 상황에서는 개발 업무에만도 비용과 시간이
충분하지 않은 경우가 대부분이기 때문에 더 적은 비용으로 테스트를 수행하고자 하는 요구가 일반적이다.
그렇다면 어떤 순서로 비용 절감을 위한 테스트 모델을 개발해야 하는가? 또 어떤 방법으로 테스트 케이스를 줄여(최적화) 비용 대비 효과를
높일 수 있을까?
다음은 바람직한 테스트 케이스 최적화 절차를 보여준다. 테스트 모델을 개발할 때는 먼저 적용 범위를 고려하여 테스트 범위를 넓히고, 그 다음 테스트 케이스의 대표성을 고려하여 테스트 케이스를 최적화하는 순으로 수행해야 하겠다.
테스팅 기법을 이용하여 테스트 케이스를 효과적으로 정리하는 방법은 없을까? 다음은 현재 테스팅 활동에 사용되는 잘 알려진 테스팅 기법들이다.
다음 테스팅 기법은 대부분 제어 흐름이나 상태 전이를 파악함으로써 발생할 수 있는 다양한 경우에 대한 고려를 통해 발생 상황 누락을 줄여
테스팅의 적용 범위를 높이기 위한 것이다. 실제로 지금까지 현장에서 사용하는 테스팅 기법은 대부분 테스팅의 적용 범위에 집중하고 있으며, 테스팅
최적화에 대해서는 연구는 되고 있지만 잘 알려진 방법이 부족하다고 하겠다.
이런 상황에 ‘위험 기반 테스팅(risk based testing)’은 주목할 만한 테스팅 방법이라 하겠다. 위험 기반 테스팅은 위험도를 이벤트, 위험 요소, 위험 영향이나 상황 발생 가능성과 잠재된 문제를 고려하여 분석하고, 한정된 자원을 배분하여 테스팅의 우선순위(priority)를 정하는 기법이다(더 자세한 내용은 다음 기회에 살펴보겠다).
리스크(risk) = 사용빈도(frequency of use)*결함가능성(chance of defect)*손실(damage)
시간과 비용이 충분하면 적용 범위가 넓은 모델을 기반으로 테스팅을 수행할 수 있지만, 시간과 비용이 한정된 경우(현실적인 대부분의 경우) 위기 기반 테스팅의 개념을 적용하여 테스트 케이스를 분석해 정해진 비용과 시간에 맞춰 꼭 확인해야 하는 테스트 케이스의 최적화된 서브셋을 도출할 수 있겠다. 즉 한정된 시간과 비용, 그리고 결함 발생 가능성과 결함의 영향을 고려해 전체 테스트 항목 중에 구분화된 테스팅 항목의 서브셋을 도출할 수 있으며, 이러한 우선순위 레벨별 테스팅 세트를 체계화함으로써 상황에 따라 최적화된 테스팅 모델로 테스트 효율을 높일 수 있다.
결론
사실 테스트 모델을 최적화(최소화)하는 방법 이외에도 비용 절감을 위한 다른 방안이 있다. 테스팅 프로세스 개선, KPI 등을 이용한 테스팅 프로세스 관리, 테스팅 자동화 도입 등의 방법이다. 하지만 현실 상황에서는 대부분 비용을 줄이는 최선의 방법으로 테스트 모델을 최적화(축소)하기를 원하는 것이 일반적이라 하겠다. 소프트웨어 테스팅에 대한 인식이 높아지면 점차 비용 절감에 대한 다른 접근 방법에 대한 요구도 높아지리라 기대된다.