関数だけでなく、クラスに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
前もって感謝します、
アダム
ファイルの下部にあるdoctestを実際に実行するためのコードがありません。
class Test:
<snip>
if __name__ == "__main__":
import doctest
doctest.testmod()
テストをどこに置くかについて:
すべてのメソッドでオブジェクトをインスタンス化する代わりに、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()})
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
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()