Ich höre viel von TDD- Praktikern, dass einer der Vorteile von TDD darin besteht, dass Entwickler die SOLID- Prinzipien befolgen müssen (Einzelverantwortung, Open-Closed, Liskov-Substitution, Schnittstellentrennung und Abhängigkeitsinversion). Für mich ist es jedoch ausreichend, nur einige Tests zu schreiben (hauptsächlich Unit-Tests), um zu verstehen, dass es wichtig ist, SOLID zu folgen (und somit eine testbare Architektur zu erstellen).
Zwingt TDD die Entwickler, SOLID aktiver zu folgen als nur Komponententests zu schreiben?
unit-testing
tdd
solid
SiberianGuy
quelle
quelle
Antworten:
Erstens zwingt TDD Sie nicht strikt zum Schreiben von SOLID-Code. Sie könnten TDD machen und ein großes Durcheinander schaffen, wenn Sie wollten.
Natürlich hilft es, die SOLID-Prinzipien zu kennen, da Sie andernfalls möglicherweise keine gute Antwort auf viele Ihrer Probleme haben und daher schlechten Code mit schlechten Tests schreiben.
Wenn Sie bereits mit SOLID-Grundsätzen vertraut sind, empfiehlt TDD Ihnen, darüber nachzudenken und diese aktiv zu nutzen.
Das heißt, es werden nicht unbedingt alle Buchstaben in SOLID abgedeckt , aber es fordert Sie nachdrücklich dazu auf und fordert Sie dazu auf, zumindest teilweise SOLID-Code zu schreiben, da dies die Konsequenzen hat, wenn dies nicht sofort sichtbar und ärgerlich ist.
Beispielsweise:
Das Einhalten des Open / Closed-Prinzips kann bei Tests hilfreich sein, die nach dem Code geschrieben wurden, da Sie normalerweise externe Dienstaufrufe in Testklassen überschreiben können, die von den getesteten Klassen abgeleitet sind. Bei TDD glaube ich, dass dies nicht so erforderlich ist wie bei anderen Grundsätzen, aber ich kann mich irren.
Das Einhalten der Liskov-Substitutionsregel ist ideal, wenn Sie die Änderungen für Ihre Klasse minimieren möchten, um eine nicht unterstützte Instanz zu erhalten, die zufällig dieselbe statisch typisierte Schnittstelle implementiert, dies jedoch in geeigneten Testfällen wahrscheinlich nicht der Fall ist Im Allgemeinen werden die Real-World-Implementierungen der Abhängigkeiten von Class-Under-Test nicht bestanden.
Am wichtigsten ist, dass SOLID-Prinzipien erstellt wurden, um Sie zu ermutigen, saubereren, verständlicheren und wartbareren Code zu schreiben, und TDD auch. Wenn Sie also TDD richtig ausführen und darauf achten, wie Ihr Code und Ihre Tests aussehen (und es ist nicht so schwierig, weil Sie sofort Feedback, API und Korrektheit erhalten), können Sie sich im Allgemeinen weniger Gedanken über SOLID-Prinzipien machen.
quelle
Nein
TDD kann es aufgrund des kontinuierlichen Refactorings einfacher machen, bewährte Praktiken zu befolgen, zwingt Sie jedoch nicht dazu, einem Grundsatz zu folgen. Sie müssen lediglich sicherstellen, dass der von Ihnen geschriebene Code getestet wurde. Sie können beim Schreiben von Code nach beliebigen Grundsätzen vorgehen, um den Test zu bestehen. oder überhaupt keine Prinzipien.
quelle
Als ich anfing, TDD zu machen, erweiterte sich mein Verständnis der SOLID-Prinzipien um eine Größenordnung. Sobald ich darüber nachdachte, wie ich Abhängigkeiten verspotten könnte, stellte ich fest, dass praktisch jede Komponente in der Codebasis eine potenzielle alternative Implementierung hatte. Und wie viel einfacher ist es, eine einfache öffentliche API zu testen.
Es bot auch ein viel besseres Verständnis für die meisten Designmuster. Besonders das Strategiemuster.
quelle
Ja : TDD ist hauptsächlich eine gute Designtechnik (und nur eine sekundäre Testtechnik). Es hilft sehr, die soliden Prinzipien zu erreichen, obwohl (pathologische) Beispiele für TDD mit vielen Codegerüchen immer noch möglich sind.
Die Verbindung zwischen TDD und den Grundprinzipien wird in diesem großartigen hanselminuten Podcast mit dem Titel "Testgetriebene Entwicklung ist Design - Das letzte Wort auf TDD" (mit der obigen Schlussfolgerung) diskutiert .
quelle