유신의 "내일의 소프트웨어"

소프트웨어는 피시(PC) 밖에 더 많다. 스마트폰에서, 연구실 시뮬레이션에서, 위험관리 시스템에서…, 소프트웨어가 사회를 움직인다. 그러나 정작 우리는 소프트웨어에 관해 얼마나 많은 이야기를 알고 있을까?

검증불가능 프로그램, 어떻게 검증할 것인가?

[6] ‘고차변형 테스팅’ 방법


00testing0.jpg » 출처 / Argonne Leadership Computing Facility, Flickr. http://www.flickr.com/photos/argonne/8021025303/

3차원으로 초신성의 핵을 시각화하는 컴퓨터 시뮬레이션. 이제는 천체물리학은 물론 과학 여러 분야의 연구 상당 부분이 컴퓨터 내부에서 벌어진다. 그런데 이 시뮬레이션 프로그램에는 과연 오류가 없을까? 초신성의 내부가 정확히 어떻게 생겼는지는 아무도 모른다. 그렇다면 시뮬레이션 오류는 어떻게 잡아내야 할까?




로그래밍을 처음 배울 때 누구나 작성해보는 간단한 예제 중에 구구단 프로그램이 있습니다. 열 줄 남짓의 코드를 작성하면 쉽게 만들 수 있는 프로그램입니다. 자신의 구구단 프로그램이 맞게 작성됐는지 확인하는 방법은 무엇일까요? 화면에 출력된 구구단 표를 자기가 외우고 있는 구구단과 비교하면 됩니다. 너무 간단한 이야기라서 의아해할 지 모르겠지만, 누구나 암기하고 있는 머릿속의 구구단 표가 바로 일전에 언급했던 ‘테스트 오라클’입니다. 4 곱하기 7은 28임을 누구나 알고 있는데, 프로그램이 4 곱하기 7이 32라고 출력한다면 프로그램에 오류가 있음을 쉽게 알 수 있습니다.


테스트 오라클은 테스팅을 위해 프로그램을 실행했을 때, 주어진 입력값(‘4 곱하기 7’)에 대응하는 출력이 옳은지(‘28’) 결정할 수 있게 해줍니다. 구구단 프로그램의 경우에 테스트 오라클이 무엇인지는 분명합니다 (아직 구구단을 외우지 못한 어린이가 프로그래밍을 하고 있는 경우를 제외하고는 말이죠). 그런데 테스트 오라클 자체가 존재할 수 없는 프로그램이 있습니다. 이유가 뭘까요?



테스트 불가능 프로그램

00dot.jpg

이른바 테스트 불가능 프로그램(Untestable Program)은 쉽게 말해, 작성한 프로그램을 이용해서 계산하려는 정확한 결과값을 애초에 아무도 모르고 또한 결과를 사람이 검산하는 것도 매우 어려운 경우를 말합니다. 언뜻 말이 안 되는 것 같지만 이런 경우는 생각보다 흔히 존재합니다.


예를 들어 숫자 두세 개의 합을 구하는 프로그램이라면, 입력값이 좀 크더라도 사람이 그 결과를 손으로 계산해서 검산을 할 수 있습니다. 그런데 숫자 천만 개의 합을 구하는 프로그램이라면 어떨까요?


다루는 숫자의 값이 너무 커지면 프로그램도 오류를 범할 수 있습니다 (컴퓨터가 숫자를 어떻게 표현하는지에 대한 이야기도 나중에 다룰 기회가 있을 겁니다). 그런데 합산 오류가 있는지 없는지 확인하기 위해 천만 개를 사람이 더해 볼 수 있을까요? 불가능하지는 않지만 아마 누구도 반기지 않는 지루한 작업이 될 것입니다. 게다가 검산 중에 사람이 실수를 하지 않는다는 보장도 또한 없습니다.


숫자 천만 개의 합을 검산하는 것보다 훨씬 더 어려운 검산도 있습니다. 프로그래밍 언어들 중 상당수는 수학 함수들을 제공합니다. 그런데 예를 들어 삼각함수 sin의 값을 소숫점 아래 1000자리까지 정확하게 계산해준다는 프로그래밍 언어가 있다고 합시다. 그 결과를 어떻게 신뢰할 수 있을까요? 대부분의 사람들은, 수학 교육을 얼마나 받았는지와 관계 없이, 삼각함수의 값은 도표를 참조하거나 계산기를 이용해서 구합니다. 애초에 사람이 일일히 하기엔 귀찮은 일이기 때문이죠. 소숫점 아래 1000자리까지 계산된 도표나 계산기가 없을 경우, sin 함수를 계산하는 프로그램이 제대로 작성되었는지 검토할 방법이 없습니다.



‘테스트 불가능’에 대한 테스팅은?

00dot.jpg

여기까지 이야기하고 보니 사태가 생각보다 심각해 보입니다. 삼각함수는 고사하고 심지어 숫자 천만 개 정도를 더하는 것 조차 컴퓨터에게 믿고 맡길 수 없다면 큰 일 아닙니까? 테스트 불가능 프로그램은 보통 매우 복잡한 계산을 해내는 프로그램들인데, 과착의 여러 분야가 점차 컴퓨터를 통한 계산과 시뮬레이션에 의존하고 있는 양상을 생각해보면 계산이 복잡할수록 테스트가 불가능해 진다는 것은 심각한 문제입니다.


위에 언급한 프로그램들을 어떻게 해서든 테스트하고 싶다면 어떤 방법이 있을까요? 가장 먼저 드는 생각은, 천만 개를 더하는 게 어렵다면 100개 정도만 더해보고, 임의의 x에 대해 sin(x)를 구하는 것이 너무 어렵다면 쉬운 결과값이 알려진 sin(0)이나 sin(π/2)만 테스트하면 어떨까 하는 것입니다. 하지만 문제는 특정 종류의 오류가 100개의 숫자가 아니라 만 개 이상을 더할 때에만, 또는 sin(0)이 아니라 sin(1.23082348)를 계산할 때에만 발견될 수도 있다는 점입니다. 다시 말해서 쉬운 값만 테스트해서는 오류를 찾을 수 없다는 뜻입니다.


테스트 불가능 프로그램의 문제를 완벽하게 해결하는 것은 불가능한 일입니다. 숫자 천만 개의 합처럼 단순히 검산이 어려운 경우라면 비용을 많이 들여 해결할 수 있는 일이겠으나(암산의 천재를 여러 명 고용해서 서로 독립적으로 두 번, 세 번 계산한 다음 결과를 비교해봐야 할 것입니다), 임의의 x에 대한 삼각함수 sin(x)의 값은 유리수가 아닐 수 있기 때문에 소숫점 아래 부분이 무한히 계속되고, 따라서 애초에 정확한 값이 존재하지 않습니다. 이런 문제들을 해결하기 위해 비교적 최근에 제시된 테스트 기법이 바로 ‘고차변형 테스팅(Metamorphic Testing)’입니다.


고차변형 테스팅은 종종 주어진 문제 내부에 존재하는 수학적인 특성에 주목합니다. 숫자 천만 개의 합은 각각의 숫자를 더하는 순서에 관계 없이 일정해야 합니다 (수학적인 용어를 잠깐 빌리자면 덧셈은 “교환 가능”하기 때문입니다. 다시 말해 x + y와 y + x는 언제나 같은 결과를 가지기 때문입니다). 이를 이용해서 합산 프로그램을 테스트 하는 방법은 다음과 같습니다. 먼저 천만 개의 숫자 각각에 일련번호를 부여한 다음, 일련번호 1부터 1천만까지 차례로 입력해서 그 합을 구합니다. 일련번호를 따른 첫 번째 입력을 I, 그 결과를 O라고 합시다. 다음으로는 일련번호의 순서를 바꿔서 입력합니다. 1천만부터 1까지로 거꾸로 해도 좋고, 무작위로 흐트려도 좋습니다. 순서를 흐트러뜨린 입력값이 I', 이렇게 해서 구한 두 번째 결과를 O'라고 합시다. 만약 합산 프로그램이 정확하게 동작한다면 O와 O'의 값은 같아야 합니다. O와 O'의 값이 서로 다르다면? 합산 프로그램에 오류가 있다는 점이 분명해집니다.


첫 번째 입력(일련번호 1에서 1천만까지 순서대로 입력한 것)과 두 번째 입력(무작위 혹은 역순의 입력) 사이의 관계를 고차변형 관계라고 합니다. 고차변형 관계를 이용하면 완벽한 테스트 오라클 대신에 부분적인 오라클을 만들 수 있습니다. 그 방법은 다음과 같습니다. 입력값과 출력값 사이에 존재하는 특수한 고차적 관계를 이용해서, 이미 실행해 본 입력값 I와 그로부터 관찰된 출력값 O를 새로운 입력값 I'와 그로부터 예측 가능한 출력값 O'로 변형하는 것입니다. 임의의 입력값에 대해 출력값이 맞는지 틀린지 말해줄 수 없으므로 완벽한 오라클은 아니지만, 적어도 I'에 대해서는 그 출력값이 맞는지 틀린지 알 수 있으므로 부분적인 오라클인 것이지요. 앞서의 예에서 두 가지의 입력 I와 I' 사이에 존재하는 고차적 관계는 순서만 흐트러뜨렸다는 것이며, 덧셈의 교환법칙에 의해 출력 O와 O' 사이에는 등가관계가 성립해야 한다는 것을 알고 이용할 수 있었습니다.


00testing1.jpg » 그림1. 이제, 수학에 자신 있는 분들은 조금 더 나아가 볼까요? 앞서 이야기한 삼각함수의 경우는 어떨까요? 중고등학교 시절의 수학 지식을 떠올리면서 sin(x)를 테스트할 수 있는 고차변형 관계는 무엇일지 잠깐 (다음 문단을 바로 읽지 말고 잠시 멈추어서) 생각해 봅시다.

 .

 .

   .

 .

정답은 바로 sin 함수가 [0, π] 구간에서 좌우대칭, 따라서 sin(x) = sin(π - x)라는 점입니다 (그림 1). 예를 들어 sin 함수를 계산하는 프로그램에 그림 2와 같은 오류가 있다면 sin(x)와 sin(π - x)의 값이 같은지 확인함으로써 발견할 수 있습니다.



계속되는 물음: 테스팅에 한계는 없는가

00dot.jpg

고차변형 테스팅은 테스트 불가능 프로그램에 대처하는 유용한 도구이지만, 연구자들은 크게 두 가지 문제와 씨름하고 있습니다.


첫째는 과연 고차변형 관계를 이용해서 밝힐 수 있는 오류의 종류에 어떤 제한이 있는가 하는 점입니다. 앞의 글에서 이야기했듯이 소프트웨어 테스팅은 오류의 존재를 밝힐 수는 있지만 무오류를 보일 수는 없습니다. 그림 2와 같이 고차변형 테스팅을 이용해 오류를 발견할 수도 있는 반면, 고차변형 테스팅을 통과한다고 해서 오류가 없는 것은 절대 아닙니다. 일례로 그림 3의 경우, 분명 잘못된 sin 함수 프로그램이지만 sin(x)과 sin(π - x)의 값이 같아야 한다는 고차변형 테스트를 가볍게 통과합니다.

00testing4.jpg

둘째는 주어진 임의의 프로그램에 대해 고차변형 관계가 존재하기는 하는지, 존재한다면 정확히 어떤 관계인지 밝히는 문제입니다. 아무 프로그램이나 고차변형 관계로 테스트할 수 있는지는 아직 알려져 있지 않습니다. 복잡한 과학적 계산을 정확하게 수행할 수 있도록 하기 위해 소프트웨어 오류를 줄이려는 노력은 현재 진행형입니다.

  • 구글
  • 카카오
  • 싸이월드 공감
  • 인쇄
  • 메일
유신 카이스트 교수, 전산학
소프트웨어 테스팅 연구로 박사학위를 받은 소프트웨어공학 연구자다. 진화 알고리즘과 인공지능 기술, 정보이론 등을 소프트웨어 공학 문제에 접목하는 데에 관심이 많다. 전 영국 런던 유니버시티칼리지 조교수, 현 카이스트 전산학부 조교수
이메일 : shin.yoo@kaist.ac.kr       트위터 : @ntrolls      
블로그 : londonforgeeks.tumblr.com

최신글




최근기사 목록

  • “오류 존재를 보여도 오류 없음을 보일 순 없다”“오류 존재를 보여도 오류 없음을 보일 순 없다”

    내일의 소프트웨어유신 | 2013. 05. 24

    [5] 소프트웨어 테스팅과 ‘부족한 근사값’ 잠깐, 자신이 프로그래머라고 상상해 봅시다. 방금 회사의 다음 프로젝트 중 일부로 사용할 중요한 프로그램 하나를 작성했습니다. 상사에게 이 프로그램을 넘기기 전에 자신이 작성한 프로그램이 ‘제대로...

  • 강한 인공지능, 약한 인공지능강한 인공지능, 약한 인공지능

    내일의 소프트웨어유신 | 2012. 08. 14

    (4) 인공지능이란 대체 뭔가? 얼마 전 개봉한 영화 <프로메테우스(Prometheus)>에서 외계 생명체만큼이나 사람들의 관심을 끈 것은 인공지능 로봇 데이빗이었습니다. 뛰어난 계산 능력과 무한에 가까운 기억력을 지녔지만 감정을 느끼지 못하기 때...

  • [연재] 해도 해도 끝이 없는 계산[연재] 해도 해도 끝이 없는 계산

    내일의 소프트웨어유신 | 2012. 06. 19

    (3) 소프트웨어가 도무지 해결하지 못하는 세 가지: 두 번째, P=NP? 조금 있으면 여름 휴가철이 다가옵니다. 그런데 산으로 혹은 바다로 떠나는 사람이라면 누구나 여행 전 날 자기도 모르는 사이에 매우 복잡한 수학 문제를 풀고 있다고 하면 ...

  • [연재] 완벽한 백신SW 불가능한 이유, 튜링은 알고 있다[연재] 완벽한 백신SW 불가능한 이유, 튜링은 알고 있다

    내일의 소프트웨어유신 | 2012. 05. 22

    (2) 소프트웨어가 도무지 해결하지 못하는 세 가지: 첫 번째 '종료 문제' 지난해 과학계를 뜨겁게 달군 과학 뉴스 중 하나는 바로 중성미자 입자의 속력이 빛보다 더 빠르다는 어느 관측실험 결과였습니다. 이에 많은 사람들이 놀라움과 의구심을 나...

  • [새연재] PC 파란화면에 무오류 수학의 이상은 흩어지고[새연재] PC 파란화면에 무오류 수학의 이상은 흩어지고

    내일의 소프트웨어유신 | 2012. 04. 17

    (1) 연재를 시작하며 소프트웨어공학(Software Engineering)이라는 이름을 들으면 무엇이 연상되나요? 아마 대부분의 사람들이 “정보기술(IT) 강국” 혹은 “정보화시대” 등을 떠올리리라 생각합니다. 혹 주변에 IT업계에 종사하는 지인이 있는 경우...