サプライヤーのWebサービスを呼び出す単体テスト方法


10

1つのパブリックメソッドSend()といくつかのプライベートメソッドを持つクラスがあります。いくつかのWebサービスを呼び出し、応答を処理します。処理はプライベートメソッドで行われます。

コードを単体テストしたい。私の理解では、単体テストではコードを分離してテストする必要があります(つまり、サプライヤーの応答をモックアップします)。

また、プライベートメソッドを単体テストする必要はないと考えていますが、Send()メソッドをテストするだけでは、コードは分離してテストされておらず、サプライヤの反応に依存しています。

その後、モック応答でテストできるように、プライベートメソッドを公開する必要がありますか?私はクラスだけがそれらを呼び出す必要があるので、それは悪い習慣のようです。

基本的な質問であれば、申し訳ありませんが、単体テストはかなり新しいものです。

私はc#とVS2010を使用しています


プライベートメソッドをテストしない場合、それが機能するかどうかはどのようにしてわかりますか?
ブライアンオークリー

1
@BryanOakleyあなたはプライベートメソッドが機能することを知る必要はありません、それはプライベートです。これが機能するのは、それを呼び出すパブリックメソッドがテストに合格したためです。
StuperUser 2011

@ブライアンオークリーはリンクを見てください
トム・スクワイアーズ

こんにちはトム、リンクをより目立つように更新し、リンクテキストにターゲットを反映させました。遠慮なくロールバックしてください。
StuperUser、2011

回答:


18

Webサービスを処理するコード(データの送受信など)を、結果を処理するコードから分離する必要があります。後者のコードを別個のクラスに移動し、必要なメソッドをパブリックにします。その後、外部依存関係から切り離して、処理ロジックを簡単に単体テストできます。

これにより、コードを単一責任の原則に準拠させることもできます。一般的な経験則として、プライベートメソッドをテストする必要性を感じることは、多くの場合、クラスの責任が多すぎることを示しているため、複数のクラスにリファクタリングする必要があります。


3

このような依存関係のあるテスト(サプライヤーのWebサービスを呼び出す)は、単体テストではなく統合テストだと思います。


3

他の人が述べたように、単体テストにWebサービスやデータベース呼び出しなどの外部依存関係がある場合、それらはまったく単体テストではなく、統合テストです。

真の単体テストは、テスト対象のコンポーネント以外の外部コンポーネントから独立して実行でき、環境に関係なく繰り返し可能でなければなりません。外部のWebサービスが停止しても、単体テストは失敗しないはずです。

モッキングフレームワークを使用してこれを回避します。モックオブジェクトを使用すると、コンポーネントのモックを作成して、単体テストのコンポーネントで実際のモックオブジェクトの代わりにこれらのモックオブジェクトを使用できます。テスト可能なコンポーネントにモックオブジェクトを挿入し、どの引数を期待するか、それが呼び出されたときに何を返すか、どのような例外をスローするかを指定できます。ユニットテストの信頼性と独立性が向上するため、この件について詳しく読むことを強くお勧めします。

さまざまなC#モックフレームワークに関する良い投稿については、次のSOスレッドを参照してください。

/programming/37359/what-c​​-mocking-framework-to-use

編集: 非常に敏感なため、テストの最後にデータベースの変更をロールバックできるDbUnitまたは他のトランザクションツールについて言及することを怠ったことを私は所有します。これらは繰り返し可能であり、生成されたテストデータで環境に依存しない場合があるため、この場合はモッキングフレームワークは必要ありません。


誰かが反対票を説明できますか?私はPHP、ROR、のNoSQLデータベース、Javascriptのサーバー上の、Apple製品やその他のファブ傾向にリッピングしていない、まだ私はまだドライブバイdownvoteとにかくました:S
maple_shaftを

ユニットテストが「ユニットテストではない」と呼ばれるのが嫌だったと思います(私ではありませんでした):)
Daniel B
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.