PALM: 경로 인식 LLM 기반 테스트 생성 시스템
초록
PALM은 AST 수준에서 프로그램 경로를 정적으로 열거하고, 각 경로마다 단언문을 삽입한 변형 프로그램을 생성해 LLM에게 프롬프트로 제공한다. 이를 통해 복잡한 문자열 연산이나 외부 라이브러리 호출을 SMT 제약식으로 모델링할 필요 없이 LLM이 경로를 만족하는 테스트 입력을 생성하도록 유도한다. 인터랙티브 프론트엔드가 경로 커버리지를 시각화하고, 테스트‑경로 정합성을 검증·재생성하는 피드백 루프를 제공한다. 실험에서는 HumanEval‑Java 124개 프로그램에서 기존 LLM 기반 도구보다 24‑35% 높은 경로 커버리지를 달성했으며, 사용자 연구에서도 테스트 이해도와 자신감이 향상됨을 보였다.
상세 분석
PALM은 전통적인 심볼릭 실행이 직면한 두 가지 근본적인 한계를 혁신적으로 해결한다. 첫째, 심볼릭 실행은 문자열 비교, 대소문자 무시(equalIgnoreCase) 등 복잡한 라이브러리 함수에 대한 모델링이 부족해 경로 제약을 SMT로 변환하지 못한다. PALM은 이러한 제약을 회피하기 위해 AST 기반 정적 분석으로 모든 가능한 실행 경로를 열거하고, 각 경로를 “프로그램 변형” 형태로 재구성한다. 변형 프로그램은 원본 코드 흐름을 그대로 유지하면서, 각 분기점에 assertTrue 혹은 assertFalse를 삽입해 목표 경로의 분기 결과를 명시한다. 이 방식은 SMT 공식화 없이도 LLM이 인간 수준의 코드 이해를 바탕으로 해당 경로를 만족하는 구체적인 입력을 생성하도록 안내한다는 점에서 획기적이다.
둘째, 기존 LLM 기반 테스트 생성 도구는 전체 프로그램을 하나의 프롬프트로 제공해 “일반적인” 입력을 유도하지만, 경로별 특성을 반영하지 못해 미묘한 코너 케이스를 놓친다. PALM은 경로‑특정 변형을 프롬프트로 사용함으로써 LLM에게 “이 분기들은 반드시 true/false이어야 한다”는 명시적 힌트를 제공한다. 또한, 생성된 테스트를 해당 변형 프로그램에 실행해 실제로 단언이 모두 통과되는지 검증한다. 실패 시 첫 번째 위반 단언과 이전 테스트를 피드백으로 LLM에 재전송해 최대 5번까지 반복 재생성한다. 이 피드백 루프는 LLM이 이전 오류를 인식하고 경로를 정확히 맞추도록 유도한다.
시스템 아키텍처는 두 단계로 구성된다. 1) 경로 추출 단계에서는 AST를 재귀적으로 탐색해 IfStatement, WhileStatement, BlockStatement 등을 처리하고, 루프는 사용자가 지정한 바운드(K, 기본 2)까지 언롤링한다. 알고리즘 1은 이 과정을 형식화한 것으로, 각 분기마다 assertTrue/False를 전위(prepend)하고, 블록 내 서브경로를 조합해 전체 경로 집합을 생성한다. 함수 인라인, 변수 리네임, 상수 전파·폴딩을 통해 변형 프로그램이 실행 가능한 형태가 되도록 정제한다. 2) 테스트 생성 단계에서는 변형 프로그램을 LLM에 프롬프트하고, 반환된 테스트 코드를 실제 JVM에서 실행해 경로 커버리지를 확인한다. 성공적인 테스트는 심볼릭 실행 트리의 해당 리프 노드에 녹색으로 표시되고, 실패 테스트는 빨간색으로 표시되며, 사용자는 UI에서 바로 원인 단언을 확인하고 프롬프트를 수정할 수 있다.
실험 결과는 두 가지 축을 강조한다. 정량적 성능 측면에서 PALM은 동일 LLM 백엔드(GPT‑4o‑mini, GPT‑4o‑3‑mini)를 사용할 때 각각 35.0%와 24.2% 높은 경로 커버리지를 달성했으며, 반복 검증·재생성 과정을 적용하면 추가로 14.2% 향상된다. 전통적인 Symbolic PathFinder는 34.3%의 프로그램에서 외부 API 모델링 부족으로 경로 제약을 전혀 도출하지 못했다. 사용자 경험 측면에서는 12명의 개발자를 대상으로 한 within‑subject 연구에서, PALM의 인터랙티브 프론트엔드를 사용한 그룹이 테스트가 실제로 목표 경로를 실행했는지 판단하는 정확도가 크게 상승했으며, 테스트 설계에 대한 자신감도 유의미하게 증가했다.
한계점도 존재한다. 경로 수가 폭발적으로 증가할 경우 AST 기반 열거와 변형 생성 비용이 급증한다; 현재는 루프 언롤링 바운드를 고정값으로 제한해 탐색 범위를 억제한다. 또한, LLM이 생성한 테스트가 실행 환경(예: 파일 시스템, 네트워크) 의존성을 갖는 경우, 변형 프로그램에 삽입된 단언만으로는 충분히 검증되지 않을 수 있다. 향후 연구에서는 경로 선택 전략(우선순위 기반 탐색)과 멀티‑모달 피드백(코드 실행 로그와 함께 LLM에 제공) 등을 도입해 확장성을 개선할 여지가 있다.
요약하면, PALM은 심볼릭 실행의 체계적인 경로 탐색 능력과 LLM의 자연어·코드 이해·생성 능력을 결합해, 제약식 모델링이 어려운 현대 소프트웨어에 대해 실용적인 테스트 자동화를 제공한다. 인터랙티브 시각화와 피드백 기반 재생성 메커니즘은 개발자에게 경로‑테스트 매핑을 명확히 보여주어, 테스트 설계 과정에서의 인지 부하를 크게 낮춘다.
댓글 및 학술 토론
Loading comments...
의견 남기기