다양성으로 진화하는 테스트 생성 EvoGPT
초록
EvoGPT는 여러 프롬프트와 온도 설정을 활용해 LLM이 만든 다양한 테스트 케이스를 초기 개체군으로 사용하고, 진화 알고리즘으로 이를 최적화한다. 검색 정체 시 추가 LLM 호출로 새로운 테스트를 주입해 10% 수준의 커버리지와 변이 점수 향상을 달성한다.
상세 분석
EvoGPT는 기존 SBST와 LLM 기반 테스트 생성의 장점을 결합한 하이브리드 시스템이다. 핵심 아이디어는 “시드 다양성”이다. 저자들은 동일 LLM이라도 프롬프트 템플릿을 다섯 가지(예: 엣지 케이스 강조, 깊은 객체 체인 탐색, 창의적 어설션 스타일 등)와 온도값을 서로 다르게 설정해 총 25개의 서로 다른 테스트 스위트를 비동기적으로 생성한다. 이렇게 얻어진 시드들은 단순히 무작위가 아니라 의미적으로 서로 다른 코드 경로와 입력 공간을 탐색하도록 설계되었다.
생성된 테스트는 즉시 “generation‑repair loop”에 투입된다. 컴파일 오류나 런타임 예외가 발생하면 스택 트레이스를 캡처하고, 사전 정의된 수리 규칙과 추가 LLM 재프롬프트를 통해 자동으로 수정한다. 이 단계는 초기 시드의 품질을 크게 높이며, 이후 진화 단계에서 불필요한 무효 개체를 제거한다.
다음으로 “coverage‑guided assertion generation”이 적용된다. 현재 테스트 집합이 커버하지 못한 분기들을 식별하고, 해당 분기를 목표로 하는 테스트 메서드를 LLM에 요청한다. 이 과정은 TestART에서 차용한 기법으로, 어설션을 자동으로 삽입해 테스트의 검증력을 강화한다.
EvoGPT의 핵심 진화 알고리즘은 선택, 교차, 변이 연산을 포함한다. 적합도 함수는 라인 커버리지, 분기 커버리지, 변이 점수를 가중합한 형태이며, 각 세부 지표는 정규화돼 균형 있게 고려된다. 교차 연산은 두 테스트 스위트의 메서드 집합을 교환하고, 변이는 메서드 내부의 리터럴, 변수명, 어설션 등을 무작위로 바꾸어 새로운 후보를 만든다.
검색이 일정 세대 동안 적합도 향상이 없을 경우 “plateau detection”이 트리거된다. 이때 EvoGPT는 다시 여러 프롬프트·온도 조합으로 LLM을 호출해, 아직 커버되지 않은 분기와 변이에 초점을 맞춘 테스트를 생성한다. 이렇게 생성된 테스트는 현재 최적 개체군에 삽입돼 지역 최적에 빠진 진화를 탈출하도록 돕는다.
실험은 Defects4J 벤치마크(다양한 오픈소스 버그 프로젝트)에서 수행되었으며, 비교 대상은 SBST 대표 도구 EvoSuite와 LLM‑전용 도구 TestART이다. 결과는 평균 라인·분기 커버리지와 변이 점수 모두에서 약 10% 향상을 보였다. 특히 복잡한 메서드와 다중 분기를 가진 버그에서 큰 이득을 얻었으며, 이는 다양성 확보가 탐색 공간을 넓히는 데 결정적 역할을 함을 시사한다.
추가적인 Ablation Study에서는 (1) 프롬프트·온도 다양성 제거, (2) 진화 단계 제거, (3) 정체 탈출 메커니즘 비활성화 각각을 실험했을 때 성능이 현저히 떨어졌다. 특히 초기 시드 다양성을 없앨 경우 전체 향상이 6% 이하로 감소했으며, plateau 탈출을 생략하면 정체 구간에서 성능이 정체되는 현상이 관찰되었다.
이 논문은 LLM과 진화 알고리즘을 단순히 순차적으로 적용하는 것이 아니라, 시드 생성·정체 탈출·진화 전 과정에서 다양성을 전략적으로 관리함으로써 두 기술의 시너지를 극대화한다는 점에서 의미가 크다. 다만 LLM 호출 비용, 프롬프트 설계의 주관성, 그리고 특정 언어·프레임워크에 대한 일반화 가능성 등은 향후 연구가 필요한 제한점으로 남는다.
댓글 및 학술 토론
Loading comments...
의견 남기기