私は自分のアプリケーションを単体テストしています。ほとんどのテストでは、特定の引数を持つ関数を呼び出して、戻り値と期待値の等しいかどうかを確認しています。Pythonユニットテスト内のオブジェクトの長い定義
一部のテストでは、期待される戻り値は比較的大きなオブジェクトです。そのうちの1つは、たとえば、5つの文字列をタプルのリストにマップする辞書です。そのオブジェクトを定義するには40〜50の反復コードが必要ですが、そのオブジェクトはテストしている関数の1つの期待値です。私のテスト関数の大部分は3-6行のコードで構成されているので、テスト関数内に期待される戻り値を定義するコードの40〜50行を持つことは望ましくありません。私はそのような状況のためのベストプラクティスを探しています。長い定義をテストの中に入れる正しい方法は何ですか?オブジェクトの
テストサンプル:がベースのいくつかの平等の主張を作るここで
は、私は私がそれを見るように最善から最悪までランク付けされ、問題に対処するために考えていたアイデアですキーのサブセットにこれはコードの優雅さのためにテストの徹底を犠牲にします。別のモジュール内のオブジェクトを定義する
:平等の主張を行い、その後のテストで、モジュールをインポートして、別のの.pyファイル内のコードの長い40〜50行を書きます。これはテストを簡潔かつ簡潔にしますが、私はテストの補足として別のファイルを持つのが好きではありません。オブジェクト定義は結局テストの一部です。
テスト関数内でオブジェクトを定義する:これは私が避けたいと思う簡単な解決策です。私のテストはかなりシンプルで簡単ですが、そのオブジェクトの長い定義は適合しません。
多分私はきれいなコードに夢中ですが、私は上記の解決策のどれも好きではありません。私が考えていない別の一般的な練習はありますか?
私の個人的な意見では、*テストルーチン*をテストデータ*から分離します。これにより、テストケースの再利用性が大幅に向上します。私は通常、別のテストモジュールで共通の基本クラスを定義します。私の実際のテストモジュールでは、抽象的なテストケースと実際のデータを特定のケースでリンクします。データは、インラインで配置することも、ファイルから読み込むこともできます。これはあなたに理にかなっていますか? – Constantinius
私はdjangoのソースコードで使用されているテストを見ました。小さなオブジェクトはテスト関数内で定義されます。大きなオブジェクトは専用のファイルにあります(例:https://github.com/django/django/blob/master/tests/modeltests/aggregation/fixtures/aggregation.json) – Pramod
個人的には、別のモジュールで定義する2番目のオプション) 一番です; Constantiniusがすでに述べたように、テストデータを実際のテストルーチンから分離するという追加の利点があります。最初の選択肢は私の本では最悪です。私はそれを見て、エレガントなコードは、機能の損失を犠牲にして来るべきではありません – Moritz