python doctestはいくつかの出力行を無視できますか?
質問
このような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
オプションを設定し、1つのテストケースのみでアクティブにすることができます:オンラインドキュメント:
>>> print range(20) # doctest:+ELLIPSIS
[0, 1, ..., 18, 19]
doctestオプションをずっとアクティブにしたい場合は、使用するdoctest関数に optionflags =
引数として渡すことができます。 doctest.testfile
。 (複数のオプションフラグを渡すには、 |
演算子を使用してビットORを実行します)。
他のヒント
「行全体を無視する方法」に関する質問への回答:はい、「...」という事実また、出力全体を無視するのが難しくなるような継続のように見えます。 &quot; #doctest:+ SKIP&quot;を使用できます。例を完全にスキップしたいが、副作用に依存している場合は機能しません。本当にこれを行う必要がある場合は、特に推奨しませんが、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"