2008-09-04 5 views
8

私は自分のコードを単体テストすることについてより良くしようとしていますが、今はリモートシステムを扱う多くのコードを書いています。 SNMP、WMIのようなものです。ほとんどのクラスでは、私はそれらをテストするためにオブジェクトをモックアップすることができますが、実際のシステムを単体テストする方法をどのように扱いますか?たとえば、私のクラスが外に出て、サーバーのWin32_LogicalDiskオブジェクトを取得した場合、どうすれば単体テストをテストできますか?あなたは「どのように私はあざけることは不可能/困難なものに対してテストします」意味と仮定すると、ネットワーク依存コードによるユニットテスト

答えて

5

あなたは「出て行き、サーバ用のWin32_LogicalDiskオブジェクトを取得します」と、何か他のものを(ないことクラスを持っている場合'Win32_LogicalDisk'オブジェクトを何らかの方法で消費します)、このオブジェクトを使用するクラスの部分をテストすると仮定すると、Dependency Injectionを使用して 'Win32_LogicalDisk'オブジェクトをモックできます。例えば:

class LogicalDiskConsumer(object): 

    def __init__(self, arg1, arg2, LogicalDiskFactory) 
     self.arg1=arg1 
     self.arg2=arg2 
     self.LogicalDisk=LogicalDiskFactory() 

    def consumedisk(self): 
     self.LogicalDisk.someaction() 

次に、あなたのユニットテストコードでは、「のWin32_LogicalDisk」のモックオブジェクトを返す「LogicalDiskFactory」に渡します。

1

おそらく適切な遅延の後に、コアライブラリルーチンを置き換えて既知の値を返す一連の「テストスタブ」を作成することができます。

たとえば、私は最近、サードパーティ製の製品で実行するコードを開発する必要がありました。課題は、私たちの "パートナー"がベースコードとのコンパイルと統合を行うことでした。私はには許可されませんでしたのコードを見てください。私の戦略は、私がと思ったのは、エンジニアの情報に基づいて、のコードが行った非常に単純なエミュレータを構築することでした。私たちは、エミュレータのさまざまな部分を各ビルドの内外に簡単に切り替えるための言語を使用しました。そのため、パートナーに新しい各繰り返しを組み立てる前に、膨大なテストを行うことができました。

私は同じ特定の製品のソフトウェアの問題が次の最も信頼性の高い製品よりも一桁小さいため、同じ方法を再度使用したいと思います。

2

モックが難しいものをテストする最も簡単な方法は、コード(テストに値するロジック)が1か所にあり、コードが使用する他のものが別のモジュールにあるようにコードをリファクタリングすることです)。このモジュールは簡単にモックでき、ビジネスロジックに集中できます。

関連する問題