38

私はこのようなdoctestを書きたいです:

"""
>>> print a.string()
          foo : a
          bar : b
         date : <I don't care about the date output>
          baz : c
"""

これを行う方法はありますか?単体テストに切り替える方が理にかなっていると思いますが、doctestのテストに一致してはならない出力の範囲を指定できるかどうか知りたいです。

ありがとう!

4

6 に答える 6

47

doctest.ELLIPSIS使用...すると、「ここの任意の文字列に一致する」という意味で使用できます。doctestdoctest ディレクティブを使用してオプションを設定し、1 つのテスト ケースに対してのみアクティブにすることができます。オンライン ドキュメントの 1 つの例は次のとおりです。

>>> print range(20) # doctest:+ELLIPSIS
[0, 1, ..., 18, 19]

doctest オプションを常に有効にしたい場合は、optionflags=使用する doctest 関数に引数として渡すことができますdoctest.testfile|(演算子を使用して複数のオプション フラグを渡すことができます)。

于 2009-06-21T18:03:19.713 に答える
17

「どうすれば行全体を無視できるか」に関する質問への回答: はい、「...」も継続のように見えるという事実は、出力全体を無視することを困難にします。例を完全にスキップしたい場合は "#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__

(このテストもパスします。)

于 2012-02-22T18:33:27.373 に答える
11

ただし、行全体を無視するのは少し難しいです。ここ:

"""
>>> do_your_thing() #doctest:+ELLIPSIS
...
"""

トリプル ドットは行の継続として解釈され、構文エラーが発生します。

行全体を無視する場合は、次のようなものが必要です。

"""
>>> sys.stdout.write('skip from here '); do_your_thing() #doctest:+ELLIPSIS
skip from here ...
"""
于 2012-02-22T17:27:29.660 に答える
10

不要な戻り値を変数に代入する方が簡単であることがわかりました。

>>> _ = do_something()
>>> check_something()
True
于 2014-03-20T15:29:32.253 に答える
6

関数の前後にタプルを書くことができます (Mark Horvath の回答に触発されたハック):

def foo():
    """
    >>> ();foo();() # doctest: +ELLIPSIS
    (...)
    """
    print "Hello world"
    return "Hello world"
于 2015-10-28T20:27:08.923 に答える
0

Python doctestの行の先頭に省略記号を付けることはできますか?追加の文字列を省略記号として使用するカスタム出力チェッカーを作成する方法について説明します。これにより、他の場所で「...」を使用したまま、次のように記述できます。

def foo():
  """
  >>> foo() # doctest: +ELLIPSIS
  [...] world
  """
  print "hello world"
于 2012-09-01T10:39:45.197 に答える