単体テスト:テストされていないものをテストする方法

単体テストに関連する議論では、1つの大きな疑問が生じます。 「単体テスト用のテストを作成する必要がありますか。」 この質問に対する答えは、原則として、コードカバレッジテクノロジーです。 実際、単体テストが正しく準備されていることを確認したい場合は、コード内のすべてのブランチが呼び出されたかどうかを確認するだけです。 これは簡単な方法で実現されます-チェックされる関数の入力に、これらのブランチをバイパスできるデータのすべての組み合わせを送信する必要があります。 そして、ドキュメントの学術的な例はこれを示しています。



しかし、問題は実世界がより複雑であることです。 アプリケーション関数は、入力に適用されるだけでなく条件を考慮することができます。 この場合の対処方法



もう一度コードカバレッジについて。



商品を購入するコードを確認する必要があると想像してください。







単体テストを作成する場合、さまざまなパラメーターを使用してこの関数の呼び出しを提供する必要があることは明らかです。 この場合、itemID = 0およびItemID <> 0。 このオプションでは、すべてのコードブランチが呼び出され、このユニットテストのコードカバレッジ値は100%になります。







タスクを複雑にします



現実に近い、より複雑なコードの形式は次のとおりです。







この場合の対処方法 関数内では、CLR Date.Time呼び出しが使用され、この関数からデータを返すことには影響しません。 単体テストのロジックをどのように複雑にしようとしても、関数の動作は外部条件に依存します 。 すべてのコードブランチをチェックするために、1日2回、1日2回、スケジュールで単体テストを実行しますか?



もちろん、Visitorパターンを使用できます。 PurchaseItemメソッドでクラスを作成するとき、特定のIGetCurrentTimeインターフェイスを渡します。これは、プログラムの実行中に1つの実装を持ち、単体テストが呼び出されると置き換えられます。 したがって、 外部条件からの隔離を実現します 。 これは良いオプションであり、一般的にすべての人に推奨されています。 しかし、他のオプションはありますか?



ほくろで外の世界から隔離する



Visual Studio 2010には、Moleに素晴らしい追加機能があります。 これは、このような場合に役立ついわゆる分離フレームワークです。







Visual Studioを離れることなく、彼らが言うようにExtension Managerからインストールできます。 ここからその機能の研究を開始できますresearch.microsoft.com/en-us/projects/pex/documentation.aspx 、およびHabréには興味深い詳細な記事があります。



このアドオンの機能は十分に広く、アプリケーションの機能やその他の外部機能の「インターセプター」を作成できるようになっています。 この場合、プログラムのソースコードを変更する必要はありません。



DateTime.Nowのインターセプト



では、ユニットテストがDateTime.Nowの戻り値に依存しないようにするために、何をする必要がありますか?



最初のステップ-テストプロジェクトMoled Assemblyに追加-DateTime.Nowメソッドを含むMSCorLibアセンブリ用に特別に準備されたスタブ







2番目のステップは、DateTime.Nowメソッドを実際にインターセプトすることを宣言することです。







3番目のステップは、実際にユニットテストをやり直すことです。







いくつかの明確化:この単体テストで外部関数がインターセプトされることをMoles Runtimeサブシステムに示すために、HostType属性が必要です。 さらにコードでは、DateTime.Nowメソッドは実際にはラムダから取得する必要があることが示されています。 最初に、Molesがmscore用の特別なスタブを生成したことが指摘されました。 このスタブのタイプには、プレフィックスとサフィックスがあります。 たとえば、DateTime.Nowタイプの場合、スタブはシステムになります。 Moles.M DateTIme.Now Get 。 これらの単体テストを実行すると、現在の時間に関係なく、コードカバレッジ値は再び100%になります。



おわりに



もちろん、上記の例は非常に単純であり、Moleはより複雑なユースケースに対応できます。 このテクノロジーの実際のアプリケーションは、データベース呼び出し、ファイルシステム、複雑なハードウェア関連API、外部プロバイダーWebサービス、および他の多くのシナリオを分離するのに便利です。 それでも、この例は、最も複雑な関数に対してもユニットテストを作成できることを確認するのに役立ちます。



ところで、明日、Microsoft Quality Assurance Dayイベントwww.microsoft.com/ru-ru/events/msqadays/index.htmlがKrylatsky HillsのMicrosoftオフィスで開催され、ソフトウェア品質保証の問題が議論されます。 私のレポートでは、モルが言及され、これらのメカニズムがどのように機能するかを「ライブ」で示します。 この技術に興味がある場合は、放送を見ることを忘れないでください。



All Articles