1. ホーム
  2. unit-testing

[解決済み] Private/Protectedメソッドはユニットテストに入れるべき?[クローズド]

2023-05-05 17:20:22

質問

TDD開発において、一般的に最初に行うことは、インターフェースを作成し、そのインターフェースに対するユニットテストを書き始めることです。TDDプロセスを進めていくと、最終的にはインターフェイスを実装するクラスを作成し、ある時点でユニットテストに合格することになります。

今、私の質問は、インターフェイスによって公開されたメソッド/プロパティをサポートするために、私のクラスで書かなければならないかもしれないプライベートおよびプロテクトされたメソッドについてです。

  • クラス内のプライベートメソッドは独自のユニットテストを持つべきでしょうか?

  • クラス内の protected メソッドは独自のユニットテストを持つべきでしょうか?

私の考えです。

  • 特にインターフェイスにコーディングしているので、protected/privateメソッドはブラックボックスなので気にする必要はないでしょう。

  • 私はインターフェイスを使用しているので、定義された契約がインターフェイスを実装する異なるクラスによって適切に実装されていることを検証するためにユニットテストを書いています。したがって、再び私はプライベート/保護されたメソッドを心配すべきではありませんし、それらはインターフェイスによって定義されたメソッド/プロパティを呼び出すユニットテストを通じて実行されるべきです。

  • もし私のコードカバレッジが、protected/privateメソッドがヒットしていることを示さないなら、私は正しいユニットテストを持っていないか、使われていないコードがあり、削除されるべきです。

どのように解決するのですか?

いいえ、プライベートメソッドやプロテクトメソッドをテストすることは考えていません。 クラスの private および protected メソッドは public インターフェイスの一部ではないので、public な振る舞いを公開することはありません。 一般的にこれらのメソッドは、テストを緑にした後に適用するリファクタリングによって作成されます。

ですから、これらのプライベートメソッドはテストされる 暗黙のうちに を暗黙のうちにテストしていることになります。

より哲学的な話をすると、テストしているのはメソッドではなく振る舞いであることを忘れないでください。 つまり、テスト対象のクラスができることのセットについて考えるなら、そのクラスが期待通りの振る舞いをすることをテストし主張できる限り、その振る舞いを実装するためにクラスが内部で使用するプライベート(およびプロテクト)メソッドがあるかどうかは関係ないのです。 それらのメソッドは、公開された動作の実装の詳細です。