通常、ユニットテストの属性にパブリックメソッドが必要なのはなぜですか?


12

最近、.NETアセンブリの保護されたメソッドに[TestInitialize]を追加することは考慮されていませんが、メソッドをパブリックにすると、ユニットテストランナー(この場合はResharper)によって呼び出されました。過去に何度かテスト方法でこれに気づきました。

技術的に言えば、パブリックメソッドと同様にプライベートメソッドについても簡単に反映できます。実際のところ、リフレクションはプライベートメソッドの単体テストに使用される方法です。

では、なぜユニットテストメソッドをすべて公開する必要があるのですか?


2
それは本当に良い質問です。私が聞いた唯一の良い議論は、SOLID原則の一部である「実装ではなく、インターフェイスへのプログラム」という原則に従うということです。
ロバートハーヴェイ

9
彼はクラスのテストについて話しているのではなく、テストフレームワークによって呼び出される実際のテストメソッドについて話しているとは思いません。
jtiger

1
Javaの@RobertHarvey、同様の制限(JUnitなど)の理由は、フレームワーク設計者がsetAccessible、カスタムSecurityManagerによってブロックされる可能性のある
gnat

1
この設計上の決定は、幅広い用途を対象とした汎用フレームワークのために行われたことを考慮する必要があります。そのような場合、設計者が最悪の事態を想定して準備する方が安全です。会社の内部フレームワーク(目的のセキュリティポリシーを保証する機会がある場合)、または狭い特殊な目的のツール(「アクセスできないメンバーのビューアー」など)である場合、デザイナー考慮すべき他のオプションがあります
-gnat

2
@GregBurghardtこの動作はNunitで見られ、おそらくMicrosoftが書いていない他のテストフレームワークです。この質問をしてから数年で、.NETについてもっとよく理解できましたが、それでも公正な質問だと思います。コメントには良い議論があります。
ジャスティンディアリング

回答:


2

あなたはクラスが何をテストする必要がありませんではない、どのようにそれはそれをしません。

「外の世界」に関する限り、それはクラスがパブリックに利用可能にするものです。テストフレームワークは同じ仮定をしています。

Publicよりも「少ない」ものをテストすることにより、クラスの内部実装を掘り下げます。これは悪い考えです。


問題はテストメソッドに関するものであり、テスト対象のシステムのメソッドではないことに注意してください。OPがリフレクションを使用してパブリックよりも「少ない」ものをテストできると主張しているのは事実ですが、プライベートメソッドにアクセスするテストフレームワークの能力についての議論です。テストフレームワークは、リフレクションを使用して(属性でマークされた)テストメソッドを見つける必要があるため、リフレクションを使用する必要があります。そのため、「すべてのユニットテストメソッドをパブリックにする必要があるのはなぜですか?」
-Theraot

テストメソッドには、プライベートメソッドにアクセスする機能があります。リフレクションでは、何でも可能です。私は、そうすることの[不]望ましさについて、この質問をもっと見ます。
フィルW.

0

一般的なルールとして、パブリックメソッドにのみアクセスするのが最善です-クラスを作成するとき、コードにアクセスする他のクラスに関するコントラクトも作成します。したがって、答えは、それが慣習だからという理由である可能性が高いです。


1
これは本当に質問に答えません。
ラバーダック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.