Unit-Test-Methoden, die Lieferanten-Webservices aufrufen

10

Ich habe eine Klasse mit einer öffentlichen Methode Send()und einigen privaten Methoden. Es ruft einige Webservices auf und verarbeitet die Antwort. Die Verarbeitung erfolgt in privaten Methoden.

Ich möchte den Code Unit-testen. Mein Verständnis ist, dass Unit-Tests meinen Code isoliert testen sollten (dh Lieferantenantworten nachahmen).

Ich glaube auch, dass private Methoden nicht Unit-getestet werden müssen. Wenn ich jedoch nur die Send () -Methode teste, wird mein Code nicht isoliert getestet und hängt von der Antwort des Lieferanten ab.

Sollte ich dann meine privaten Methoden veröffentlichen, damit ich sie mit Scheinantworten testen kann? Es scheint eine schlechte Praxis zu sein, da ich nur die Klasse brauchen sollte, um sie anzurufen.

Entschuldigung, wenn es eine grundlegende Frage ist, bin ich ziemlich neu in Unit-Tests.

Ich benutze c # und VS2010

Tom Squires
quelle
Wenn Sie eine private Methode nicht testen, woher wissen Sie, ob sie funktioniert?
Bryan Oakley
1
@BryanOakley Sie müssen nicht wissen, dass eine private Methode funktioniert, sie ist privat. Sie wissen, dass es funktioniert, weil die öffentlichen Methoden, die es aufrufen, ihre Tests bestehen.
StuperUser
@ Bryan Oakley werfen Sie einen Blick auf den Link
Tom Squires
Hallo Tom, ich habe den Link aktualisiert, um ihn bekannter zu machen und den Linktext sein Ziel widerspiegeln zu lassen. Bitte zögern Sie nicht, einen Rollback durchzuführen.
StuperUser

Antworten:

18

Sie sollten den Code für die Webdienste (dh das Senden und Empfangen von Daten) vom Code trennen, der die Ergebnisse verarbeitet. Verschieben Sie den letzteren Code in eine bestimmte Klasse, und veröffentlichen Sie die erforderlichen Methoden. Dann können Sie die Verarbeitungslogik einfach und isoliert von den externen Abhängigkeiten testen.

Auf diese Weise stellen Sie auch sicher, dass Ihr Code dem Prinzip der Einzelverantwortung entspricht . Als allgemeine Faustregel ist das Gefühl, private Methoden testen zu müssen, oft ein Hinweis darauf, dass die Klasse zu viele Verantwortlichkeiten hat und daher in mehrere Klassen umgestaltet werden sollte.

Péter Török
quelle
3

Ich denke, ein Test mit solchen Abhängigkeiten ( Aufruf von Lieferanten-Webservices ) ist eher ein Integrationstest als ein Komponententest.

OK
quelle
3

Wie bereits erwähnt, handelt es sich bei Ihren Komponententests, wenn sie externe Abhängigkeiten wie Webdienste oder Datenbankaufrufe aufweisen, NICHT um Komponententests, sondern um Integrationstests.

Echte Komponententests können unabhängig von externen Komponenten ausgeführt werden, abgesehen von der Komponente, die getestet werden soll, und sollten unabhängig von der Umgebung wiederholbar sein. Wenn die externen Webdienste ausfallen, sollte Ihr Komponententest nicht fehlschlagen.

Wir umgehen dies mithilfe eines Mocking Frameworks. Mock-Objekte ermöglichen es uns, ein Mock einer Komponente zu erstellen, sodass die Komponente in unserem Komponententest diese Mock-Objekte anstelle von echten verwendet. Wir können Scheinobjekte in die testbare Komponente einfügen und angeben, welche Argumente wir erwarten, was sie beim Aufruf zurückgeben sollen und welche Ausnahme sie auslösen sollen. Ich empfehle dringend, mehr zu diesem Thema zu lesen, da dies die Zuverlässigkeit und Unabhängigkeit Ihrer Komponententests verbessert.

Einen guten Beitrag zu verschiedenen C # -Mocking-Frameworks finden Sie im folgenden SO-Thread:

/programming/37359/what-c-mocking-framework-to-use

BEARBEITEN: Für die überempfindlichen Personen werde ich feststellen, dass ich es versäumt habe, DbUnit oder andere Transaktionswerkzeuge zu erwähnen, mit denen Datenbankänderungen am Ende des Tests rückgängig gemacht werden können. Diese sind auch wiederholbar und können mit generierten Testdaten umgebungsunabhängig sein, sodass in diesem Fall kein Mocking Framework erforderlich ist.

maple_shaft
quelle
Kann jemand die Ablehnung erklären? Ich habe nicht auf PHP, ROR, NoSQL-Datenbanken, Javascript auf dem Server, Apple-Produkten oder einem anderen fabelhaften Trend gerippt, aber ich habe trotzdem eine Drive-by-Downvote bekommen: S
maple_shaft
Ich denke, jemand mochte es nicht, wenn seine Unit-Tests "überhaupt keine Unit-Tests" genannt wurden (nicht ich) :)
Daniel B