重複したコードは、他のコードと同じように、単体テスト コードの臭いです。テストに重複したコードがあると、更新するテストの数が不均衡になるため、実装コードのリファクタリングが難しくなります。テストは、テスト対象のコードでの作業を妨げる大きな負担になるのではなく、自信を持ってリファクタリングするのに役立つはずです。
複製がフィクスチャのセットアップにある場合は、setUp
メソッドをさらに活用するか、より多くの (またはより柔軟な) Creation Methodsを提供することを検討してください。
SUT を操作するコードに重複がある場合は、複数のいわゆる「ユニット」テストがまったく同じ機能を実行している理由を自問してください。
重複がアサーションにある場合は、おそらくいくつかのカスタム アサーションが必要です。たとえば、複数のテストに次のようなアサーションの文字列がある場合:
assertEqual('Joe', person.getFirstName())
assertEqual('Bloggs', person.getLastName())
assertEqual(23, person.getAge())
assertPersonEqual
次に、おそらく、単一のメソッドが必要になるため、 assertPersonEqual(Person('Joe', 'Bloggs', 23), person)
. (または、単純に等値演算子をオーバーロードする必要があるかもしれませんPerson
。)
おっしゃる通り、テストコードは読みやすいことが重要です。特に、テストの意図が明確であることが重要です。多くのテストがほとんど同じように見える場合 (たとえば、行の 4 分の 3 が同じまたは実質的に同じ)、それらを注意深く読んで比較しないと、大きな違いを見つけて認識するのは困難です。したがって、すべてのテストメソッドのすべての行がテストの目的に直接関連しているため、重複を削除するためのリファクタリングが読みやすさに役立つことがわかりました。これは、直接関連する行をランダムに組み合わせたり、単なるボイラープレートの行よりも、読者にとってはるかに役立ちます。
とはいえ、テストでは、類似しているが大きく異なる複雑な状況が実行される場合があり、重複を減らす良い方法を見つけるのは困難です。常識を働かせてください: テストが読みやすく、その意図が明確であると感じ、テストによって呼び出されたコードをリファクタリングするときに、理論的に最小限の数以上のテストを更新する必要があることに満足している場合は、不完全さを受け入れて移動してください。より生産的なものに。インスピレーションが湧いたら、いつでも戻ってテストをリファクタリングできます。