Pythonで単体テストを始めようとしていますが、doctestとunittestの長所と短所を誰かが説明できるかどうか疑問に思っていました。
それぞれにどの条件を使用しますか?
両方とも貴重です。 unittestの代わりに、doctestと nose の両方を使用します。テストが実際にドキュメントとして役立つ使用例を提供している場合に、doctestを使用します。一般的に、これらのテストを包括的なものではなく、情報提供のみを目的としています。 doctestを効果的に逆に使用しています。doctestに基づいてコードをテストするのではなく、コードに基づいてドキュメントが正しいことを確認します。
その理由は、包括的なdoctestがドキュメントを非常に乱雑にするので、使用できないdocstringか、テストが不完全になるかのどちらかになるからです。
codeを実際にテストするための目標は、例によって何が行われるかを説明するのではなく、すべてのケースを徹底的にテストすることです。他のフレームワークがより適切です。
私はほぼ排他的にunittestを使用します。
たまに、doctestで使用できるdocstringにいくつかのものを入れます。
テストケースの95%は単体テストです。
どうして? docstringを少し短く、要点を長くするのが好きです。テストケースは、docstringの明確化に役立つ場合があります。ほとんどの場合、アプリケーションのテストケースはdocstringには長すぎます。
Doctestingのもう1つの利点は、ドキュメントに書かれていることをコードが確実に実行できることです。しばらくすると、ソフトウェアの変更により、ドキュメントとコードが異なる動作をするようになります。 :-)
私はバイオインフォマティシャンとして働いており、私が書くコードのほとんどは「1回1タスク」スクリプトで、1回または2回だけ実行され、特定の1つのタスクを実行するコードです。
この状況では、大きなユニットテストを書くのはやり過ぎかもしれません。また、doctestは有益な妥協案です。それらは書くのが速く、通常コードに組み込まれているため、別のファイルを開かなくても、コードの動作を常に監視できます。小さなスクリプトを書くときに便利です。
また、doctestは、プログラミングの専門家ではない研究者にスクリプトを渡す必要がある場合に役立ちます。一部の人々は、ユニットテストがどのように構成されているかを理解するのが非常に難しいと感じています。一方、doctestは簡単な使用例であるため、人々はコピーして貼り付けるだけで使用方法を確認できます。
したがって、私の答えを再開するには、doctestは、小さなスクリプトを作成する必要がある場合や、コンピューターの科学者ではない研究者に渡すか表示する必要がある場合に役立ちます。
単体テストのアイデアを始めたばかりの場合は、doctest
から始めることにします。これは非常に使いやすいからです。また、ある程度のドキュメントも自然に提供されます。また、doctest
を使用したより包括的なテストのために、外部ファイルにテストを配置して、ドキュメントが乱雑にならないようにすることができます。
JUnitなどを使用した経験があり、他の場所とほぼ同じ方法で単体テストを記述できるようにする場合は、unittest
をお勧めします。
両方を使用するのは、有効でかなり単純なオプションです。 doctest
モジュールは、モジュールまたはファイルからそれぞれunittest互換のテストスイートを作成するDoctTestSuite
およびDocFileSuite
メソッドを提供します。
そのため、私は両方を使用し、通常はセットアップをほとんどまたはまったく必要としない関数(引数の単純型)を使用した単純なテストにdoctestを使用します。実際、いくつかのdoctestのテストではhelp関数を損なうのではなく、文書化します。
しかし、より複雑なケースや、より包括的なテストケースのセットには、より多くの制御と柔軟性を提供するunittestを使用します。
Unittestのみを使用します。私はdoctestがメインモジュールを過度に混乱させていると思います。これはおそらく、徹底的なテストの作成に関係しています。
Unittestの代わりにdoctestを使用しません。それらは少し重複していますが、2つのモジュールには同じ機能がありません。
私はunittest
を単体テストフレームワークとして使用しています。つまり、コードの残りの部分に対する変更の影響を迅速に判断するのに役立ちます。
コメント(つまりdocstrings)が現在のバージョンのコードに関連することを保証するために、doctest
を使用します。
unittest
から得られるテスト駆動開発の広く文書化された利点。 doctest
は、古いコメントがコードの保守を誤解させるという、はるかに微妙な危険を解決します。
Doctestはほとんど使用しません。私は自分のコードを自己文書化したいのですが、docstringsはユーザーに文書を提供します。 IMOがモジュールに数百行のテストを追加すると、docstringsがはるかに読みにくくなります。また、必要に応じて単体テストを変更する方が簡単だと感じています。
Doctest
は、間違った結果につながる場合があります。特に、出力にエスケープシーケンスが含まれる場合。例えば
def convert():
"""
>>> convert()
'\xe0\xa4\x95'
"""
a = '\xe0\xa4\x95'
return a
import doctest
doctest.testmod()
与える
**********************************************************************
File "hindi.py", line 3, in __main__.convert
Failed example:
convert()
Expected:
'क'
Got:
'\xe0\xa4\x95'
**********************************************************************
1 items had failures:
1 of 1 in __main__.convert
***Test Failed*** 1 failures.
また、出力のタイプをチェックしません。出力文字列を比較するだけです。たとえば、整数の場合、整数のように表示される合理的な型を作成しました。次に、有理数を返す関数があるとします。したがって、doctestは、出力が有理数の整数か整数かを区別しません。
ディスカバリーベースのシステム(現在は前者を使用している「nose」と「py.test」)を好みます。
doctestは、テストがドキュメントとしても優れている場合に便利です。そうでないと、コードが煩雑になる傾向があります。