privateなメソッドは何故テストしないのか?

自動テストについて学ぶ

Fjord Boot Campで自動テストのプラクティスに入りました。
過去の質問の中に、『privateなメソッドは何故テストしないのか?』という質問がありました。
結構発展的なトピックだと思うのですが、自分の中ではすんなり理解できた気がしました。
というのも、最近"単体テストの考え方/使い方"という本を読み進めていて、テストするべき対象について学んでいたからです。

なので、"privateなメソッドは何故テストしないのか"について、質問の回答も踏まえて自分なりに説明してみたいと思います。

そもそもテストの対象じゃないから

まず、テストの対象とするべきなのは外から見た振る舞いであり、実装の詳細ではありません。
実装の詳細をテストするようになると、テストが壊れやすくなります。
壊れやすいテストはプロジェクトが大きくなるほど重荷になり、やがて放置され、テスト自体が形骸化するような事態にまで発展してしまう可能性があります。

実装がおかしい可能性が高いから

実装の詳細であるはずのコードをテストしたいと感じるときは、そもそも実装の仕方に問題がある可能性が高いです。
例えば、外からアクセスする必要があるならそれはpublicにする必要があるし、privateなメソッドがテストしなくちゃならないほど重要な機能を担っているなら、クラスとして切り出してテストするべきということです。

publicなメソッドのテストで足りるはずだから

本来のテスト対象であるpublicなメソッドのテストが十分に行われていれば、privateなメソッドを使っている部分のテストも同時に済んでいるはずです。
そうでない、ということならば見直すべきはpublicなメソッドのテストの方かもしれません。

以上です

「慣習的にやらないことになっているから」という説明もありましたが、何故そのような慣習になっているかを知ることが大切なんじゃないかと思いました。
一番のポイントはテストするべき対象は外から見た振る舞いの部分ってことだと思います。