회귀 테스트

회귀 버그를 찾는 모든 소프트웨어 테스트 방식은 회귀 테스트(regression testing, non-regression testing)라 할 수 있다. 회귀 버그는 이전에 제대로 작동하던 소프트웨어 기능에 문제가 생기는 것을 가리킨다. 일반적으로 회귀 버그는 프로그램 변경 중 뜻하지 않게 발생한다.

회귀 테스트로는 이전의 실행 테스트를 재 실행하며 이전에 고쳐졌던 오류가 재현되는지 검사하는 방법이 많이 사용된다.

경험적으로 이러한 오류 재현 방법은 꽤 효과적이다. 왜냐하면 부실한 버전 관리로 인해 이전의 버그 수정분을 유실하고 이로 인해 버그가 재발하는 경우가 종종 있으며, 또한 그저 자주 수정하는 방법은 프로그램을 지저분하게 하는 임시 방편일뿐 근본적인 해결은 되지 못하기 때문이다. 임시적인 수정분들은 프로그램의 다른 부분을 변경할 경우 무용지물이 되는 경우가 많다. 즉, 리팩토링을 통해서 몇몇 기능을 재디자인할 경우 동일한 문제가 이전에 고쳐진 부분에서 다시 발생하는 경우가 많다.

그러므로 버그가 발생했을 경우 이를 수정하면서 해당 버그를 발견할 수 있는 테스트 케이스를 작성하고 이를 이용해 프로그램을 변경할 때마다 테스트를 다시 수행하는 것이 좋다. 수동으로 할 수도 있지만, 보통은 테스트 자동화 툴을 사용한다. 일반적으로 '테스트 스위트'들은 회귀 테스트 케이스들을 자동으로 처리해주는 테스트 환경을 제공한다. 어떤 테스트 스위트들은 자동으로 전체 회귀 테스트를 정해진 시각에 수행하고 그 결과를 보고해주는 기능도 제공한다. 일반적으로 (작은 규모의 프로젝트일 경우는) 컴파일이 이뤄졌을 때에, (덩치가 좀 되는 프로젝트일 경우는) 매일 밤 또는 매주 전체 테스트를 실행한다.

회귀 테스트는 익스트림 프로그래밍의 중요한 부분이다. 이 방법론에 따르면 디자인 문서는 처음 작성된 후에도 소프트웨어 개발 주기 상의 모든 단계마다 업데이트된다. 그러한 업데이트는 전체 소프트웨어 패키지에 대한 확산적이며 반복적인 자동화 테스트를 통해 이뤄진다.

사용
회귀 테스트는 프로그램의 정확성뿐만 아니라 그 결과물의 품질을 지속적으로 기록하기에도 유용하다. 컴파일러 디자인 상의 인스턴스를 위해 회귀 테스트는 테스트 스위트의 코드 크기, 시뮬레이션 시간과 컴파일 타임을 지속적으로 기록해야 한다.

회귀 테스트는 크게 기능 테스트와 유닛 테스트로 분류할 수 있다. 기능 테스트는 완성된 프로그램에 여러 가지 입력을 주어 동작시켜 보는 활동이다. 유닛 테스트는 개별 함수, 서브루틴, 메소드 등을 동작시켜 보는 활동이다. 기능 테스트와 유닛 테스트 도구는 모두 써드파티 제품인 경우가 많고, 또한 두 가지 테스트 모두 자동화되어 있는 경우가 많다. 기능 테스트는 프로그램에 대한 연속적인 입력의 형태로 기술될 수 있는데, 마우스 포인터의 이동이나 클릭까지 표현할 수 있는 자동화된 메커니즘을 포함하기도 한다. 유닛 테스트는 프로그램 코드 내에 포함되어 있는 별도의 함수들인 경우도 있고, 테스트 대상이 되는 코드의 변경이 전혀 없이 별도의 드라이버 계층으로 구성되는 경우도 있다.

회귀 테스팅 문제와 최적화 기법
회귀 테스트를 수행하는 가장 간단한 방법은 이전 버전에 해당하는 회귀 테스트 케이스를 모두 실행하는 것이다. 하지만 이 방법을 따를 경우, 소프트웨어의 버전이 올라갈수록 실행해야 하는 회귀 테스트 케이스 개수가 늘어나는 단점이 있다. 심한 경우, 회귀 테스트 스위트의 크기가 너무 커서 더 이상 정상적인 회귀 테스트를 진행하는 것이 불가능할 수도 있다. 이 문제를 해결하기 위해 크게 테스트 스위트 최소화, 테스트 케이스 선택, 테스트 스위트 우선순위화 세 가지의 최적화 기법이 개발되었다. 테스트 스위트 최소화 기법은 사용하는 테스트 기준(예를 들어 코드 커버리지)을 달성하는 데 불필요한테스트를 회귀 테스트 스위트에서 제거하는 것을 기본 골자로 한다. 테스트 케이스 선택 기법은 이전 버전과 현재 버전을 비교하여 변화가 가해진 부분과 연관이 있는 테스트만을 선택하여 실행하는 기술이다. 마지막으로 테스트 스위트 우선순위화는 회귀 테스트에 걸리는 시간이 너무 길어서 임의의 시점에 종료해야 할 경우, 가능한 최선의 테스트가 행해졌음을 보장하기 위해 테스트 케이스에 우선순위를 부여해서 회귀 버그를 인지할 확률이 가장 높은 테스트부터 실행하는 기법이다.

더 보기 
 소프트웨어 개발 프로세스
 유닛 테스트

각주 

소프트웨어 테스트
익스트림 프로그래밍