동적 심볼릭 테스트 기법은 소스 코드를 기반으로 하는 테스트 케이스를 선정하여 프로그램 내에 존재하는 버그를 찾아내는 데 목적이 있다. 심볼릭 테스트는 콘콜릭 테스트라고도 하는데 Concolic
은 전통적 실행(concrete execution) 기반 테스트와 기호 실행(symbolic execution) 기반 테스트를 혼합한 기법이다.
입력값을 대신하여 기호(미지수)를 사용한다.
이 방식을 적용하면 특정 문장을 만족하는 입력값을 쉽게 알 수 있다.
int foo(int x) {
if (x > 10) {
return 1;
} else {
return 0;
}
}
x
를 실제 값이 아닌 기호 X로 둔다.X > 10
이라는 제약식으로 기록된다.x = 11
)을 찾아낸다.SMT는 어떤 제약 사항이 주어졌을 때 모든 가능한 조합을 고려하여 만족할 만한 해를 결정해주는 기능이다.
콘콜릭 테스트를 수행하려면 SMT이 필요하다.
코드의 특정 지점에 있는 실제 값을 저장하는 변수
코드의 특정 지점에 있는 심볼 값을 저장하는 함수
특정 지점에서 만족되어야 하는 분기 조건을 저장하는 변수
int test(int a, int b) {
if (a > 5) {
if (b == a) {
return 1;
}
}
return 0;
}
(a=3, b=2)
a > 5
→ 거짓 → return 0
[a ≤ 5]
a > 5
→ 예: (a=6, b=2)
(a=6, b=2)
a > 5
→ 참, b == a
→ 거짓 → return 0
[a > 5, b ≠ a]
b == a
→ 예: (a=6, b=6)
return 1
을 탐지✅ 결과적으로, 모든 분기 조건을 만족하는 입력 세트가 자동으로 생성되어 테스트 커버리지가 높아진다.