7

このようなサンプル doctest があります。

"""
This is the "iniFileGenerator" module.
>>> hintFile = "./tests/unit_test_files/hint.txt"
>>> f = iniFileGenerator(hintFile)
>>> print f.hintFilePath
./tests/unit_test_files/hint.txt
"""
class iniFileGenerator:
    def __init__(self, hintFilePath):
        self.hintFilePath = hintFilePath
    def hello(self):
        """
        >>> f.hello()
        hello
        """
        print "hello"
if __name__ == "__main__":
    import doctest
    doctest.testmod()

このコードを実行すると、このエラーが発生しました。

Failed example:
    f.hello()
Exception raised:
    Traceback (most recent call last):
      File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/doctest.py", line 1254, in __run
        compileflags, 1) in test.globs
      File "<doctest __main__.iniFileGenerator.hello[0]>", line 1, in <module>
        f.hello()
    NameError: name 'f' is not defined

hello()このエラーは、メソッドのテスト時にアクセスできなかった 'f' にアクセスすることによって発生します。

以前に作成したオブジェクトを共有する方法はありますか? それがなければ、必要なときに常にオブジェクトを作成する必要があります。

def hello(self):
    """
    hintFile = "./tests/unit_test_files/hint.txt"
    >>> f = iniFileGenerator(hintFile)
    >>> f.hello()
    hello
    """
    print "hello"
4

3 に答える 3

6

を使用testmod(extraglobs={'f': initFileGenerator('')})して、再利用可能なオブジェクトをグローバルに定義できます。

doctest docが言うように、

extraglobsは、例を実行するために使用されるグローバルにマージされた dict を提供します。これは dict.update() のように機能します

__doc__しかし、すべてのメソッドの前にクラス内のすべてのメソッドをテストしていました。

class MyClass(object):
    """MyClass
    >>> m = MyClass()
    >>> m.hello()
    hello
    >>> m.world()
    world
    """

    def hello(self):
        """method hello"""
        print 'hello'

    def world(self):
        """method world"""
        print 'world'
于 2012-10-28T06:08:54.150 に答える
2

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

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:59:37.040 に答える