48

関数だけでなく、クラスにPythonのdoctestの概念を使用することは可能ですか?

もしそうなら、どこにdoctestsを置くべきですか?クラスのdocstringに、またはコンストラクターのdocstringに?

明確にするために、私は次のようなものを探しています:

class Test:
    """
    >>> a=Test(5)
    >>> a.multiply_by_2()
    10
    """
    def __init__(self, number):
        self._number=number

    def multiply_by_2(self):
        return self._number*2

前もって感謝します、

アダム

4

4 に答える 4

74

すべてのメソッドでオブジェクトをインスタンス化する代わりに、extraglobs引数を使用できます。

class Test:
    def multiply_by_2(self):
        """
        >>> t.multiply_by_2()
        10
        """
        return self._number*2

if __name__ == '__main__':
    import doctest
    doctest.testmod(extraglobs={'t': Test()})
于 2010-10-14T18:02:14.537 に答える
30

ファイルの下部にあるdoctestを実際に実行するためのコードがありません。

class Test:
    <snip>

if __name__ == "__main__":
    import doctest
    doctest.testmod()

テストをどこに置くかについて:

  • クラス全体をテストする場合は、クラスのdocstringに入れます。
  • コンストラクターをテストしている場合は、コンストラクターのdocstringに入れます。
  • メソッドをテストしている場合(この場合のように)、実際にそのメソッドのdocstringに配置します。
于 2010-04-25T12:45:27.850 に答える
7

doctestモジュールは、ファイル内のdocstringを検索し、その中に埋め込まれているコードを実行するため、クラスにdoctestを使用することができます。

doctestをクラスのdocstringに入れるのが良いのか、コンストラクターに入れるのが良いのかについては、正確に何を文書化しているかによると思います。

docstringがクラスの一般的な概要とその使用方法を示している場合は、クラスに配置する方がよいと思います。

docstringが特にクラスのインスタンスを作成する方法に関するものである場合は、__init__メソッドに含める必要があります。

doctestsの目的は、主にドキュメントに自己検証型のサンプルコードを含めることであるため、IMHOのドキュメントの側面はテストの側面よりも優先される必要があることを忘れないでください。

編集:

上記の例では、doctestを実行するコードはありません。runningpython test.py -vは、クラスを定義するだけのメインのPythonコードを実行します。

これをファイルの最後に追加する必要があります。

if __name__ == "__main__":
    import doctest
    doctest.testmod()

または、Python 2.6以降を使用している場合は、次のコマンドで実行します。

python -m doctest -v test.py
于 2010-04-25T12:36:55.507 に答える
0

doctestモジュールのドキュメントでは、これを処理する方法が説明されていないと思います。また、何をすべきかを説明するのに適しているはずです。

インスタンスデータを必要としないが、クラスデータへのアクセスが必要な可能性があるクラスメソッドをテストするために私が理解したパターンは、インスタンスの代わりにClassオブジェクトを渡すことです。

class Test:
    """
    >>> Test.multiply_by_3(Test,2)
    6
    """
    def __init__(self, number):
        self._number=number

    _THREE = 3
    def multiply_by_3(self, x):
        return x*self._THREE

if __name__ == "__main__":
    import doctest
    doctest.testmod()
于 2018-05-14T01:42:17.640 に答える