私は自分のコードの単体テストをより良くしようとしていますが、今はリモートシステムを扱う多くのコードを書いています。SNMP、WMI、そのようなもの。ほとんどのクラスでは、オブジェクトをモックアップしてテストできますが、実際のシステムの単体テストをどのように処理しますか?たとえば、クラスが終了してサーバーのWin32_LogicalDiskオブジェクトを取得した場合、どうすればそれを単体テストできますか?
3 に答える
「モックするのが難しい/不可能なものに対してどのようにテストするか」という意味だと仮定します。
「サーバーのWin32_LogicalDiskオブジェクトを取得して取得する」クラスがあり、このオブジェクトを消費するクラスの一部をテストする場合は、他のことを実行します(「Win32_LogicalDisk」オブジェクトを何らかの方法で消費します)。依存性注入を使用して、「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 つの場所にあり、コードが使用する他のものは別のモジュールにあるようにコードをリファクタリングすることです。このモジュールは簡単にモックできるため、ビジネス ロジックに集中できます。
おそらく適切な遅延の後、コア ライブラリ ルーチンを置き換えて既知の値を返す一連の「テスト スタブ」を作成することができます。
たとえば、最近、サードパーティ製品内で実行するコードを開発する必要がありました。課題は、私たちの「パートナー」がコンパイルと基本コードの統合を行うことでした。私は彼らのコードをいかなる形でも見ることを許されませんでした! 私の戦略は、彼らのエンジニアからの情報に基づいて、彼らのコードが行うと私が思っていたことを実行する非常に単純なエミュレーターを構築することでした。各ビルドでエミュレーターのさまざまな部分を簡単に切り替えることができる言語を使用したため、パートナーに新しいイテレーションをビルドする前に膨大な量のテストを行うことができました。
その特定の製品のソフトウェアの問題は、次に信頼性の高い製品よりも桁違いに少ないため、同じ方法をもう一度使用します。