Ist die Verwendung von Dependency Injection (DI) für Unit-Tests unerlässlich?
Ich kann mir keine andere Alternative zum Isolieren von Code vorstellen, damit dieser getestet werden kann. Auch alle Beispiele, die ich je gesehen habe, verwenden dieses Muster. Liegt das daran, dass dies die einzig gangbare Option ist, oder gibt es andere Alternativen?
design-patterns
unit-testing
Tom Squires
quelle
quelle
Antworten:
DI erleichtert das Testen von Einheiten erheblich. Sie können jedoch weiterhin Komponententests ohne DI schreiben. Viele Unit-Tests wurden bereits geschrieben, bevor sich DI verbreitete. (Natürlich sind einige dieser verwendeten Techniken identisch oder sehr ähnlich zu DI, ohne zu wissen, dass sie einen ausgefallenen Namen haben :-)
Ich selbst habe zB Schnittstellen und Fabriken viel benutzt, bevor ich etwas über DI gelernt habe. Der tatsächliche Name der Factory-Klasse wurde möglicherweise aus einer Konfigurationsdatei gelesen oder als Argument an das SUT übergeben.
Ein anderer Ansatz ist die Verwendung von Singletons (oder allgemein global zugänglichen Daten). Ja, ich weiß, dass es von vielen (einschließlich mir selbst) im Allgemeinen nicht empfohlen wird. Dennoch kann es in bestimmten Situationen sinnvoll sein, insbesondere wenn der Singleton statische Konfigurationsdaten enthält, die nicht testfallspezifisch sind, sich jedoch zwischen Produktions- und Testumgebung unterscheiden. Natürlich hat es seine bekannten Probleme, also ist DI überlegen, wenn Sie es verwenden können. Aber oft (z. B. in Legacy-Systemen) können Sie nicht.
Apropos: Effektiv mit Legacy-Code arbeiten beschreibt viele Tricks, um Legacy-Code in Tests zu erfassen. Viele davon sind nicht nett und nicht als langfristige Lösung gedacht. Sie ermöglichen es Ihnen jedoch, die ersten wertvollen Komponententests für ein ansonsten nicht testbares System zu erstellen. So können Sie mit dem Refactoring beginnen und schließlich (unter anderem) DI einführen.
quelle
Die Entkopplung ist für Unit-Tests unerlässlich. DI ist ein guter Weg, um eine Entkopplung zu erreichen.
quelle
Abhängig von den von Ihnen verwendeten Technologien können Sie Abhängigkeiten ohne DI isolieren. In der .NET-Welt können Sie mit Moles beispielsweise Abhängigkeiten ohne das DI-Muster isolieren.
Ich glaube jedoch, dass diese Isolations-Frameworks für Situationen in Ihrem Code mit externen Abhängigkeiten (Dateisystem, Datenbank usw.) geschrieben und vorgesehen sind. Das heißt, die Tatsache, dass man das kann, bedeutet nicht, dass er oder sie es sollte.
Die Abhängigkeitsinjektion ermöglicht das Testen von Einheiten, ermöglicht jedoch auch das Ändern des Verhaltens eines Objekts, ohne den Code dieses Objekts zu ändern (offenes / geschlossenes Prinzip). Es entsteht also nicht nur testbarer Code, sondern flexibler Code. Ich habe im Allgemeinen festgestellt, dass es eine starke Korrelation zwischen wartbarem / flexiblem Code und testbarem Code gibt.
quelle
Nein, DI ist für Unit-Tests nicht unbedingt erforderlich, hilft aber sehr.
Sie können Fabriken oder Locators verwenden und wie mit DI testen (nur nicht so elegant und erfordern mehr Setup).
Auch Mock Objekte wären wichtig , in Legacy - Systemen , in denen viele Anrufe an Funktionen übertragen werden anstelle von Abhängigkeiten. (Mock Objects können auch ausgiebig in einem ordnungsgemäßen Setup verwendet werden.)
Es kann Setups geben, bei denen das Testen nahezu unmöglich ist. Dies hängt jedoch nicht davon ab, ob eine Abhängigkeitsinjektion verwendet wird oder nicht.
quelle
Nein , die Abhängigkeitsinjektion ist für Komponententests nicht unbedingt erforderlich.
Die Abhängigkeitsinjektion hilft, wenn Sie eine Klasse haben, die eine abhängige Klasseninstanz benötigt, um eine Teilverarbeitung durchzuführen. Anstelle von DI können Sie die Logik einer Geschäftsmethode in einen Daten-Gethering-Teil (der nicht Unit-Test-fähig ist) und einen Berechnungsteil, der Unit-Test-fähig ist, unterteilen.
Beispiel (mit DI) Diese Implementierung ist abhängig von Employee, Account, ...
Nach Trennung von Datenerfassung und Berechnung:
Der Berechnungsteil kann leicht ohne Abhängigkeitsinjektion getestet werden.
quelle
Die Abhängigkeitsinjektion ist für Einheitentests nicht wesentlich
Die Umkehrung der Kontrolle ist dagegen unerlässlich, wenn Sie eine Implementierung gegen eine andere austauschen möchten.
quelle
Ja, es gibt Alternativen zur Verwendung von DI zur Isolierung.
Eine Alternative besteht darin, Fabriken oder einen ServiceLocator zu verwenden, der aus Tests konfiguriert werden kann, um Scheinobjekte anstelle von echten Objekten zurückzugeben.
Eine andere Möglichkeit ist die Verwendung eines geeigneten Isolationsrahmens oder eines Verspottungswerkzeugs. Solche Tools gibt es für nahezu jede moderne Programmiersprache (zumindest für Java, C #, Ruby und Python). Sie können eine getestete Klasse von der Implementierung anderer Klassen / Typen isolieren, selbst wenn die getestete Klasse ihre Abhängigkeiten direkt instanziiert.
quelle