回答:
テストをどのように構成するかは、テストを行うことの重要性と比較してかなり重要ではありません。
優れたテストスイートで最も重要なことは、すべての機能を網羅していることです。これにより、リグレッションの欠陥が導入されるたびに、すぐに気付くことができます。メソッドごとに1つのテストを書くか、メソッドの入力値の組み合わせごとに1つのテストを書くか、そのメソッド内の可能なコードパスごとに1つのテストを書くかはそれほど重要ではありません。これらのテストを少数または多数のテストクラスに編成するかどうかはさらに重要ではありません。テストスイートは常に完全に成功する必要があるため、17のテストのうち3つまたは2つのうちの1つが失敗するかどうかは関係ありません。修繕。
もちろん、テストコードもコードであるため、保守やモジュール化などの通常のベストプラクティスに従う必要があります。ただし、テストクラスとテストクラスの関係ではなく、テストスイート自体の保守性によって決定する必要があります。彼らがテストするクラス。言及したポリシーはどちらも、一貫して従えば、どこにあるかを思い出すのに役立ちますが、そのためにはポリシーの選択よりも一貫性が重要です。
通常、「メソッドごとに1つのテストクラス」と「クラスごとに1つのテストクラス」の両方が極端すぎると思います。
一般に、テストメソッド/ユニットテストごとに1つのチェックが必要です。たとえば、これらはlist.isEmpty = true
およびをチェックする複数のアサーションである可能性があるlist.Length = 0
ため、動作ごとに1つのテストメソッド/ユニットテストを実行します。
これにより、動作を説明するテストメソッド名を簡単に見つけることができます。テストメソッドをテストクラスにグループ化したいので、を読むときにtest classname.test method
意味があります。通常、それらには、テストセットアップ/フィクスチャに簡単に入力できる共有セットアップコードがあります。テスト対象のクラスに応じて、これはクラス全体に対して1つのテストクラスになり、1つのメソッドに対して1つのテストクラスになることもあります。しかし、通常、それは中間のどこかになります。
通常のコードと同様に、テストはできるだけ読みやすくする必要があります。私に役立つのは、テストコードを整理するBDDの指定時またはアレンジアクトアサートスタイルに従うことです。テストクラスにはそれを指定できます。セットアップです。次に、そのクラスのすべてのテストメソッドは、指定されたもの(またはその一部)を使用し、いつか1つを持ちます。
単体テストは、テスト対象のクラスの機能を使用する方法に関するドキュメントとしても考えてください。優れた単体テストを使用すると、テストを読んで、使用するクラスの機能を使用する方法と、正確な効果を調べることができます。
何かが壊れて単体テストが失敗した場合、何が壊れたかをできるだけ簡単に理解できるようにする必要があります。ここでは、テストごとに1つのアサーションが役立ちます。1つのテストに複数のアサーションがある場合、最初のアサーションのみが失敗してメソッドが終了するため、最初のアサーションを失敗させたものを修正するまで、次のテストでテストされた他の動作も壊れているかどうかはわかりません。1つのアサーションで、他のすべてのテストメソッドがまだ実行され、失敗の深さを理解するのがはるかに速くなります。
もちろん、Kilian Fothに同意します。実際には、作業中のコードに対していくつかの単体テストを行うことができます。そして、小さなローカライズされたテストは、テストをまったく行わないよりも優れているか、ビルドサーバーで実行される大きな統合テストのみに多くの時間がかかり、通常はあまりローカライズされていません少し作業する必要があります)。