web-dev-qa-db-ja.com

Python:クラスにdoctestを使用する

関数だけでなく、クラスに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

前もって感謝します、

アダム

41
Adam Matan

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

class Test:
    <snip>

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

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

  • クラス全体をテストする場合は、クラスのdocstringに入れます。
  • コンストラクターをテストしている場合は、コンストラクターのdocstringに配置します。
  • メソッドをテストしている場合(この場合のように)、実際にメソッドのdocstringに配置します。
29
Aaron Maenpaa

すべてのメソッドでオブジェクトをインスタンス化する代わりに、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()})
64
Ari

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

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

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

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

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

編集:

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

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

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

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

python -m doctest -v test.py
7
Dave Kirby

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()
0
Jim DeLaHunt