11

テストクラスを友達にするのではなく、ユニットテスト用にオブジェクトの内部状態を返す関数を追加する方が良いですか?-特に、単体テストの場合を除いて、機能を使用しない場合。

4

6 に答える 6

12

単体テストでは、95% の確率で、公開されているクラスの表面のみをテストする必要があります。内部で何かをテストしている場合、それは実装の詳細をテストすることであり、実装を簡単に変更してテストを機能させる必要があるため、本質的に壊れやすいものです。壊れやすいだけでなく、計画された使用シナリオでは実際には不可能なことをテストしたくなる可能性もあり、これは時間の無駄です。

追加したいアクセサーのポイントが、関数が目的の効果を持っているかどうかをテストすることだけである場合、クラスの設計は別の原則に違反する可能性があります。それが人々がクラスと対話するときに何が起こるかに影響するかどうか。その場合、それらの読み取り専用アクセサーを提供するのが正しいでしょう。クラスの動作に影響がない場合は、実装の詳細に関する以前の記事を参照してください。

そして、あなたが正しく言ったように、未使用のものでクラスの公開面を乱雑にすることも、それ自体の理由で望ましくありません。

あなたのケースでアクセサーとフレンドシップのどちらかを選ばなければならないとしたら、私はフレンドリング選びます。追加のアクセサーを使用する方法を見つけたピエロがコードを所有していない可能性があります。

于 2009-07-19T05:44:32.110 に答える
9

受け入れられた答えには同意せず、代わりにフレンド クラスの使用をお勧めします。

テストしている状態の一部は、おそらくクラスの実装に固有のものです。他のコードが通常知らない、または気にしない、依存すべきではない詳細をテストしています。パブリック アクセサー関数は、これらの実装の詳細をクラスのインターフェイスの一部にします。テストしている内部状態が意図したインターフェイスの一部ではない場合、パブリック関数を介して表示されるべきではありません。純粋主義者の観点から見ると、フレンド クラスも技術的にはパブリック インターフェイスの一部であるため、2 つの間違った答えの間で行き詰っています。私の考えでは、問題は、将来的に不適切なコーディングの選択につながる可能性が低いオプションはどれですか? 実装依存のパブリック アクセサー関数のセットを使用すると、クラスの実装依存の概念モデルが不注意に促進されます。クラスの実装依存の使用につながります。適切に名前が付けられ、文書化された単一のフレンド クラスは、悪用される可能性が低くなります。

一般に、メンバー変数への直接アクセスよりもアクセサー関数を優先するという推奨事項には強く同意しますが、このベスト プラクティスが実装依存の内部状態の単体テストに適用されることに同意しません。妥当な妥協点は、単体テストが気にする状態の部分にプライベートアクセサー関数を使用し、単体テストでアクセサー関数を使用するのに十分な規律を持たせることです。私の意見です。

于 2009-07-19T05:48:43.757 に答える
3

単体テストにフレンド クラスを使用することは完全に正当であり、カプセル化を維持できます。クラスをよりテストしやすくするためだけに、クラスのパブリック インターフェイスを変更しないでください。このように考えてみてください。サード パーティ製の FTP ライブラリを購入して使用しようとすると、そのパブリック インターフェイスが、単に単体テストのために知る必要のないメソッドでいっぱいになっている場合はどうなるでしょうか。単体テストを補うために保護されたインターフェイスを変更することさえ悪いことです。あるクラスから継承している場合、どのメソッドが自分にとって有用で、どのメソッドが単体テストのために存在するかについて心配する必要はありません!!! 単体テストにフレンド クラスを使用すると、シンプルで使いやすいクラス インターフェイスを維持できます。カプセル化と抽象化を維持するのに役立ちます!!!

テスト対象のクラスはそのテスト クラスと「密結合」してはならず、そのテスト クラスについて何も「認識」してはならないため、単体テストにフレンド クラスを使用するのは良くないという議論を聞いたことがあります。私はこれを買いません。これは、クラスの先頭に追加された 1 行です。

フレンド クラス MyClassTest;

これで、好きな方法でクラスをテストできます!

ここで、必要でない限り、フレンド クラスを使用しないことに同意します。友達にせずにテストが必要なものをテストできる場合は、ぜひ試してください。しかし、生活が困難になり、フレンド クラスを使用することで再び生活が楽になった場合は、それを使用してください。

于 2010-11-13T06:11:00.470 に答える
1

パブリックメンバーやフレンドクラスを介したアクセスを許可するのではなく、アクセサーを使用することをお勧めします。

友達のクラスを使うことは実際にあなたに利益をもたらすとは思いません、そしてそれはあなたの人生をずっと悪化させる可能性があります。コードが長期間存在する場合は、予期しない方法でコードが使用される可能性があります。アクセス機能は現在のテストにのみ使用される可能性がありますが、将来何が起こるか誰が知っていますか?変数への直接アクセスを提供するのではなくアクセサーを使用すると、柔軟性が大幅に向上し、コストが非常に低くなります。

もう1つの議論は、パブリックメンバーではなくアクセサーを使用するのが良い習慣であるということです。良い習慣を身につけることは、プログラマーとしての重要なスキルです。

于 2009-07-19T04:41:26.730 に答える
0

内部状態を「保護」してはどうですか?次に、派生クラスを使用して単体テストを実行します。

于 2009-07-19T08:00:10.743 に答える
0

意味がある場合にユーザーにアクセサーを提供することでクラスの将来性を保証することと、テスト容易性を改善することとを区別する必要があると思います。私はまた、テストだけを目的としてクラスを仲良くすることはあまり好きではありません。

アクセサーの唯一の用途が、テスト ケースがクラスの内部状態をチェックする方法を提供することである場合、それらを公開することは通常意味がありません。また、後で変更したい実装の詳細を結び付けることができますが、他の誰かが前述のアクセサーを使用しているために変更できないことがわかります。

これに対する私の好ましい解決策は、保護されたアクセサー関数を提供して、これらがパブリック インターフェイスの一部ではないことをクラスのユーザーに明確に伝えることです。次に、テストは、親の関数のコールスルー スタブを含むオリジナルの最小限の派生クラスを作成しますが、アクセサーもパブリックにするため、テスト ケースでそれらを使用できます。

于 2009-07-19T08:06:37.503 に答える