Friend Classを使用して、C ++でユニットテストにアクセサを追加しますか?

StackOverflow https://stackoverflow.com/questions/1149244

  •  18-09-2019
  •  | 
  •  

質問

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

役に立ちましたか?

解決

単位テストでは、95%の時間のみがクラスの公開されている表面をテストするだけです。カバーの下で何かをテストしている場合、実装の詳細をテストしています。これは、実装を簡単に変更してテストを機能させることができるはずであるため、本質的に脆弱です。それは壊れやすいだけでなく、計画された使用シナリオでは実際に不可能なものをテストするように誘惑される可能性があります。これは時間の無駄です。

追加するアクセサのポイントが、関数が望ましい効果を持っているかどうかをテストするためだけに、クラスの設計が別の原則に違反する可能性がある場合、つまり、マシンのようなクラスは常にそれを明確にする必要があるということです。それが人々がクラスと相互作用したときに起こることに影響する場合。その場合、それらの読み取り専用アクセサーを提供するのは正しいでしょう。クラスの動作に影響しない場合は、実装の詳細についての以前のビットを参照してください。

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

もし私が 持っていました あなたのケースでアクセサーと友達の間を選ぶために、私は単に友達を選ぶでしょう。 あなた テストを所有し、ピンチで変更できます。余分なアクセサを使用する方法を見つけたピエロのコードを所有していない場合があります。そうすれば、立ち往生します。

他のヒント

私は受け入れられた答えに反対し、代わりに友人クラスの使用を推奨します。

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

一般的に、メンバー変数への直接アクセスよりもアクセサの関数を好むことを推奨することに強く同意しますが、このベストプラクティスが実装依存の内部状態の単位テストに適用されることに同意しません。合理的な中間点は使用することです プライベート アクセサの機能は、ユニットテストが気にし、ユニットテストでアクセサの機能を使用するのに十分な規律を整えます。ただ私の意見。

ユニットテストに友人クラスを使用することは完全に合法であり、カプセル化を維持できます。クラスをよりテストしやすくするために、クラスのパブリックインターフェイスを変更しないでください。このように考えてください。サードパーティのFTPライブラリを購入し、それを使用しようとしていて、パブリックインターフェイスが単純に単純なテストのために知る必要さえない多くの方法で乱雑になっている場合はどうなりますか!ユニットテストを補うために保護されたインターフェイスを変更することでさえ悪いことです。クラスから継承している場合、どの方法が自分にとって役立つか、どの方法がユニットテストのためにそこにあるかを心配する必要はありません!!!ユニットテストに友達クラスを使用すると、シンプルで使いやすいクラスインターフェイスを維持することができます。カプセル化と抽象化を維持するのに役立ちます!!!

テスト中のクラスをテストクラスと「しっかりと結合」すべきではなく、テストクラスについて何も知るべきではないため、ユニットテストに友人クラスを使用することは悪いという議論を聞いたことがあります。私はこれを買いません。クラスの上部に追加された単一の行です:

友人クラスMyClasStest;

そして今、あなたはあなたが望む方法であなたのクラスをテストすることができます!

今、私はあなたが必要でない限り、あなたが友達のクラスを使うべきではないことに同意します。友達にならずにテストが必要なものをテストできる場合は、必ずできます。しかし、人生が困難になり、友人のクラスを使用することが再び人生を簡単にするなら、それを使用してください!

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

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

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

内部状態を「保護」するのはどうですか?そして、派生クラスを使用して無適応を行います。

それが理にかなっている場合は、ユーザーにアクセサを提供することにより、クラスを将来的に防ぐことと、テスト能力の向上との間には区別が必要だと思います。また、テストの唯一の目的のためにクラスに参加することの大ファンでもありません。

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

これに対する私の好みの解決策は、提供することです 保護されています アクセサーは、これらがパブリックインターフェイスの一部ではないことをクラスのユーザーに明確に通信するように機能します。テストは、親の機能のコールスルースタブを含むが、テストケースでそれらを利用できるようにアクセサを公開するようにするオリジナルの最小限のクラスを作成します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top