2

ファイル内のいくつかの doctest でテスト データや関数を共有したいと考えています。それらを外部ファイルまたはテスト対象のファイルのコード内に配置せずにこれを行う方法はありますか?

アップデート

"""This is the docstring for the module ``fish``.

I've discovered that I can access the module under test
  from within the doctest, and make changes to it, eg


>>> import fish
>>> fish.data = {1: 'red', 2: 'blue'}
"""

def jef():
    """
    Modifications made to the module will persist across subsequent tests:

    >>> import fish
    >>> fish.data[1]
    'red'
    """
    pass

def seuss():
    """
    Although the doctest documentation claims that
      "each time doctest finds a docstring to test,
       it uses a shallow copy of M‘s globals",
      modifications made to the module by a doctest
      are not imported into the context of subsequent docstrings:

    >>> data
    Traceback (most recent call last):
      ...
    NameError: name 'data' is not defined
    """
    pass

それでdoctest、モジュールを一度コピーしてから、各docstringのコピーをコピーすると思いますか?

いずれにせよ、モジュールを各 docstring にインポートすることは、面倒ではありますが、使用できるようです。

ドキュメント化されていない可能性のある方法で後続のテストにインポートされる、またはインポートされない実際のモジュール データを誤って踏みにじるのを避けるために、これには別の名前空間を使用することをお勧めします。

この名前空間を含めるために、モジュールを動的に作成することが (理論的には) 可能であることがわかりました。しかし、しばらく前に尋ねた質問から、それを行う方法についての指示はまだ得られていません。どんな情報でも大歓迎です!(適切な質問への回答として)

いずれにせよ、変更を後続のドキュメント文字列の名前空間に直接反映させたいと思います。したがって、私の最初の質問は依然として有効であり、それを修飾子として使用しています。

4

2 に答える 2

2

これは、人々がdoctestから目をそらすようなものです。テストが複雑になるにつれて、製品コードを設計するのと同じようにテストを設計できる実際のプログラミングツールが必要になります。

製品コードで定義してからdoctestで使用する以外に、共有データや関数をdoctestに含める方法はないと思います。

テストインフラストラクチャの一部を定義するには、実際のコードを使用する必要があります。doctestが好きな場合は、doctestからそのインフラストラクチャを使用できます。

于 2010-07-20T03:12:22.353 に答える
0

大声で宣伝されていないかもしれませんが、これは可能です。

すべてが共有実行コンテキストを使用する (つまり、個々のテストが結果を共有して再利用できる) テストを備えた読みやすいモジュールを取得するには、次のようなドキュメントの関連部分を確認する必要があります。

doctest...はテストする docstring を見つけるたびに、 のグローバルの浅い コピーを使用するため、テストを実行してもモジュールの実際のグローバルは変更されません。動作するようにテストします。MM

...

または代わりに渡すことにより、実行コンテキストとして独自の辞書を強制的に使用できます。globs=your_dicttestmod()testfile()

これを考えると、モジュールからリバースエンジニアリングを行うことができましたdoctest。これは、コピーを使用するだけでなく(つまり、dictのメソッド)、各テストの後にcopy()(を使用して)グローバル辞書もクリアします。clear()

したがって、次のようなもので独自のグローバル辞書にパッチを適用できます。

class Context(dict):
    def clear(self):
        pass
    def copy(self):
        return self 

そしてそれを次のように使用します:

import doctest
from importlib import import_module

module = import_module('some.module')
doctest.testmod(module,
                # Make a copy of globals so tests in this
                # module don't affect the tests in another
                glob=Context(module.__dict__.copy()))
于 2016-02-06T14:53:16.603 に答える