파이썬 표준 배포판에는 doctest 모듈이 기본으로 포함되어 있습니다. 이 모듈은 대화형 파이썬 세션처럼 보이는 텍스트 조각을 찾아낸 뒤, 해당 세션을 실제로 실행하여 표시된 결과와 정확히 일치하는지 확인하는 기능을 제공합니다. 이러한 예제는 클래스, 모듈 또는 함수의 독스트링(docstring)에서 추출되며, 별도의 텍스트 파일에서 실행할 수도 있습니다.
파이썬에서 '독스트링(docstring)'은 클래스, 함수 또는 모듈의 첫 번째 표현식으로 나타나는 문자열 리터럴입니다. 코드가 실행될 때는 무시되지만, 컴파일러가 이를 인식하여 해당 클래스, 함수 또는 모듈의 __doc__ 속성에 저장합니다.
독스트링은 일반적으로 파이썬 코드의 각 부분에 대한 사용 예제를 설명하는 데 활용됩니다. doctest 모듈을 사용하면 코드가 수정될 때마다 이러한 독스트링의 예제가 여전히 유효한지 자동으로 검증할 수 있습니다.
다음 코드에서는 add 함수를 정의하면서 사용 예제를 함께 작성했습니다. 예제가 올바른지 확인하려면 doctest 모듈의 testmod() 함수를 호출하면 됩니다.
def add(a,b):
'''
>>> add(10,20)
30
>>> add('aaa','bbb')
'aaabbb'
>>> add('aaa',20)
Traceback (most recent call last):
...
TypeError: must be str, not int
'''
return a+b먼저 위 스크립트를 mytest.py라는 이름으로 저장한 뒤, 명령줄에서 실행해 봅니다.
python mytest.py
예제가 실패하지 않는 한 아무런 출력도 표시되지 않습니다. 이번에는 다음과 같이 명령어를 변경해 보겠습니다.
python mytest.py -v
그러면 콘솔에 다음과 같은 상세 결과가 출력됩니다.
F:\Python36>python mytest.py -v
Trying:
add(10,20)
Expecting:
30
ok
Trying:
add('aaa','bbb')
Expecting:
'aaabbb'
ok
Trying:
add('aaa',20)
Expecting:
Traceback (most recent call last):
...
TypeError: must be str, not int
ok
1 items had no tests:
__main__
1 items passed all tests:
3 tests in __main__.add
3 tests in 2 items.
3 passed and 0 failed.
Test passed.텍스트 파일의 예제 검사하기
doctest의 또 다른 간단한 활용법은 텍스트 파일 안에 있는 대화형 예제를 테스트하는 것입니다. 이때는 testfile() 함수를 사용합니다.
다음 내용이 example.txt라는 텍스트 파일에 저장되어 있다고 가정해 보겠습니다.
'add' 사용하기 ------------------- 예제 텍스트 파일입니다. 먼저 'mytest' 모듈에서 'add'를 임포트합니다: >>> from mytest import add >>> add(10,20) 30
텍스트 파일의 내용은 하나의 독스트링처럼 취급됩니다. 파일 속 예제를 검증하려면 doctest 모듈의 testfile() 함수를 사용합니다.
def add(a,b):
return a+b
if __name__ == "__main__":
import doctest
doctest.testfile("example.txt")testmod()와 마찬가지로 testfile()도 예제가 실패하지 않으면 아무것도 출력하지 않습니다. 만약 예제가 실패하면, 실패한 예제와 그 원인이 testmod()와 동일한 형식으로 콘솔에 출력됩니다.
대부분의 경우 대화형 콘솔 세션을 그대로 복사해서 붙여넣어도 잘 동작하지만, doctest는 특정 파이썬 셸을 정확하게 흉내 내려는 목적이 아닙니다.
기대 출력(expected output)은 반드시 코드가 포함된 마지막 '>>>' 또는 '...' 줄 바로 다음에 위치해야 하며, 기대 출력은 다음 '>>>' 줄 또는 공백만 있는 줄까지 이어집니다.
기대 출력에는 공백만 있는 줄을 포함할 수 없습니다. 그러한 줄은 기대 출력의 끝을 알리는 신호로 해석되기 때문입니다. 만약 기대 출력에 빈 줄이 필요하다면, doctest 예제에서 빈 줄이 나오는 자리마다 <BLANKLINE>을 넣어야 합니다.
이 글에서는 doctest 모듈의 핵심 함수인 testmod()와 testfile()의 사용 방법을 살펴보았습니다. 독스트링에 사용 예제를 함께 관리하면 문서화와 테스트를 동시에 해결할 수 있어, 코드 변경 시에도 예제의 신뢰성을 손쉽게 유지할 수 있습니다.