Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python doctest 모듈 활용법: docstring으로 간편하게 함수 테스트하기

파이썬에서 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만으로 테스트 케이스를 작성할 수 있어, 별도의 테스트 파일 없이도 함수의 정확성을 손쉽게 검증할 수 있는 강력한 도구입니다. 문서와 테스트가 하나로 결합되어 있어 코드의 신뢰성을 높이고 유지보수에도 큰 도움이 됩니다. 튜토리얼에 대해 궁금한 점이 있다면 댓글로 남겨 주세요.