Was ist der entscheidende Vorteil von Unit-Tests gegenüber Integrationstests?
Das ist eine falsche Zweiteilung.
Unit-Tests und Integrationstests dienen zwei ähnlichen, aber unterschiedlichen Zwecken. Der Zweck von Unit-Tests ist es, sicherzustellen, dass Ihre Methoden funktionieren. In der Praxis stellen die Komponententests sicher, dass der Code den in den Komponententests festgelegten Vertrag erfüllt. Dies zeigt sich in der Art und Weise, in der Komponententests entworfen wurden: Sie geben speziell an, was der Code tun soll, und versichern, dass der Code dies tut.
Integrationstests sind unterschiedlich. Integrationstests üben die Interaktion zwischen Softwarekomponenten aus. Es können Softwarekomponenten vorhanden sein, die alle ihre Tests bestehen und trotzdem Integrationstests nicht bestehen, weil sie nicht ordnungsgemäß interagieren.
Wenn Unit-Tests jedoch einen entscheidenden Vorteil haben, ist dies der Fall : Unit-Tests sind viel einfacher einzurichten und erfordern viel weniger Zeit und Aufwand als Integrationstests. Bei richtiger Anwendung fördern Komponententests die Entwicklung von "testbarem" Code, was bedeutet, dass das Endergebnis zuverlässiger, verständlicher und leichter zu warten ist. Testbarer Code weist bestimmte Merkmale auf, z. B. eine kohärente API und wiederholbares Verhalten, und gibt Ergebnisse zurück, die leicht zu bestätigen sind.
Integrationstests sind schwieriger und kostenintensiver, da Sie häufig aufwändige Verspottungen, komplexe Einstellungen und schwierige Behauptungen benötigen. Stellen Sie sich vor, Sie versuchen auf der höchsten Ebene der Systemintegration die menschliche Interaktion in einer Benutzeroberfläche zu simulieren. Ganze Softwaresysteme widmen sich dieser Art von Automatisierung. Und es ist die Automatisierung, die wir suchen. Tests am Menschen sind nicht wiederholbar und lassen sich nicht wie automatisierte Tests skalieren.
Schließlich gibt der Integrationstest keine Garantie für die Codeabdeckung. Wie viele Kombinationen von Codeschleifen, Bedingungen und Zweigen testen Sie mit Ihren Integrationstests? Weißt du es wirklich? Es gibt Tools, die Sie für Komponententests und getestete Methoden verwenden können und die Ihnen Aufschluss über die Codeabdeckung und die zyklomatische Komplexität Ihres Codes geben. Wirklich gut funktionieren sie aber nur auf Methodenebene, wo Unit-Tests leben.
Wenn sich Ihre Tests bei jedem Refactor ändern, ist das ein anderes Problem. Unit - Tests sollen über sein dokumentieren , was eine Software macht, was beweist , dass es das tut, und dann beweisen , dass es das tut wieder , wenn Sie die zugrunde liegende Implementierung Refactoring. Wenn sich Ihre API ändert oder Sie Ihre Methoden aufgrund einer Änderung im Systemdesign ändern müssen, ist dies das, was passieren soll. Wenn es häufig vorkommt, sollten Sie zuerst Ihre Tests schreiben, bevor Sie Code schreiben. Dies zwingt Sie, über die Gesamtarchitektur nachzudenken und Code mit der bereits eingerichteten API zu schreiben.
Wenn Sie viel Zeit damit verbringen, Komponententests für Trivialcode zu schreiben, wie z
public string SomeProperty { get; set; }
dann sollten Sie Ihren Ansatz überprüfen. Unit-Tests sollen das Verhalten testen , und es gibt kein Verhalten in der obigen Codezeile. Sie haben jedoch irgendwo eine Abhängigkeit in Ihrem Code erstellt, da diese Eigenschaft mit ziemlicher Sicherheit an anderer Stelle in Ihrem Code referenziert wird. Schreiben Sie stattdessen Methoden, die die erforderliche Eigenschaft als Parameter akzeptieren:
public string SomeMethod(string someProperty);
Jetzt hat Ihre Methode keine Abhängigkeiten von etwas außerhalb von sich selbst und ist jetzt testbarer, da sie vollständig in sich geschlossen ist. Zugegeben, Sie werden dies nicht immer tun können, aber es verschiebt Ihren Code in die Richtung, testbarer zu sein, und dieses Mal schreiben Sie einen Unit-Test für das tatsächliche Verhalten.