UnitTest 프레임 워크-Doctest

Python '표준 배포에는'Doctest '모듈이 포함되어 있습니다. 이 모듈의 기능을 사용하면 대화 형 Python 세션처럼 보이는 텍스트 조각을 검색하고 이러한 세션을 실행하여 표시된대로 정확하게 작동하는지 확인할 수 있습니다.

Doctest는 다음 시나리오에서 매우 유용 할 수 있습니다.

  • 모든 대화 형 예제가 문서화 된대로 작동하는지 확인하여 모듈의 독 스트링이 최신 상태인지 확인합니다.

  • 테스트 파일 또는 테스트 개체의 대화 형 예제가 예상대로 작동하는지 확인하여 회귀 테스트를 수행합니다.

  • 입력-출력 예제로 자유롭게 설명 된 패키지에 대한 자습서 문서를 작성하려면

Python에서 'docstring'은 클래스, 함수 또는 모듈에서 첫 번째 표현식으로 나타나는 문자열 리터럴입니다. 스위트가 실행될 때 무시되지만 컴파일러가 인식하고__doc__둘러싸는 클래스, 함수 또는 모듈의 속성. introspection을 통해 사용할 수 있으므로 객체 문서화를위한 표준 위치입니다.

독 스트링 안에 파이썬 코드의 다른 부분에 대한 예제 사용을 넣는 것은 일반적인 관행입니다. doctest 모듈을 사용하면 이러한 독 스트링이 코드의 간헐적 인 개정으로 최신 상태인지 확인할 수 있습니다.

다음 코드에서 팩토리얼 함수는 예제 사용과 함께 산재 해 정의됩니다. 예제 사용법이 올바른지 확인하려면 doctest 모듈에서 testmod () 함수를 호출하십시오.

"""
This is the "example" module.

The example module supplies one function, factorial(). For example,

>>> factorial(5)
120
"""

def factorial(x):
   """Return the factorial of n, an exact integer >= 0.
   >>> factorial(-1)
   Traceback (most recent call last):
      ...
   ValueError: x must be >= 0
   """
   
   if not x >= 0:
      raise ValueError("x must be >= 0")
   f = 1
   for i in range(1,x+1):
      f = f*i
   return f
   
if __name__ == "__main__":
   import doctest
   doctest.testmod()

위의 스크립트를 FactDocTest.py로 입력하고 저장하고 명령 줄에서이 스크립트를 실행 해보십시오.

Python FactDocTest.py

예제가 실패하지 않으면 출력이 표시되지 않습니다. 이제 명령 줄을 다음과 같이 변경하십시오.

Python FactDocTest.py –v

이제 콘솔에 다음과 같은 출력이 표시됩니다.

C:\Python27>python FactDocTest.py -v
Trying:
   factorial(5)
Expecting:
   120
ok
Trying:
   factorial(-1)
Expecting:
   Traceback (most recent call last):
      ...
   ValueError: x must be >= 0
ok
2 items passed all tests:
   1 tests in __main__
   1 tests in __main__.factorial
2 tests in 2 items.
2 passed and 0 failed.
Test passed.

반면, factorial () 함수의 코드가 docstring에 예상 결과를 제공하지 않으면 실패 결과가 표시됩니다. 예를 들어, 위 스크립트에서 f = 1 대신 f = 2를 변경하고 doctest를 다시 실행하십시오. 결과는 다음과 같습니다.

Trying:
   factorial(5)
Expecting:
   120
**********************************************************************
File "docfacttest.py", line 6, in __main__
Failed example:
factorial(5)
Expected:
   120
Got:
   240
Trying:
   factorial(-1)
Expecting:
   Traceback (most recent call last):
      ...
   ValueError: x must be >= 0
ok
1 items passed all tests:
   1 tests in __main__.factorial
**********************************************************************
1 items had failures:
   1 of 1 in __main__
2 tests in 2 items.
1 passed and 1 failed.
***Test Failed*** 1 failures.

Doctest : 텍스트 파일에서 예제 확인

doctest의 또 다른 간단한 응용 프로그램은 텍스트 파일에서 대화 형 예제를 테스트하는 것입니다. 이것은 testfile () 함수로 수행 할 수 있습니다.

다음 텍스트는 'example.txt'라는 텍스트 파일에 저장됩니다.

Using ''factorial''
-------------------
This is an example text file in reStructuredText format. First import
''factorial'' from the ''example'' module:
   >>> from example import factorial
Now use it:
   >>> factorial(5)
   120

파일 내용은 독 스트링으로 처리됩니다. 텍스트 파일의 예제를 확인하려면 doctest 모듈의 testfile () 함수를 사용하십시오.

def factorial(x):
   if not x >= 0:
      raise ValueError("x must be >= 0")
   f = 1
   for i in range(1,x+1):
      f = f*i
   return f
   
if __name__ == "__main__":
   import doctest
   doctest.testfile("example.txt")
  • testmod ()와 마찬가지로 testfile ()은 예제가 실패하지 않는 한 아무것도 표시하지 않습니다. 예제가 실패하면 실패한 예제와 실패의 원인이 testmod ()와 동일한 형식을 사용하여 콘솔에 인쇄됩니다.

  • 대부분의 경우 대화 형 콘솔 세션의 복사 및 붙여 넣기는 잘 작동하지만 doctest는 특정 Python 셸의 정확한 에뮬레이션을 수행하지 않습니다.

  • 예상되는 모든 출력은 코드를 포함하는 마지막 '>>>'또는 '...'줄 바로 뒤에 와야하며 예상 출력 (있는 경우)은 다음 '>>>'또는 모두 공백 줄로 확장됩니다.

  • 예상 출력은 모든 공백 줄을 포함 할 수 없습니다. 이러한 줄은 예상 출력의 끝을 알리는 데 사용되기 때문입니다. 예상되는 출력에 빈 줄이 포함 된 경우 doctest 예제에 <BLANKLINE>을 입력하면 빈 줄이 예상됩니다.