자동 테스트 데이터 생성을 위한 루프와 다차원 배열 히스토리스트 접근법
초록
본 논문은 변수 반복 횟수와 가변 길이 배열을 포함하는 프로그램의 자동 테스트 데이터 생성을 위해 두 가지 히스토리스트(kL, kS)를 제안한다. 코드 계측을 통해 모든 실행 경로를 탐색하고, 중복 경로를 필터링하면서 최소 반복 횟수를 예측한다. 선형 탐색, 버블 정렬, 병합 정렬, 행렬 곱셈을 실험 대상으로 삼아 단일 루프, 다중 루프, 1·2차원 배열에 대한 적용 가능성을 검증한다.
상세 분석
이 연구는 소프트웨어 테스트 자동화에서 가장 난제 중 하나인 “루프와 가변 배열이 결합된 프로그램의 경로 폭발” 문제를 해결하고자 한다. 기존 자동 테스트 데이터 생성 기법은 정적 루프 횟수나 고정 크기 배열을 전제로 하는 경우가 많아, 반복 횟수가 입력에 따라 동적으로 변하는 상황에서는 충분한 커버리지를 확보하기 어렵다. 논문은 이러한 한계를 극복하기 위해 두 가지 히스토리스트, 즉 가장 긴 경로 레벨(kL)과 포화 레벨(kS)을 도입한다. kL은 프로그램 내에서 가장 많은 반복을 포함하는 경로의 길이를 의미하며, kS는 모든 가능한 경로가 수집될 때까지 필요한 최소 반복 횟수를 나타낸다.
방법론은 먼저 소스 코드를 초단위(문장 수준)로 계측(instrumentation)한다. 각 루프 진입·탈출, 배열 인덱스 연산, 조건 분기 등을 로그로 남겨 실행 흐름을 정밀히 추적한다. 이후 무작위 입력을 반복적으로 제공하면서 로그를 분석한다. 입력 생성 과정에서 이미 수집된 경로와 동일한 경로가 발생하면 필터링 메커니즘이 이를 차단하고, 새로운 경로가 발견될 때까지 반복한다. 이때 kL과 kS를 동적으로 업데이트하여 “더 이상 새로운 경로가 나오지 않을 때”(포화 상태) 테스트를 종료한다.
실험 대상 프로그램으로는 선형 탐색(단일 루프, 고정 배열), 버블 정렬(중첩 루프, 1차원 가변 배열), 병합 정렬(재귀적 분할·정복 구조, 가변 배열), 행렬 곱셈(이중 중첩 루프, 2차원 배열)이 선택되었다. 각 프로그램에 대해 kL과 kS를 계산한 결과, 병합 정렬처럼 배열 크기가 커질수록 경로 수가 기하급수적으로 증가하는 경우에도 kS가 비교적 작은 값으로 수렴함을 확인했다. 이는 무작위 입력이 자연스럽게 다양한 분할·병합 패턴을 생성해 포화에 도달한다는 의미이며, 테스트 비용을 크게 절감한다는 장점을 시사한다.
또한, 필터링을 통한 중복 경로 제거는 전체 실행 횟수를 평균 30~45% 감소시켰으며, 테스트 커버리지는 95% 이상을 유지했다. 그러나 히스토리스트 기반 접근법은 입력 공간이 매우 제한적인 경우(kL이 작고 kS가 크게 차이나지 않을 때)에는 효과가 감소한다는 한계도 드러났다. 또한, 재귀 호출이 깊은 프로그램에서는 스택 오버플로우 위험을 방지하기 위한 추가적인 보호 메커니즘이 필요하다.
전반적으로 이 논문은 “경로 길이와 포화 수준”이라는 두 개의 직관적인 메트릭을 활용해 자동 테스트 데이터 생성의 효율성을 크게 향상시켰으며, 특히 가변 길이 배열과 복합 루프 구조를 가진 실무 코드에 적용 가능한 실용적인 프레임워크를 제시한다.
댓글 및 학술 토론
Loading comments...
의견 남기기