Sollte mein Unit-Test beim Testen eines Wrappers für dieses API direkt eine API berühren?

8

Ich habe einige Unit-Tests geschrieben, die einen Wrapper um eine FTP-Server-API testen.

Sowohl die Komponententests als auch der FTP-Server befinden sich auf demselben Computer.

Die Wrapper-API wird auf unserer Plattform bereitgestellt und sowohl in Remoting- als auch in Web-Service-Szenarien verwendet. Die Wrapper-API nimmt im Wesentlichen XML-Nachrichten, um Aufgaben wie das Hinzufügen / Löschen / Aktualisieren von Benutzern, das Ändern von Kennwörtern, das Ändern von Berechtigungen usw. auszuführen.

Wenn Sie in einem Komponententest einen Benutzer zu einer virtuellen Domäne hinzufügen, erstelle ich die XML-Nachricht, die an die API gesendet werden soll. Die API funktioniert und gibt eine Antwort mit Statusinformationen darüber aus, ob die Operation erfolgreich war oder fehlgeschlagen ist (Fehlercodes, Validierungsfehler usw.).

Um zu überprüfen, ob der API-Wrapper-Code wirklich das Richtige getan hat (falls die Antwort erfolgreich war), rufe ich die COM-API des FTP-Servers auf und frage direkt nach seinem Speicher, um beispielsweise beim Erstellen eines Benutzerkontos den Benutzer zu ermitteln Konto wurde wirklich erstellt.

Riecht das schlecht?

Update 1: @ Jeremy / Nick: Der Wrapper steht im Mittelpunkt des Tests, der FTP-Server und seine COM-API sind Produkte von Drittanbietern, vermutlich gut getestet und stabil. Die Wrapper-API muss die XML-Nachricht analysieren und anschließend die API des FTP-Servers aufrufen. Wie würde ich überprüfen, und dies kann ein dummer Fall sein, dass eine bestimmte Eigenschaft des Benutzerkontos vom Wrapper korrekt festgelegt ist. Zum Beispiel das Setzen der falschen Eigenschaft oder des falschen Attributs eines FTP-Accounts aufgrund eines Tippfehlers im Wrapper-Code. Ein gutes Beispiel hierfür sind die Geschwindigkeitsbegrenzungen für Upload und Download, die im Wrapper-Code umgesetzt werden können.

Update 2: danke allen für die Antworten. Den Leuten, die vorgeschlagen hatten, Mocks zu benutzen, war es mir in den Sinn gekommen, aber das Licht ist noch nicht eingeschaltet und ich kämpfe immer noch darum, meinen Wrapper mit einem Pseudo des FTP-Servers zu arbeiten . Wo befinden sich die Mocks und übergebe ich eine Instanz dieser Mocks an die Wrapper-API, die anstelle des Aufrufs der COM-API verwendet werden soll? Ich bin mir bewusst, dass ich spottete, aber darum kämpfte, mich darum zu kümmern, hauptsächlich weil ich finde, dass die meisten Beispiele und Tutorials so abstrakt sind und (ich schäme mich zu sagen) am Unbegreiflichen grenzt.

    
Kev 17.10.2008, 20:02
quelle

8 Antworten

7

Sie scheinen Mischeinheit & amp; Komponentenprüfung Probleme.

  • Wenn Sie den Wrapper in der Unit testen, sollten Sie einen falschen FTP-Server verwenden und nicht den eigentlichen Server einbeziehen. Die Plus-Seite ist, dass Sie in der Regel eine 100% ige Automatisierung erreichen können.
  • Wenn Sie die gesamte Komponente testen (der Wrapper + FTP-Server arbeitet zusammen), versuchen Sie, Ihre Ergebnisse auf derselben Ebene wie Ihre Tests zu überprüfen, z. B. mithilfe Ihrer Wrapper-API. Wenn Sie beispielsweise einen Befehl zum Hochladen einer Datei ausgeben, geben Sie als Nächstes einen Befehl zum Löschen / Herunterladen dieser Datei aus, um sicherzustellen, dass die Datei korrekt hochgeladen wurde. Bei komplexeren Vorgängen, bei denen es nicht trivial ist, das Ergebnis zu testen, sollten Sie die COM-API "Hintertür", die Sie erwähnt haben, oder eine manuelle Überprüfung verwenden (müssen alle Tests automatisiert werden?).
Ates Goral 17.10.2008, 20:23
quelle
3
  

Um zu überprüfen, ob der API-Wrapper-Code tatsächlich das Richtige getan hat (wenn die Antwort erfolgreich war), rufe ich die COM-API des FTP-Servers auf

Haltet genau dort. Sie sollten sich über den FTP-Server lustig machen und der Wrapper sollte gegen den Schein funktionieren.

Wenn Ihr Test sowohl den Wrapper als auch den FTP-Server ausführt, handelt es sich nicht um Unit Testing.

    
Amy B 17.10.2008 20:27
quelle
3

Um Ihren Wrapper mit einem Mock-Objekt zu testen, können Sie Folgendes tun:

  • Schreiben Sie ein COM-Objekt mit derselben Schnittstelle wie die COM-API des FTP-Servers. Dies wird dein Mock-Objekt sein. Sie sollten in der Lage sein, den echten FTP-Server und Ihr Mock-Objekt auszutauschen, indem Sie den Interface-Zeiger entweder an Ihren Wrapper übergeben, indem Sie die Abhängigkeit injizieren.
  • Ihr Mock-Objekt sollte fest codiertes Verhalten basierend auf den Methoden implementieren, die auf seiner Schnittstelle aufgerufen werden (die die FTP-Server-API nachahmt) und auch auf der Grundlage der verwendeten Argumentwerte:
  • Wenn Sie zum Beispiel eine Methode UploadFile haben, können Sie blind ein Erfolgsergebnis zurückgeben und vielleicht den Dateinamen speichern, der in einem Array von Strings übergeben wurde.
  • Sie könnten einen Upload-Fehler simulieren, wenn Sie auf einen Dateinamen mit "error" stoßen.
  • Sie können Latenz / Timeout simulieren, wenn Sie auf einen Dateinamen mit "langsam" stoßen.
  • Später könnte die Methode DownloadFile das interne String-Array überprüfen, um zu sehen, ob eine Datei mit diesem Namen bereits "hochgeladen" wurde.

Der Pseudocode für einige Testfälle wäre:

%Vor%

Ich hoffe, das hilft ...

    
Ates Goral 19.10.2008 03:35
quelle
2

Ich stimme Nick und Jeremy zu, die API nicht zu berühren. Ich würde mich über die API lustig machen.

Ссылка

Wenn es .NET ist, können Sie verwenden:
Moq: Ссылка

Und eine Reihe anderer höhnischer Bibliotheken.

    
Chris Roland 17.10.2008 20:13
quelle
0

Was testen Sie den Wrapper oder die API? Die API sollte so funktionieren, wie sie ist, also müssen Sie sie nicht testen, denke ich. Konzentriere deine Testbemühungen auf den Wrapper und tue so, als ob die API nicht existiere. Wenn ich eine Klasse schreibe, die Dateizugriffe durchführt, teste ich nicht den Build in Streamreader ... Ich konzentriere mich auf meinen Code.

    
Nick 17.10.2008 20:05
quelle
0

Ich würde sagen, Ihre API sollte beim Testen wie eine Datenbank oder eine Netzwerkverbindung behandelt werden. Teste es nicht, es ist nicht unter deiner Kontrolle.

    
Jeremy B. 17.10.2008 20:08
quelle
0

Es hört sich nicht so an, als würden Sie fragen: "Soll ich die API testen?" - Sie fragen "Soll ich die API verwenden, um zu überprüfen, ob mein Wrapper das Richtige tut?"

Ich sage ja. Ihre Komponententests sollten bestätigen, dass Ihr Wrapper die von der API gemeldeten Informationen weitergibt. In dem Beispiel, das Sie beispielsweise angeben, weiß ich nicht, wie Sie die API nicht berühren würden. Also ich denke nicht, dass es schlecht riecht.

    
savetheclocktower 17.10.2008 20:20
quelle
0

Ich kann mir nur vorstellen, wann es sinnvoll ist, in die API der unteren Ebene einzutauchen, um die Ergebnisse zu überprüfen, wenn die übergeordnete API schreibgeschützt ist. Wenn Sie beispielsweise einen Benutzer mithilfe der übergeordneten API erstellen können, sollte auch eine API auf hoher Ebene vorhanden sein, um auch die Benutzerkonten abzurufen. Benutze das.

Andere Leute haben vorgeschlagen, die untergeordnete API zu verspotten. Das ist gut, wenn du es kannst. Wenn die untergeordnete Komponente verspottet wird, sollten die Mocks überprüft werden, um sicherzustellen, dass der richtige Zustand eingestellt ist. OK.

    
Mark Bessey 17.10.2008 21:07
quelle

Tags und Links