Python Doctest가 일부 출력 라인을 무시할 수 있습니까?
문제
다음과 같은 문서를 쓰고 싶습니다.
"""
>>> print a.string()
foo : a
bar : b
date : <I don't care about the date output>
baz : c
"""
이것을 할 방법이 있습니까? UnitTest로 전환하는 것이 더 합리적이라고 생각하지만 DocTest에서 테스트에 맞지 않아야 할 다양한 출력을 지정할 수 있는지 궁금합니다.
감사!
해결책
와 함께 doctest.ELLIPSIS
, 당신이 사용할 수있는 ...
"여기서 문자열 일치"를 의미합니다. 당신은 설정할 수 있습니다 doctest
하나의 테스트 사례에 대해 활성화하기 위해 DocTest 지침이있는 옵션 : 온라인 문서 이다:
>>> print range(20) # doctest:+ELLIPSIS
[0, 1, ..., 18, 19]
DocTest 옵션을 전체적으로 활성화하려면 optionflags=
사용하는 DocTest 기능에 대한 인수, 예를 들어 doctest.testfile
. (사용하여 여러 옵션 플래그를 전달할 수 있습니다. |
비트 또는 비트 또는 연산자).
다른 팁
"전체 라인을 무시할 수있는 방법"에 대한 질문에 응답하면 : 그렇습니다. "..."도 계속해서 보이는 것도 전체 출력을 무시하기가 어렵습니다. 예제를 완전히 건너 뛰려면 "#doctest : +skip"을 사용할 수 있지만 부작용에 의존하는 경우 작동하지 않습니다. 만약 너라면 진짜 이를 수행해야합니다. DocTest 모듈 자체를 원숭이 패치 할 수 있다고 생각하지만 특별히 권장하지는 않습니다.
>>> import doctest
>>> doctest.ELLIPSIS_MARKER = '-etc-'
>>> print 12 # doctest: +ELLIPSIS
-etc-
(이 테스트는 통과합니다.)
또는 stdout 및/또는 stderr를 일시적으로 억제 할 수 있습니다.
>>> # Suppress stdout
>>> import sys
>>> class DevNull:
... def noop(*args, **kwargs): pass
... close = write = flush = writelines = noop
>>> sys.stdout = DevNull()
>>> # Run a test and ignore output (but we need its side effects)
>>> print 12 # NOTE: stdout is suppressed!
>>> # Restore stdout
>>> sys.stdout = sys.__stdout__
(이 테스트도 통과합니다.)
전체 라인을 무시하는 것은 약간 까다 롭습니다. 여기:
"""
>>> do_your_thing() #doctest:+ELLIPSIS
...
"""
트리플 도트는 라인 연속으로 해석되며 구문 오류가 발생합니다.
전체 라인을 무시하려면 다음과 같은 것이 필요합니다.
"""
>>> sys.stdout.write('skip from here '); do_your_thing() #doctest:+ELLIPSIS
skip from here ...
"""
불필요한 반환 값을 변수에 단순히 할당하는 것이 더 쉽다는 것을 알았습니다.
>>> _ = do_something()
>>> check_something()
True
기능 전후에 튜플을 쓸 수 있습니다 (Mark Horvath의 답변에서 영감을 얻은 해킹) :
def foo():
"""
>>> ();foo();() # doctest: +ELLIPSIS
(...)
"""
print "Hello world"
return "Hello world"
Python DocTest에서 선의 시작 부분에 타원을 가질 수 있습니까? 추가 문자열을 타원체로 사용하는 사용자 정의 출력 검사기를 만드는 방법을 설명합니다. 이렇게하면 여전히 '...'를 사용하는 동안 다음을 쓸 수 있습니다.
def foo():
"""
>>> foo() # doctest: +ELLIPSIS
[...] world
"""
print "hello world"