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
quelle
Antworten:
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.
quelle
Ich denke, ein Test mit solchen Abhängigkeiten ( Aufruf von Lieferanten-Webservices ) ist eher ein Integrationstest als ein Komponententest.
quelle
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.
quelle