質問

答えは見つかりませんが、議論がすでに議論されている可能性が非常に高いです。

Python言語を使用して、非常に小さなサイズのプログラムを作成しようとしています。それはダイナミックな言語での私の最初の「本当の」体験であり、私はすべてを正しい方法で行うことを望んでいます。最初はユニットテストです。

メソッドのパラメーターが適切なタイプであることをすばやくテストするにはどうすればよいですか?私はそれをすべきですか?

右のタイプIは、たとえば、フロート番号で動作するメソッドが文字列で呼び出されないことを確認することを意味します。この場合、メソッドは明らかに整数でさえも浮かんでいるだけでなく、明らかに受け入れるべきである可能性を考慮してください。

役に立ちましたか?

解決

メソッドのパラメーターが適切なタイプであることをすばやくテストするにはどうすればよいですか?

最も簡単な方法は、何もしないことです。

真剣に。動的言語通訳(この場合はPython)は、書くことができるコードよりもはるかに迅速にチェックします。それは単に例外を提起するだけで、それがあなたがする必要があるすべてです。何もない。

私はそれをすべきですか?

適切なタイプをテストしないでください。一般的にはできません。

「番号」が必要な関数があるとしましょう。

def some_func( x ):
    assert isinstance(x, int)

悪いポリシー。あなたの機能は、intと同様に長いまたはフロートで動作する場合があります。

assert instance( x, (int, long, float) )

悪いポリシー。あなたはまだ複雑なものを除外しました。確かに、あなたも除外しました decimal.Decimalfractions.Rational 有効な数字でもあります。

「タイプチェック」とは、有効なタイプを除外します。できることは、タイプが適切であると仮定し、誰かがあなたの関数やクラスを「誤用」し、間違ったタイプを提供するときに例外を優雅に処理することです。

最も優雅な処理方法 TypeError?

何もしない。プログラム したほうがいい 完全にクラッシュします。

他のヒント

特定のタイプをテストしないでください。による ドキュメント, 、必要に応じてパスインオブジェクトを使用して、ユーザーにカスタム実装を提供する機会を提供する必要があります。

機能が何をするかによって、引数を予想されるタイプに変換することが適切かもしれません。

def my_func(a):
    a = float(a)
    # ...do stuff...

別の優れたオプションは使用することです hasattr() 使用する前に目的のメンバーを確認します。これにより、デフォルトの属性エラーではなく、有用な例外を投げることができます。

完全なカバレッジを備えたユニットテストは、実際に動的言語に依存する開発作業を処理する唯一の方法です。明らかに、静的にタイプされた言語の強力なカバレッジテストを行うことは非常に有益ですが、私の経験では、動的なタイピングがある場合はさらに重要です。

テストで実行できるすべてのコードをカバーしていない場合は、実際にトラブルを求めています。したがって、コードのすべてに到達していることを証明するために、ユニットテストと連携してカバレッジ分析ツールを使用します。

それでも、すべての落とし穴を防ぐことはできません。テストは、プログラムが受信する可能性のあるすべての誤った入力データエラーを実際に行使する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top