7

私は自分のアプリケーションを単体テストしています。ほとんどのテストは、特定の引数を使用して関数を呼び出し、戻り値と期待値が等しいことを表明します。

一部のテストでは、期待される戻り値は比較的大きなオブジェクトです。たとえば、そのうちの1つは、5つの文字列をタプルのリストにマップする辞書です。そのオブジェクトを定義するには、40〜50行のコードを繰り返す必要がありますが、そのオブジェクトは、私がテストしている関数の1つの期待値です。ほとんどのテスト関数は3〜6行のコードで構成されているため、テスト関数内で期待される戻り値を定義する40〜50行のコードは必要ありません。そのような状況でのベストプラクティスを探しています。テスト内に長い定義を入れる正しい方法は何ですか?

これが私が問題に対処するために考えていたアイデアであり、私が見ているように最高から最低までランク付けされています。

  • オブジェクトのサンプルのテスト:キーのサブセットに基づいていくつかの同等性アサーションを作成します。これは、コードの優雅さのためにテストの徹底性を犠牲にします。

  • 別のモジュールでのオブジェクトの定義:別の.pyファイルに40〜50行の長いコードを記述し、テストでモジュールをインポートしてから、等価アサーションを作成します。これにより、テストは短く簡潔になりますが、テストの補足として別のファイルを用意するのは好きではありません。結局のところ、オブジェクト定義はテストの一部です。

  • テスト関数内でのオブジェクトの定義:これは、私が避けたい簡単な解決策です。私のテストは非常に単純で簡単であり、そのオブジェクトの長い定義は適合しません。

クリーンなコードに夢中になっているかもしれませんが、上記のソリューションはどれも好きではありません。私が考えていなかった別の一般的な習慣はありますか?

4

2 に答える 2

3

テスト コードテスト データを分離することをお勧めします。このため、私は通常、テストしたいメソッドを含む抽象基本クラスを作成し、いくつかの特定のテスト ケース クラスを作成して、メソッドをデータに関連付けます。(私は Django フレームワークを使用しているので、すべての抽象テスト クラスを に入れますtestbase.py):

testbase.py :

class TestSomeFeature(unittest.TestCase):
    test_data_A = ...

    def test_A(self):
        ... #perform test

そして今、test.pyの実装

class TestSomeFeatureWithDataXY(testbase.TestSomeFeature):
    test_data_A = XY

テスト データは、JSON ファイルなどのように外部化することもできます。

class TestSomeFeatureWithDataXYZ(testbase.TestSomeFeature):
    @property
    def test_data_A(self): 
        return json.load("data/XYZ.json")

ポイントを十分に明確にしていただければ幸いです。あなたの場合、データファイルを使用することを強く選択します。Django は、テストを実行する前にデータベースにロードされるテスト フィクスチャを使用することで、すぐに使用できるこの機能をサポートしています。

于 2012-08-27T10:20:21.900 に答える
1

それは本当にあなたがテストしたいものに依存します。

ディクショナリに特定の値を持つ特定のキーが含まれていることをテストしたい場合は、各キーをチェックするために個別のアサーションをお勧めします。このようにして、辞書が拡張されてもテストは引き続き有効であり、テストの失敗は問題を明確に特定する必要があります (1 つの 50 行の辞書が 2 番目の 50 行の辞書と等しくないことを示すエラー メッセージは正確には明確ではありません)。 .

ディクショナリに特定のキーのみが含まれていることを本当に確認したい場合は、単一のアサーションが適切な場合があります。最も明確な場所と比較するオブジェクトを定義します。コンスタンティニウスの答えが示唆するように、別のファイルで定義すると読みやすくなる場合は、それを検討してください。

どちらの場合も、重要な動作のみをテストすることが指針となります。気にしない動作をテストすると、テスト スイートがリファクタリングの際に役立つというよりも邪魔になる場合があります。

于 2012-08-27T10:38:50.167 に答える