파이썬에서 docstring(문서화 문자열)은 함수와 클래스에 대한 추가 정보를 제공하는 역할을 합니다. 그런데 이 docstring을 단순한 문서화 도구를 넘어 doctest 모듈과 함께 활용하면 함수를 직접 테스트할 수도 있습니다. doctest 모듈은 코드에서 >>>로 시작하는 대화형 셸 명령을 실행하고, 그 결과가 기대했던 출력값과 일치하는지 자동으로 비교해 줍니다.
doctest 작성 방법
doctest를 사용해 함수를 테스트하려면 다음 단계를 따르면 됩니다.
- doctest 모듈을 임포트합니다.
- 테스트할 함수를 작성하면서 docstring 안에 다음 두 줄을 포함시킵니다.
- >>> 함수명(*인자) 형태의 함수 호출 명령
- 기대 출력값(expected output)
- 함수의 실제 구현 코드를 작성합니다.
- 마지막으로
doctest.testmod(name=함수명, verbose=True)를 호출해 테스트를 실행합니다. verbose를 False로 설정하면 모든 테스트가 통과했을 때 결과가 화면에 표시되지 않으므로, True로 설정하는 것이 좋습니다.
예제 1: 테스트 통과하기
간단한 함수에 doctest를 적용해 보겠습니다.
# importing the module
import doctest
# function
def numbers_sum(*args) -> int:
"""
This function returns the sum of all the arguments
Shell commands for testing
invoking the function followed by expected output:
>>> numbers_sum(1, 2, 3, 4, 5)
15
>>> numbers_sum(6, 7, 8)
21
"""
return sum(args)
# invoking the testmod function
doctest.testmod(name='numbers_sum', verbose=True)
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
Trying: numbers_sum(1, 2, 3, 4, 5) Expecting: 15 ok Trying: numbers_sum(6, 7, 8) Expecting: 21 ok 1 items had no tests: numbers_sum 1 items passed all tests: 2 tests in numbers_sum.numbers_sum 2 tests in 2 items. 2 passed and 0 failed. Test passed. TestResults(failed=0, attempted=2)
출력 결과를 보면 각 테스트 뒤에 ok라는 단어가 표시됩니다. 이는 기대 출력값과 실제 출력값이 일치했다는 의미이며, 전체 테스트 결과는 출력 맨 아래에서 확인할 수 있습니다.
예제 2: 테스트 실패 시 동작 확인
이번에는 테스트가 실패하면 어떻게 되는지 살펴보겠습니다. 같은 예제에서 기대 출력값을 일부러 잘못 입력한 후 실행해 봅니다.
# importing the module
import doctest
# function
def numbers_sum(*args) -> int:
"""
This function returns the sum of all the arguments
Shell commands for testing
invoking the function followed by expected output:
>>> numbers_sum(1, 2, 3, 4, 5)
10
>>> numbers_sum(6, 7, 8)
23
"""
return sum(args)
# invoking the testmod function
doctest.testmod(name='numbers_sum', verbose=True)
실행 결과
Trying:
numbers_sum(1, 2, 3, 4, 5)
Expecting:
10
**********************************************************************
File "__main__", line 10, in numbers_sum.numbers_sum
Failed example:
numbers_sum(1, 2, 3, 4, 5)
Expected:
10
Got:
15
Trying:
numbers_sum(6, 7, 8)
Expecting:
23
**********************************************************************
File "__main__", line 12, in numbers_sum.numbers_sum
Failed example:
numbers_sum(6, 7, 8)
Expected:
23
Got:
21
1 items had no tests:
numbers_sum
**********************************************************************
1 items had failures:
2 of 2 in numbers_sum.numbers_sum
2 tests in 2 items.
0 passed and 2 failed.
***Test Failed*** 2 failures.
TestResults(failed=2, attempted=2)
테스트 결과를 보면 2개의 테스트가 모두 실패했습니다. 실패한 항목에서는 Expected(기대값)와 Got(실제값)이 함께 출력되기 때문에 어느 부분에서 차이가 발생했는지 한눈에 파악할 수 있습니다.
정리
doctest는 docstring만으로 테스트 케이스를 작성할 수 있어, 별도의 테스트 파일 없이도 함수의 정확성을 손쉽게 검증할 수 있는 강력한 도구입니다. 문서와 테스트가 하나로 결합되어 있어 코드의 신뢰성을 높이고 유지보수에도 큰 도움이 됩니다. 튜토리얼에 대해 궁금한 점이 있다면 댓글로 남겨 주세요.