基本クラスのテストを回避しても大丈夫ですか?


15

かなり汎用的である必要がある柔軟性/抽象化を与えるために、かなりの量の「メタプログラミング」を持つ基本クラスがあります。

基本クラスの共通メソッドを使用するサブクラスが多数あり、各サブクラスのすべてのケースをカバーする動作指向の単体テストがあります。

基本クラスのテストをスキップしても大丈夫ですか?


1
この質問を自問し始めたときに時々することの1つは、コードを壊そうとすることです。無効な入力を投げたり、間違った構成値を指定したりなど
Zymus

回答:


31

十分なテストがあるかどうかを確認するために、コードカバレッジとテストによって引き起こされたブランチカバレッジを確認できます(おそらく、カバレッジツールを使用するか、コードパスを確認するか、デバッガーを使用して手動で)。

結論が出ると、サブクラスのテストでベースクラスのコードを十分にカバーできるので、テストを追加しても大きなメリットは得られません。一方、ベースクラスを直接使用して特定のテストを追加することによってのみテストできるコードパスがある場合は、このルートを使用する必要があります。

「基本クラスを直接テストする」理由として考えられるもう1つの理由は、そのクラスの特定の機能を「分離して」テストすることです。特定のメソッドを使用するサブクラスのメソッドを呼び出して間接的にそのメソッドをテストするだけでなく、特定のメソッドのテストケースを直接設計する方が簡単な場合があります。

一般的な使用シナリオサブクラスを派生させる汎用ベースクラスがある場合、基本クラスはおそらく抽象クラスであることに注意してください。したがって、このようなクラスをテストするには、とにかく派生を行う必要があります。この状況では、「基本クラスを直接」テストすることは、もちろんテスト目的のためだけに特別な派生物を追加することを意味します。


はい、より明確に定義されたメソッドの基本クラスの直接単体テストに同意します。私がやりたくなかったのは、サブクラスのユニットテストが暗黙的にそのようなものをテストするため、すべてのメタプログラミングをテストすることです。
ネイサン

4
テストディレクトリ内にのみ存在する基本/抽象クラスを拡張し、基本クラスの公開/インスタンス化のみを行うクラスを設計することは、基本クラスの適切なカバレッジを取得し、基礎となるメソッドを保証するための完全に正当かつ合理的なアプローチです使用されるより複雑なクラスを分離して正しく動作します。

@MichaelT:はい。私の答えは、それについて異なる意見があるように聞こえますか?
ドックブラウン

@DocBrownはまったくありません-あなたはその点を明確に明確にしました。私は自分の答えに書いたであろう追加の説明を追加していました(あなたがまだそれを述べていなかったなら)。「Docが言ったことはすべて同意しますが、具体的に声をかけて詳細を書きたい」という回答を書きたくありません。

2

自動化されたテストはプログラマーの利益のために作成されたものであり、プログラマーはテストを提供するために作成されたものではありません。

生産性を高め、顧客が不満を抱く「問題」の数を減らすためのテストがあります。

したがって、各サブクラスのすべてのケースをカバーする動作指向のユニットテストがある場合、ベースクラスを直接テストすることもお客様にとってメリットはありません。これは、基本クラスの一部のコードを変更し、テストが失敗するかどうかを確認することで確認できます。たとえば、コード行を共通化するか、「ifステートメント」に「not」を追加します。(すべてのコード行がテストでカバーされていることを確認するだけでは十分ではありません。)

テストがより生産的になるかどうか尋ねることになります。これにはいくつかの方法があります。

  • コードについてより明確に考えさせてください-コードが書かれているので、この場合はこれはほとんどありません。
  • 基本クラスの一部のコードを単独でテストできるようにするため、コードが既に動作している場合には再び起こりそうもない、より迅速にデバッグします。
  • サブクラスのロジックの詳細を理解しなくても、基本クラスのコードを変更できます-コードをリファクタリングしている場合は?

したがって、サブクラスが機能していることを考えると、基本クラスの直接テストを作成しても意味がありません。 これは今日ではありません。初期の状態でこれらのテストを書くことには利点がなかったでしょう。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.