doctest-php

파이썬에는 doctest라는 모듈이 있습니다. 이게 무엇에 쓰는 물건인고 하니, 파이썬 코드 안에 있는 주석을 테스트를 하는 데에 쓰입니다. 간단한 예를 들어보겠습니다.

def factorial(n):
  """
  정수 n의 팩토리얼을 돌려줍니다.
  >>> factorial(0)
  1
  >>> factorial(5)
  120
  """
  if n == 0: return 1
  else: return n * factorial(n - 1)

import doctest; doctest.testmod()

factorial 함수의 선언 바로 다음에 나오는 주석을 docstring이라 부릅니다. 마지막 줄에서 doctest 모듈을 사용하여 현재 모듈을 테스트하도록 하면, docstring에 포함된 파이썬 코드가 실행되고 그 다음 줄에 있는 예상 실행 결과와 일치하는지 확인하여 잘못된 경우 오류를 보여줍니다.

이 테스트 방식의 이점은 새로운 API(XUnit 류의)를 익히지 않고도 손쉽게 단위 테스트를 할 수 있다는 것입니다. 문서가 곧 테스트이니, 이것은 BDD에서 말하는 ‘스펙’과도 같은 것입니다.

Ian Bicking의 글을 읽던 도중 감동(?)을 받아 PHP에서도 doctest를 할수 있게 하고 싶었습니다. (루비자바스크립트를 위한 것은 이미 있습니다.) 루비나 기타 언어에 비해 표현력이 떨어지는 PHP에서는 이런 식의 테스트가 더욱 더 강한 힘을 가질 것입니다.

그래서 연휴 마지막 날을 투자하여 PHP를 위한 doctest 라이브러리를 시험적으로 만들어 보았습니다. 이런 식으로 쓸 수 있습니다.

<?php
/**
 * 정수 $n의 팩토리얼을 돌려줍니다.
 *
 * php> factorial(0)
 * 1
 * php> factorial(5)
 * 120
 */
function factorial($n) {
	if ($n == 0) return 1;
	else return $n * factorial($n - 1);
}

require_once 'DocTest.php';
DocTest::testFile(__FILE__);
?>

간단하죠? 파이썬의 doctest와 별로 다를 것은 없습니다. 성공하면 아무런 메시지도 출력하지 않습니다. 이번에는 일부러 실패하도록 120을 720으로 바꿔 실행해봅시다.

File "example.php", line 7
Failed example:
        factorial(5)
Expected:
        720
Got:
        120

아직 간단한 기능만 지원합니다만, 추후 다음과 같은 기능을 추가할 예정입니다.

  • 콘솔이 아닌 웹 상에서의 테스트 인터페이스 제공
  • PHP 코드의 주석 외에, 일반 문서에 삽입된 코드를 테스트하는 기능
  • 자세한 출력을 제공하는 옵션
  • javadoc 스타일(/** */)이 아닌 형태의 주석 지원

서브버전 저장소에서 내려받을수 있습니다.

2 Responses to “doctest-php”

  1. 홍민희 Says:

    이것 정말 좋은 것 같아요~.

  2. Monika Says:

    http://streetball.ipbhost.com/index.php?showtopic=32360

댓글 달기