-
Notifications
You must be signed in to change notification settings - Fork 6
UnitCon
단위 테스트 문서를 먼저 참고하면 본 문서의 내용을 이해하는 데 많은 도움이 될 것이다.
단위 테스트를 생성하는 것은 소프트웨어 공학에서 매우 중요하지만 품이 많이 드는 일이다. 그래서 단위 테스트를 자동으로 생성하는 Randoop, EvoSuite와 같은 연구들이 많이 제안되고 활용되어 왔다. 하지만 기존의 단위 테스트 생성 연구들은 지향성 테스트를 생성하는데에는 적합하지 않다. 대부분의 단위 테스트 생성 도구들은 코드 덮이 (Coverage)를 극대화하여 프로그램의 퇴행 방지 테스트 (Regression test) 생성을 목표로 하기 때문이다. 지향성 테스트는 지속적 통합 (Continuous integration)이나 패치 검사, 오류 재현, 정적 분석 알람 검사 등 다양한 목적으로 활용될 수 있기 때문에 중요한 기술이다. 따라서 지향성 단위 테스트를 효과적으로 생성하는 시스템인 UnitCon이 제안되었다. 본 문서에서는 UnitCon이 어떻게 지향성 단위 테스트를 생성하는지를 설명하고자 한다.
자바 프로그램을 충분히 표현할 수 있는 도메인 특화 언어 (Domain-specific language)를 정의하고, 규칙에 따라 테스트를 합성한다. UnitCon의 도메인 특화 언어는 비터미널 (Non-terminal) 기호로 명령문 (Statement), 변수, 메소드, 상수 표현식을 가지며, 터미널 (Terminal) 기호로 구체적인 변수 이름, 메소드 이름, 상수 값을 가진다. UnitCon은 현재 생성하고 있는 테스트들이 원하는 조건을 만족하는지를 확인하기 위해 하향식 (Top-down)으로 테스트를 합성한다.
목표 지점에서 오류를 유발하는 테스트를 효과적으로 합성하기 위해 정적 분석 결과를 활용한다. 이때 크게 탐색 공간 가지치기 전략과 테스트 간 우선순위 부여 전략에 정적 분석 결과를 활용한다.
이 전략의 목표는 탐색 공간을 줄임으로써 목표 오류 유발 테스트를 빠르게 생성하는 것이다. 이를 위해 UnitCon은 합성 과정 중 구체적인 함수를 선택하는 시점에 생성될 테스트 간의 동일성을 평가하여 탐색 공간을 줄인다. 테스트 간의 동일성을 평가하는 기준은 다음과 같이 두 가지로 정의한다.
- 분석 결과로부터 추론해보았을 때, 두 함수가 의미적으로 동일한가?
- 이 메소드가 선택되어 테스트를 전개했을 때, 전개된 테스트는 현재 테스트와 의미적으로 동일한가?
첫 번째 기준은 서로 다른 함수이지만 함수의 요약 의미가 동일하여 실행 의미가 다르지 않을 것이라고 예상되는 경우에 해당한다. 따라서 이 경우에는 둘 중 한 가지의 테스트를 아예 탐색 공간에서 제거하여 탐색 공간을 줄인다. 두 번째 기준은 동일한 꼴의 시퀀스가 반복해서 생길 것으로 예상되는 경우에 해당한다. 따라서 이 경우에는 해당 메소드를 가지고 전개하는 테스트를 아예 탐색 공간에서 제거하여 탐색 공간을 줄인다.
이 전략의 목표는 목표한 오류를 유발할 것 같은 테스트에 우선순위를 부여함으로써 목표 오류 유발 테스트를 빠르게 생성하는 것이다. 이를 위해 UnitCon은 크게 두 가지의 기준으로 테스트 간의 우선순위를 결정한다.
- 테스트의 크기가 작은가?
- 오류 조건을 많이 만족하였는가?
첫 번째 기준은 실행 가능한 테스트를 만들기까지 걸리는 시간을 판단하기 위한 것이다. 따라서 필요한 전개 횟수가 적을수록, 즉 테스트의 크기가 작을수록 우선순위를 높인다. 두 번째 기준은 목표한 오류를 유발할 가능성이 얼마나 높은지를 판단하기 위한 것이다. 따라서 분석 결과로부터 추론한 오류 유발 조건 (Exception-triggering condition)과 도달 조건 (Path condition)을 많이 만족할수록 테스트의 우선순위를 높인다.
UnitCon은 자바 프로그램의 런타임 예외 (Runtime Exceptions)를 얼마나 효과적으로 검출할 수 있는지를 보이기 위해 다음과 같은 실험을 진행하였다.
UnitCon이 다른 단위 테스트 생성 도구들에 비해 얼마나 효과적으로 오류를 재현하는지를 비교하는 실험을 진행하였다. 198개의 목표 지점을 대상으로 각 목표 지점 별로 10분간 테스트를 생성하도록 하였고, 비교 대상으로는 EvoSuite, EvoFuzz, NPETest, Randoop, UTBot을 사용하였다. 그 결과 UnitCon은 198개 중 104개의 오류를 재현하는데 성공하였고, 타 도구들에 비해 최소 1.2배, 최대 3.6배 많은 오류를 재현하였다.
UnitCon은 널 포인터 참조 예외 (NullPointerException)를 검출하는 정적 분석기인 Infer의 Pulse 엔진을 사용하여 새로운 오류를 발견하는 실험을 진행하였다. 총 51개의 프로그램에 대해서 21개의 새로운 오류를 발견하였다.
본 문서에서는 자바 런타임 예외를 일으키는 지향성 테스트를 효과적으로 합성하는 UnitCon을 소개하였다. UnitCon은 프로그램 합성 기술을 기반으로 테스트를 생성하는 과정에서 정적 분석 결과를 활용하여 탐색 공간을 줄이고, 탐색 우선순위를 정함으로써 목표 지점에서 오류를 유발하는 테스트를 효과적으로 합성할 수 있다. 실제로 UnitCon은 기존 단위 테스트 생성 도구들과 비교하여 198개의 실제 결함을 재현하는 실험에서 최소 1.2배 많은 오류를 재현하였고, 21개의 새로운 오류를 발견할 수 있었다.