回答:
どちらも貴重です。unittestの代わりにdoctestとnoseの両方を使用しています。テストで実際にドキュメントとして役立つ使用例がテストで示されている場合は、doctestを使用します。一般に、これらのテストを包括的にすることはせず、情報提供のみを目的としています。私は効果的にdoctestを逆に使用しています。私のdoctestに基づいてコードをテストするのではなく、コードに基づいてドキュメントが正しいことを確認するためです。
その理由は、包括的なdoctestはドキュメントを乱雑にしすぎるため、使用できないdocstringsまたは不完全なテストのいずれかになるということです。
実際にコードをテストする場合の目標は、例によって何が行われるかを示すのではなく、すべてのケースを徹底的にテストすることです。これは、他のフレームワークでより適切に満たされると思う別の目標です。
私はunittestをほぼ排他的に使用しています。
たまに、doctestで使用できるものをdocstringに入れます。
テストケースの95%はユニットテストです。
どうして?私はdocstringをいくぶん短くして、要点を維持するのが好きです。場合によっては、テストケースがdocstringを明確にするのに役立ちます。ほとんどの場合、アプリケーションのテストケースはdocstringに対して長すぎます。
docstring
。私は実際にインターフェイスの使用方法を明示的に示しているという点でdocstringが好きですが、それをユニットテストとユニットテストの両方に使用するとうまく適合しない可能性があります。
私はバイオインフォマティシャンとして働いており、私が書くコードのほとんどは「1回、1タスク」のスクリプトであり、1回または2回だけ実行され、1つの特定のタスクを実行するコードです。
この状況では、大きなユニットテストを書くのはやり過ぎかもしれませんし、doctestは有用な妥協案です。これらは記述が速く、通常はコードに組み込まれているため、別のファイルを開かなくても、コードの動作を常に監視できます。小さなスクリプトを書くときに便利です。
また、doctestは、プログラミングの専門家ではない研究者にスクリプトを渡す必要がある場合にも役立ちます。一部の人々は、ユニットテストがどのように構成されているかを理解するのが非常に難しいと感じています。一方、doctestは簡単な使用例なので、コピーして貼り付けるだけで使用方法を確認できます。
だから、私の答えを再開すると:doctestは、小さなスクリプトを書く必要がある場合や、それらを渡したり、コンピューター科学者ではない研究者に見せたりする必要がある場合に役立ちます。
単体テストのアイデアを始めたばかりの場合doctest
は、使い方がとても簡単なので、まず始めに説明します。また、ある程度のドキュメントも当然提供されます。また、を使用してより包括的なテストを行うにdoctest
は、外部ファイルにテストを配置して、ドキュメントが煩雑にならないようにします。
私はお勧めしunittest
、あなたが他の場所となっていると一般的に同じ方法で、ライトユニットテストにできるようにしたい使用JUnitのか、似たような、持っていることの背景から来ている場合。
doctest
まずは)励まされましたが、結局それを後悔しました。自明ではないテストケースの場合、私はエディターの構文の強調表示とオートコンプリートを失いました。テストが別のファイルにある場合、エディターから直接実行することができなくなりました。毎回、コンテキストを対応するソースファイルに戻す必要がありました。
両方を使用することは、有効でかなり単純なオプションです。doctest
モジュールが提供DoctTestSuite
とDocFileSuite
、それぞれのモジュールまたはファイルからunittestの互換性テストスイートを作成する方法を。
したがって、私は両方を使用し、通常はほとんどまたはまったくセットアップを必要としない関数(引数の単純な型)を使用した単純なテストにdoctestを使用します。実際には、いくつかのdoctestテストが機能を損なうのではなく、機能の文書化に役立つと思います。
しかし、より複雑なケースや、より包括的なテストケースのセットでは、制御と柔軟性を高めるunittestを使用しています。
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は、出力が有理整数か整数かを区別しません。
r""" ... """
)を使用して最初の問題を修正できます。
'\\xe0\\xa4\\x95'
は、docstring で使用します。
私は、ディスカバリー・ベースのシステム(「nose」と「py.test」、現在は前者を使用)を好みます。
doctestは、テストがドキュメントとしても優れている場合に適しています。そうでない場合、コードが煩雑になる傾向があります。