파이썬-doctest와 unittest [닫기]


160

파이썬에서 단위 테스트를 시작하려고하는데 누군가가 doctest 및 unittest의 장단점을 설명 할 수 있는지 궁금합니다.

어떤 조건을 사용 하시겠습니까?

답변:


177

둘 다 귀중합니다. 나는 doctest와 를 모두 unittest 대신 사용합니다 . 테스트에서 실제로 문서로 유용한 사용법의 예를 제공하는 경우 doctest를 사용합니다. 일반적으로 나는 정보 제공만을 목적으로 이러한 테스트를 포괄적으로 만들지 않습니다. doctest를 반대로 사용하는 것이 효과적입니다. 내 doctest를 기반으로 코드를 테스트하는 것이 아니라 코드를 기반으로 문서가 올바른지 확인하는 것입니다.

그 이유는 포괄적 인 doctest가 문서를 너무 복잡하게 만들 수 없기 때문에 사용할 수없는 docstring 또는 불완전한 테스트로 끝날 수 있기 때문입니다.

실제로 코드를 테스트하려면 목표는 예제로 수행하는 작업을 설명하기보다는 모든 사례를 철저히 테스트하는 것입니다. 이는 다른 프레임 워크에서 더 잘 충족되는 다른 목표입니다.


29
상용구가 훨씬 적으며 테스트를 작성하고 읽는 것이 훨씬 간단합니다. 테스트를 작성하는 낮은 시작 비용 (예 : "test_foo ()"함수를 작성하고 이동)은 테스트를 중단하기 전에 흥미로운 코드 비트를 수행하려는 유혹에 맞서 싸우는 데 도움이됩니다.
Brian

6
나는 이것이 환상적인 답변이라고 생각합니다.
제임스 브래디

다른 테스트 프레임 워크를 사용하십니까? 아니면 독점적으로 코입니까?
Joe

6
이 답변의 나이를 감안할 때 아마도 이전 버전의 unittest의 "보일러 플레이트"가 크게 사라 졌다는 것을 언급 할 가치가 있습니다. 나는 여전히 코를 더 좋아하지만, 그것은 거의 던지기입니다.
Adam Parkin 2016 년

1
참고로 코는 지난 몇 년 동안 "유지 관리 모드"에 있었으며 모든 개발이 중단 될 것입니다 (타사 개입 없음). 관리자는 새로운 프로젝트가 대안을 사용하도록 권장합니다.
Six

48

나는 거의 독점적으로 unittest를 사용합니다.

가끔씩, 나는 doctest가 사용할 수있는 docstring에 어떤 것들을 넣을 것입니다.

테스트 사례의 95 %가 unittest입니다.

왜? 나는 docstrings를 약간 더 짧게 유지하는 것을 좋아합니다. 때로는 테스트 사례가 문서 문자열을 명확하게하는 데 도움이됩니다. 대부분의 경우, 애플리케이션의 테스트 케이스는 문서화하기에는 너무 길다.


예, 당신이 적합하다고 생각 docstring하는 것과 그렇지 않은 것을 보는 것이 좋을 것입니다 . 실제로 docstring은 인터페이스 사용 방법을 명시 적으로 표시한다는 점에서 docstring을 좋아하지만 해당 테스트와 단위 테스트에 모두 사용하면 적합하지 않을 수 있습니다.
user1767754

33

doctesting의 또 다른 장점은 코드가 문서의 기능을 수행하는지 확인하는 것입니다. 잠시 후 소프트웨어 변경으로 인해 문서와 코드가 다른 작업을 수행 할 수 있습니다. :-)


6
+1 + 우수 점
Doug

28

나는 생물 정보 학자로 일하고 있으며, 내가 작성하는 대부분의 코드는 "한 번에 하나의 작업"스크립트이며, 한두 번만 실행되고 하나의 특정 작업을 실행하는 코드입니다.

이 상황에서 큰 단위 테스트를 작성하는 것은 과도 할 수 있으며 doctest는 유용한 타협입니다. 작성이 더 빠르며 일반적으로 코드에 통합되어 있으므로 다른 파일을 열지 않고도 코드의 작동 방식을 항상 주시 할 수 있습니다. 작은 스크립트를 작성할 때 유용합니다.

또한 doctest는 스크립트를 프로그래밍 전문가가 아닌 연구원에게 전달해야 할 때 유용합니다. 어떤 사람들은 단위 테스트가 어떻게 구성되어 있는지 이해하기가 매우 어렵습니다. 다른 한편으로, doctest는 사용의 간단한 예이므로 사람들은 복사하여 붙여 넣기하여 사용법을 볼 수 있습니다.

내 대답을 다시 시작하려면 doctests는 작은 스크립트를 작성해야 할 때와 컴퓨터 과학자가 아닌 연구원에게 스크립트를 전달하거나 보여야 할 때 유용합니다.


6
"doctest는 작은 스크립트를 작성해야 할 때, 그리고 컴퓨터 과학자가 아닌 연구원에게 스크립트를 전달하거나 보여 주어야 할 때 유용합니다." 훌륭한 지적입니다. 나는 똑같은 일을하고 파이썬이 아닌 프로그래머는 문서를 실행할 수 있다는 것에 항상 놀랐습니다.
다니엘 카나스

14

단위 테스트에 대한 아이디어를 시작했다면 사용 doctest하기가 간단하기 때문에 시작하겠습니다 . 또한 자연스럽게 어느 정도의 문서를 제공합니다. 보다 포괄적 인 테스트doctest 위해 외부 파일에 테스트를 배치하여 문서를 어지럽히 지 않도록 할 수 있습니다.

내가 제안 unittest당신은 당신이 다른 곳이었다으로 일반적으로 같은 방법으로 쓰기 단위 테스트를 할 수 있도록하려면 사용의 JUnit 또는 이와 유사한를 갖는의 배경에서 오는하는 경우.


4
나는이 방향으로 격려를 doctest받았지만 (최초로) 후회했다. 사소한 테스트 사례의 경우 편집기의 구문 강조 표시 및 자동 완성 기능이 손실되었습니다. 테스트가 별도의 파일에있을 때 더 이상 편집기에서 직접 실행할 수 없었습니다. 매번 컨텍스트를 해당 소스 파일로 다시 변경해야했습니다.
Oddthinking

7

나는 unittest를 독점적으로 사용한다; doctest가 메인 모듈을 너무 혼란스럽게 생각합니다. 이것은 아마도 철저한 테스트를 작성하는 것과 관련이 있습니다.


7

둘 다 사용하는 것은 유효하고 다소 간단한 옵션입니다. 이 doctest모듈은 모듈 또는 파일에서 각각 단위 테스트 호환 테스트 슈트를 작성하는 DoctTestSuiteDocFileSuite메소드를 제공합니다 .

그래서 나는 둘 다 사용하고 일반적으로 설정이 거의 필요없는 함수 (인수의 간단한 유형)로 간단한 테스트를 위해 doctest를 사용합니다. 실제로 몇 가지 doctest 테스트가 도움이 된다고 생각합니다. 가 기능을 손상시키지 않고 문서화하는 이된다고 생각합니다.

그러나 더 복잡한 경우와보다 포괄적 인 테스트 사례의 경우 더 많은 제어 및 유연성을 제공하는 unittest를 사용합니다.


7

나는 doctest를 unittest의 대체물로 사용하지 않습니다. 그것들이 약간 겹치지 만 두 모듈은 같은 기능을하지 않습니다 :

  • unittest단위 테스트 프레임 워크로 사용 하므로 코드의 나머지 부분에 대한 수정의 영향을 신속하게 확인할 수 있습니다.

  • 내가 사용하는 doctest코멘트 (즉 문서화 문자열)이 여전히 코드의 현재 버전과 관련이 있음을 보증한다.

내가 얻은 테스트 주도 개발의 광범위한 문서화 된 이점 unittest. doctest오래된 주석이 코드 유지 관리를 오도하는 훨씬 더 미묘한 위험을 해결합니다.


4

나는 거의 doctest를 사용하지 않습니다. 내 코드가 자체 문서화되기를 원하고 docstring은 사용자에게 문서를 제공합니다. IMO는 모듈에 수백 줄의 테스트를 추가하면 문서 문자열을 읽기 어렵게 만듭니다. 또한 필요할 때 단위 테스트를 쉽게 수정할 수 있습니다.


4

Doctest때때로 잘못된 결과를 초래할 수 있습니다. 특히 출력에 이스케이프 시퀀스가 ​​포함 된 경우. 예를 들어

def convert():
    """
    >>> convert()
    '\xe0\xa4\x95'
    """
    a = '\xe0\xa4\x95'
    return a
import doctest
doctest.testmod()

준다

**********************************************************************
File "hindi.py", line 3, in __main__.convert
Failed example:
    convert()
Expected:
    'क'
Got:
    '\xe0\xa4\x95'
**********************************************************************
1 items had failures:
   1 of   1 in __main__.convert
***Test Failed*** 1 failures. 

또한 출력 유형을 확인하지 않습니다. 출력 문자열을 비교합니다. 예를 들어 정수이면 정수처럼 인쇄하는 합리적인 유형을 만들었습니다. 그런 다음 합리적인 반환 기능을 가지고 있다고 가정하십시오. 따라서 출력이 합리적인 정수 또는 정수이면 doctest는 차별화되지 않습니다.


5
원시 docstrings ( r""" ... """)를 사용하여 첫 번째 문제를 해결할 수 있습니다 .
icktoofay

파이썬 3.4에서 잘 작동합니다. 파이썬 2.7에서도 작동하게하려면 '\\xe0\\xa4\\x95'docstring에서 사용 하십시오.
Cees Timmerman 2016 년

또한 유니 코드 리터럴도 doctest에서 작동하지 않는다는 것을 알았습니다 (파일 상단의 오른쪽 'coding utf-8'주석 행에서도). 일반적으로 doctest는 unittest 테스트만큼 지원되지 않으므로 버그가 있습니다. 수정되지 않음
RichVel

2

검색 기반 시스템을 선호합니다 (현재 전자를 사용하는 "nose"및 "py.test").

doctest는 테스트가 문서로도 좋을 때 좋습니다. 그렇지 않으면 코드가 너무 복잡해집니다.


코는 매우 유용하게 보입니다. 나는 그것을 사용할 수있는 기회를 아직 얻지 못했지만, 나는 큰 희망을 가지고있다 :)
Tony Arkles

코는 사용하기 가장 쉬운 테스트 프레임 워크 인 IMO입니다. 테스트 케이스를 작성하고 실행하는 것이 매우 쉽습니다.
Kamil Kisiel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.