4

C# クラスのプライベート関数の単体テストはどこに配置しますか?

ウィキペディアの記事では、次のように提案されています。

  • テストしているメンバーと同じクラスにテストを配置する
  • 部分クラスの使用

個人的には、これらの方法はどちらも適切とは思えず、単体テストを完全に別のプロジェクトに配置することを好みます。

これについて何か考えはありますか?

(private メソッドをテストする必要があるかどうかについて、かなりの量の議論があることは知っています。議論の両方の側面を聞きたいです。)

4

8 に答える 8

14

プライベート メソッドは、必ずしも直接テストする必要はありません。これらのプライベート メソッドを利用するパブリック メソッドのテストに基づいて、それらの有効性を判断できます。

ただし、テストを容易にし、すべての合理的なシナリオをシミュレートするために、パブリック メソッドがモックの依存関係をプライベート メソッドに簡単に挿入できるように注意する必要があります。

編集:他のテストを配置する場所については、プロジェクト内に別のサブディレクトリを作成してテストを処理することをお勧めします。PHP アプリケーションのテストを作成するとき、プロジェクトのルートにtestsディレクトリがあり、そのディレクトリ構造は実際のアプリケーション ディレクトリ構造と同じです。その中に、実際のクラスごとにテスト クラスがあります。

プロダクションにリリースするときに、プロジェクトの残りの部分でテスト クラスをコンパイルしないでください (または、PHP のようなインタープリター型言語の場合は、テスト クラスをプロダクション Web サーバーにデプロイしないでください)。

于 2010-01-09T17:51:21.573 に答える
9

プライベート メソッドを単体テストしないでください。単体テストは、クラスの可視 (パブリックで保護されている) インターフェイスをテストするためのものです。プライベート メソッドは実装の詳細であり、それらの単体テストを記述する必要はなく (それらの動作は、可視メソッドのテストによって暗黙的にテストする必要があります)、脆弱なテストにつながり (実装の詳細が変更される可能性があるため)、リファクタリングの障壁になります。

単体テストが必要だと思われるプライベート メソッドがある場合、それはおそらく別のクラスのパブリック メソッドに分解する必要があるという大きなヒントです。

C# クラスのプライベート関数の単体テストはどこに配置しますか?

どこにもない。それらは存在しません。

通常、私の単体テストは別のプロジェクトにあります。

于 2010-01-09T17:53:50.110 に答える
9

個人的には、別のプロジェクトで単体テストを行うことも好きです。プライベート メソッドを単体テストする場合は、代わりにプライベート メソッドを内部にすることができます。次に、AssemblyInfo.cs に以下を追加することで、内部メソッドを単体テストに表示して直接呼び出すことができます。

[assembly: InternalsVisibleTo("MyAssembly.UnitTests")]
于 2010-01-09T17:59:21.037 に答える
3

自分に合った方法を実行する必要があります。これが私にとってうまくいくものです:

私のユニットはクラスです:それが私がテストしようとしているものです。メソッドではありません。私はオブジェクト指向プログラミングをしようとしているので、オブジェクトに注意を向けています。

プライベート メソッドをテストしたくなったら、リファクタリングする必要があります。プライベート メソッドを直接テストしたいのは、プライベート メソッドとテストの間に他のコードが多すぎるためであり、プライベート メソッド自体が複雑であり、テストに注意を払う必要があるためです。そのため、通常はクラスを抽出して、そのプライベート メソッドとその他の関連メンバーを新しいクラスにプルします。

私のクラスはかなり小さい傾向があります。それらは読みやすく、理解しやすいです。もちろん、私のメソッドも非常に小さく、理解しやすいものです。

この働き方への移行を行うには、プログラミングに関する私の仮定や習慣の多くを再考する必要がありました。かつて過激に見えたことが、今では当たり前のように思えます。

于 2010-01-09T18:20:12.000 に答える
2

一般に、パブリック インターフェイスのみをテストする必要があるため、プライベート メソッドをテストするべきではないことに同意します。

そうは言っても、プライベート メソッドをテストする理由は次のとおりです。

  1. TDD を使用しており、複雑なプライベート メソッドを開発する必要があります。プライベート メソッドのテスト メソッドの作成は、書き込みテスト - コード作成 - テスト サイクルを適切な粒度で維持するために必要になる場合があります。

  2. あなたは、他の人がプライベート メソッドを変更する必要があるチームの一員であり、変更によって問題が発生しないことを確認するテストが必要な場合があります。

いくつかの解決策:

  1. プライベート メソッドにデリゲートし、テスト目的でのみ使用されるパブリック メソッドをいくつか宣言します。これらには、TestFoo1、TestFoo2 などの接頭辞を付けることができます。

  2. 内部使用

http://msdn.microsoft.com/en-us/library/7c5ka91b(VS.80).aspx

于 2010-01-09T18:00:28.443 に答える
1

質問のタイトルと最初の文が異なります。:)

テストをどこに配置すればよいかわかりません。それは言語に依存し、C# は私がよく知っているものではありませんが、コードのかなりの部分がプライベート メソッド内にあると思います。それがテストされていない場合、私は不快に感じるでしょう。コードカバレッジはかなり低下します。

于 2010-01-09T17:53:36.337 に答える
1

はいぜったいに。いずれにせよ、プライベート メソッドはテストする必要があります。およびmbunit 単体テスト フレームワークはプライベート メンバーにアクセスできます。

このブログを参照してください: プライベート メソッドのテスト

于 2010-01-09T17:53:40.020 に答える
1

Visual Studio でプライベート アクセサーを使用して、プライベート メソッドをテストします。これは、テスト クラスが別のプロジェクトに存在できることを意味します。

ただし、次の理由により、これらの数を実際に制限しようとしています。

  • スタンドアロンできるプライベート メソッドは、別のクラスのパブリック メソッドとして引き出すことができます
  • クラス外で特に有用なことを行わないプライベート メソッドは、そのクラスのパブリック メソッドを通じてテストできます。
于 2010-01-09T17:54:30.393 に答える