디버깅과 테스팅

박정훈·2021년 2월 5일
0

Algorithm

목록 보기
3/7

디버깅과 테스팅

디버깅에 관하여

프로그래밍 대회에서 디버거는 유용성이 제한된다.

  • 프로그래밍 대회에서 작성하는 소스 코드는 대개 길지 않기 때문에, 소스를 한 줄씩 읽어 내려가면서 검증하는 것이 가능하다. 경우에 따라 다르지만 눈으로 디버깅하는 쪽이 훨씬 빠른 경우가 꽤 많다.
  • 재귀 호출이나 중복 반복문을 많이 사용하는 복잡한 코드는 디버거로 디버깅하기에 적당하지 않다.

따라서 프로그래밍 대회를 준비하는 사람은 디버거 없이 프로그램의 버그를 찾아내는 연습을 할 필요가 있다. 물론 코드가 복잡해지면 디버거 없이 눈으로 프로그램을 검증하기 어렵긴 하지만, 이 경우에는 애초에 코드를 복잡하게 짰다는 것이 문제다. 잘 분리된 기능적인 코드는 디버거 없이 눈만으로도 검증하기 비교적 쉽다. 또한 이런 검증의 기술은 연습해 두면 버그 없는 프로그램을 짜는 데도 큰 도움이 된다.

디버거를 사용하는 대신에 다음과 같은 단계들을 밟으면 좋다.

  • 작은 입력에 대해 제대로 실행되나 확인하기
    예제 입력의 크기가 클 경우 프로그램의 실행 과정을 눈 만으로 하나하나 되짚어 가기란 어렵다. 이럴 때는 오작동하는 가장 작은 입력을 먼저 찾아내면 디버깅하기 훨씬 용이하다.

  • 단정문(assertion)을 쓴다.
    단정문이란 주어진 조건이 거짓일 때 오류를 내고 프로그램을 강제 종료시키는 함수 또는 구문을 의미한다. 주어진 조건이 참일 때는 무시되고, 거짓일 때만 오류를 내므로 프로그램의 내부 상태를 검증할 때 유용하게 쓸 수 있다. 함수에서 넘겨받은 인자들이 범위 안에 들어 있는지, 값들은 제대로 입력받았는지를 단정문으로 검사할 수 있다.

  • 프로그램의 계산 중간 결과를 출력한다.
    프로그램이 실행되는 중간 과정 값들을 출력하고 이것이 자신이 예상하는 바와 맞아 들어가는지를 검사하면 어디서 처음 문제가 생기는지 범위를 좁힐 수 있다.

만약 이런 과정을 거쳐 어디에서 문제가 일어나는지까지는 얼추 알았지만, 아무리 생각해 봐도 무엇이 틀렸는지 도저히 모르겠다면 디버거를 사용해도 좋다.
디버거를 사용해도 좋은 다른 예는 프로그램이 런타임 오류를 내고 종료하는 경우이다. 런타임 오류가 났을 때 언어에서 스택 기록을 출력해 주는 경우라면 괜찮지만, 아닌 경우 디버거를 사용해 프로그램이 어디서 왜 죽는지 간단하게 확인할 수 있기 때문에 유용하다.

테스트에 관하여

많은 경우 예제 입출력 외에도 몇 가지 간단한 입력을 직접 만들어 넣어보면 오답률을 줄일 수 있따. 주어진 예제 입력을 약간 바꿔서 넣어 보거나, 있을 수 있는 가장 작은 입력과 가장 큰 입력을 만들어서 넣어 보고 시간 안에 실행되는지, 답은 잘 나오는지 테스트해 보는 것이 좋다.

프로그램을 테스트할 때 유용하게 사용할 수 있는 기법으로 스캐폴딩이 있따. 스캐폴딩(scaffolding)이란 원래 건물을 짓거나 보수할 때 공사하는 사람들이 걸어다니기 위해 설치하는 임시 구조물을 가리키는 말이다. 프로그래밍에서는 이 말을 다른 코드를 개발할 때 뼈대를 잡기 위해 임시로 사용하는 코드라는 뜻으로 많이 사용한다.
스캐폴딩은 코드의 정당성을 확인하거나 반례를 찾는데 특히 유용하게 쓰인다. 어떤 코드를 작성해서 답안을 제출해 봣는데 오답 판정이 났다고 생각해보자. 예제 입력에 대해서는 답이 다 맞게 나오고, 소스코드를 아무리 들여다 봐도 힌트를 잡을 수 없는 경우가 있다. 이때 임의의 작은 입력을 자동으로 생성해 프로그램을 돌려 보고, 그 답안을 검증하는 프로그램을 짜면 큰 도움이 된다.

출처

  • 프로그래밍 대회에서 배우는 알고리즘 문제 해결 전략
profile
정팔입니다.

0개의 댓글