ちょっとした思考実験を提案します。次のコードを検討してください。
public void promoteUser(User user)
{
int newRank = computeNew(user);
user.setRank(newRank);
}
private int computeNewRank(User user)
{
return user.getRank() + 1;
}
テストする必要があると感じるかもcomputeNewRank
しれません (実際の実装ではもっと多くのことができるかもしれません)。しかし、そのことを少し忘れて、インライン化の魔法を使って次のようにします。
public void promoteUser(User user)
{
int newRank = user.getRank() + 1;
user.setRank(newRank);
}
この実験の優れた点は、あらゆる規模のプライベート メソッドに適用できることです。プライベート メンバーをインライン化し、 「ここで本当にテストしたいことは何ですか?」と自問することを常に想像できます。. それはプライベート メソッド自体ですか、それともプライベート メソッドを装ったまったく新しい機能を備えた新しいクラス/コンポーネントですか? 要点は、プライベート (またはパッケージ/内部) メンバーをテストする必要があることはめったに(あったとしても!) すべきではないということです。外の世界にとって、あなたの契約消費者にとって、それらはすべて無関係な詳細です.
もちろん、すべてをシステム テストに置き換えることもできます。それでは、通常のワークフローはどのようになりますか? ランク プロモーション コードをテストするために、ユーザーをログに記録し、セッションに登録し、3 分間待ち、プロモーション コードを入力し、SMS を受信し、確認する必要があるとしたらどうでしょうか。
単体テストはあなたのためのものであり、その逆ではないことを覚えておくとよいでしょう。それらを曲げたり、調整したり、適合させたりして、より高品質のソフトウェアを提供できます。この目的は、 100% のカバレッジという魔法のような目標を達成するのを助けることではなく、遭遇するバグや障害により迅速に対応できるように、行っていることについてすぐにフィードバックを提供することです。つまり、生産性を向上させるためです。