2008-09-04 8 views
8

Ich versuche, meinen Code besser zu testen, aber momentan schreibe ich viel Code, der sich mit entfernten Systemen beschäftigt. SNMP, WMI, so etwas. Mit den meisten Klassen kann ich Objekte nachbilden, um sie zu testen, aber wie gehst du damit um, ein echtes System zu testen? Wenn meine Klasse beispielsweise das Objekt "Win32_LogicalDisk" für einen Server abruft, wie kann ich es möglicherweise in der Unit testen?Komponententest mit netzwerkorientiertem Code

Antwort

5

Angenommen, Sie bedeuten „Wie teste ich gegen Dinge, die schwer/unmöglich zu verspotten“:

Wenn Sie eine Klasse, die „erlischt und erhält das Win32_LogicalDisk Objekt für einen Server“ und tut etwas anderes (verwendet das 'Win32_LogicalDisk'-Objekt in irgendeiner Weise. Wenn Sie die Teile der Klasse, die dieses Objekt verwenden, testen möchten, können Sie Dependency Injection verwenden, damit Sie das' Win32_LogicalDisk'-Objekt nachahmen können. Zum Beispiel:

class LogicalDiskConsumer(object): 

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

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

Dann in Ihrem Unit-Test-Code, übergeben Sie in einem 'LogicalDiskFactory', die ein Mock-Objekt für die 'Win32_LogicalDisk' zurückgibt.

1

Sie könnten eine Reihe von "Test-Stubs" erstellen, die die Kernbibliotheksroutinen ersetzen und bekannte Werte zurückgeben, möglicherweise nach geeigneten Verzögerungen.

Als Beispiel musste ich vor kurzem Code entwickeln, um in einem Produkt eines Drittanbieters zu laufen. Die Herausforderung bestand darin, dass unser "Partner" das Kompilieren und die Integration mit ihrem Basiscode durchführen würde: Ich durfte nicht betrachten ihren Code in irgendeiner Form! Meine Strategie war, einen sehr einfachen Emulator zu bauen, der tat, was ich auf Basis von Informationen von ihren Ingenieuren dachte. Wir verwendeten eine Sprache, die es einfach machte, verschiedene Teile des Emulators in jeden Build zu wechseln. Daher konnte ich eine Menge Tests durchführen, bevor wir unseren Partner an der Erstellung jeder neuen Iteration beteiligten.

Ich würde die gleiche Methode wieder verwenden, da Softwareprobleme in diesem bestimmten Produkt etwa eine Größenordnung weniger als in unserem nächsten zuverlässigsten Produkt sind!

2

Der einfachste Weg, Dinge zu testen, die schwer zu verspotten sind, besteht darin, den Code so zu refactorisieren, dass der Code (Logik, die getestet werden muss) an einem Ort ist und andere Dinge, die der Code verwendet, in einem separaten Modul sind). Das Modul ist leicht nachzuahmen und Sie können sich auf Ihre Geschäftslogik konzentrieren.