Skip to main content

Concolic Testing기법을 활용한 프로그래밍 실습 문항의 채점 개선에 관한 연구

· 4 min read
서강복
이성희
이우진
담당교수

논문 정보

  • 제목: A Study on the Improvement of Scoring in Programming Practice Questions Using Concolic Testing Technique
  • 저자: 서강복, 이성희, 이우진 (경북대학교 IT대학 컴퓨터학부, 소프트웨어기술연구소)
  • 학회/저널: 2018년 한국소프트웨어종합학술대회 논문집 (KSC 2018)
  • 발행일: 2018-06-01
  • 주요 연구 내용: 프로그래밍 실습 교육의 자동 채점 시스템에서 강사가 수동으로 작성하는 테스트 케이스의 불완전성을 해결하기 위해, 학생들의 소스코드에 Concolic Testing 기법을 적용하여 새로운 테스트 케이스를 생성하고 보완하는 도구를 제안함.
  • 주요 결과 및 결론: 제안된 도구를 통해 기존 테스트 케이스가 통과시켰던 학생 코드의 논리적 오류(경계값, 예외 처리 미흡 등)를 찾아내는 새로운 입력값을 생성하였으며, 이를 통해 채점의 정확도를 높일 수 있음을 확인함.
  • 기여점: 학생들의 코드 특성(작은 규모)을 활용하여 Concolic Testing의 비용 문제를 우회하고, 실제 수업 데이터를 기반으로 채점 시스템의 신뢰성을 높이는 구체적인 사례와 도구 구조를 제시함.

요약

초록

최근 프로그래밍 교육의 확산으로 자동 채점 시스템이 널리 사용되고 있으나, 채점에 필수적인 테스트 케이스 작성은 여전히 강사의 몫으로 남아있다. 학생들은 종종 주어진 테스트 케이스에만 통과하도록 코드를 작성하며, 강사가 작성한 테스트 케이스가 모든 상황을 커버하지 못하거나 잘못 작성될 경우 부정확한 채점이 발생한다. 본 논문은 학생이 제출한 소스코드에 Concolic Testing 기법을 적용하여 기존 테스트 케이스를 보완하는 도구를 제안하고, 실제 잘못된 채점 사례를 개선한 결과를 보인다.

서론

프로그래밍 교육에서 자동 채점 시스템은 강사의 부담을 줄여주지만, 실습 문제와 채점용 테스트 케이스 작성은 여전히 수동으로 이루어진다. 특히 초보자인 학생들은 프로그래밍 언어에 대한 이해 부족으로 테스트 케이스만을 만족시키는 코드를 작성하는 경향이 있다. 강사가 작성한 테스트 케이스가 불충분할 경우, 오류가 있는 코드가 정답으로 처리되는 문제가 발생한다. 이를 해결하기 위해 화이트 박스 테스트 기법인 Concolic Testing을 활용하여 테스트 케이스를 자동으로 확장하고 보완하는 방법이 필요하다.

배경

Concolic Testing Concolic Testing은 심볼릭 실행(Symbolic Execution)과 구체적 실행(Concrete Execution)을 결합하여 프로그램의 모든 분기(Branch)를 탐색하는 테스트 기법이다. 대규모 소프트웨어에서는 경로 폭발(Path Explosion) 문제로 적용이 어렵지만, 프로그래밍 실습에서 학생들이 작성하는 코드는 규모가 작아 자원 제약 없이 적용 가능하다. 본 연구에서는 CREST 도구를 활용한다. Figure 1

모델 아키텍처 / 방법론

본 논문은 실습 채점 개선을 위한 '테스트 케이스 보완 도구(Test Case Supplementary Tool)'를 제안한다. 전체 구조는 논문의 Figure 1에 제시되어 있다.

  • 핵심 구조: 학생 코드(Student Code)와 정답 코드(Correct Code)를 모두 활용하는 구조이다.
  • 프로세스:
    1. 전처리 및 실행: 학생이 제출한 코드를 Concolic Testing이 가능한 형태로 전처리하고 CREST 도구를 통해 실행한다.
    2. 테스트 입력 생성: Concolic Testing 도구가 학생 코드의 모든 분기를 탐색하기 위한 테스트 입력(Input)을 생성한다.
    3. 중복 제거(Duplicate Checker): 기존에 존재하던 테스트 입력과 중복되는 값은 제거한다.
    4. 기대값 생성(Test Case Generator): 새로 생성된 입력값을 강사가 작성한 정답 코드(Correct Code)에 입력하여 올바른 출력값(Expected Value)을 얻는다.
    5. 테스트 케이스 보완: 생성된 입력값과 기대값을 결합하여 새로운 테스트 케이스를 생성하고 채점 시스템에 추가한다. Figure 2

실험 결과

논문에서는 2018학년도 1학기 기초 프로그래밍 수업 데이터를 바탕으로 개선 사례를 분석하였다.

  • 사례 1 (범위 지정 오류):

    • 학생 코드가 특정 범위(4000 초과 등)의 조건문을 잘못 작성했으나, 기존 테스트 케이스에는 해당 경계값(4000)이 없어 통과됨.
    • 제안 도구가 입력값 '4000'을 생성하여 학생 코드의 오류(case #4 출력)와 정답 코드(case #3 출력)의 차이를 발견함 (Figure 2 참조).
  • 사례 2 (이차 방정식 근 구하기):

    • ax2+bx+cax^2+bx+c의 근을 구하는 문제에서 학생 코드가 특정 조건에서 잘못된 출력('0')을 내보냄.
    • 기존 테스트 케이스는 이를 발견하지 못했으나, 도구가 a=1,b=1,c=0a=-1, b=-1, c=0 입력을 생성하여 x=1,x=0x=1, x=0 대신 x=1,x=0x=-1, x=-0과 같은 형태의 논리적 오류를 검출함.
  • 종합 결과:

    • 한 학기 동안 4가지 실습 문제에 대해 테스트 케이스를 보완함.
    • 주로 경계값(Boundary Value) 확인 및 예외 처리(Exception Handling)와 관련된 테스트 케이스가 추가되었으며, 이를 통해 학생들의 문법 이해 부족이나 예외 처리 미숙으로 인한 오류를 효과적으로 찾아냄.

결론

본 연구는 자동 채점 시스템에서 강사가 작성한 테스트 케이스의 한계를 Concolic Testing 기법으로 극복하는 방법을 제시하였다. 제안된 도구는 학생 코드의 분기를 탐색하여 기존 테스트 케이스가 놓친 오류를 발견할 수 있는 입력을 자동으로 생성하였다. 이는 채점의 공정성과 정확도를 높이는 데 기여한다. 향후 연구로는 채점에 필요한 모든 테스트 케이스를 처음부터 자동으로 생성하는 기법에 대해 연구할 계획이다.