Erzwingt mich die testgetriebene Entwicklung, SOLID zu folgen?

15

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?

SiberianGuy
quelle
1
Bei TDD geht es hauptsächlich darum, Entwickler zum Schreiben von Tests zu zwingen. Wenn Sie also sagen, dass Sie durch das Schreiben von Unit-Tests SOLID-Code schreiben, bedeutet dies, dass TDD Sie zwingt, SOLID-Code zu schreiben. Dies basiert jedoch nur auf dem, was Sie gesagt haben, und spiegelt meine Meinung, die Sie in meiner Antwort sehen können, nicht genau wider.
Yam Marcovic
1
Yam: Ich werde nicht zustimmen, TDD ist nicht über Unit-Tests zu schreiben. Bei TDD geht es darum, eine minimal komplexe und korrekte Lösung für das vorliegende Problem zu finden. Tests sind nur ein Nebenprodukt des Verfahrens
Amit Wadhwa
Bei TDD geht es per Definition darum, Tests vor dem Code zu schreiben. Theoretisch können Sie auch ohne Tests eine minimal komplexe und korrekte Lösung erstellen. Die Tests geben Ihnen einfach sofortiges Feedback und Regressionsbewusstsein. Da es immer noch möglich ist, mit Tests eine überkomplexe Lösung zu erstellen, geht es bei TDD nicht darum, an sich minimal komplexe Lösungen zu erstellen. Es ist das Gegenteil von dem, was du gesagt hast. Elegante Lösungen sind ein Nebenprodukt des Verfahrens und nicht umgekehrt.
Yam Marcovic

Antworten:

24

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:

  1. Sie müssen entkoppelten Code schreiben, damit Sie sich über das lustig machen können, was Sie brauchen. Dies unterstützt das Abhängigkeitsinversionsprinzip .
  2. Sie müssen Tests schreiben, die klar und kurz sind, damit Sie nicht zu viel an den Tests ändern müssen (was zu einer großen Quelle von Code-Rauschen führen kann, wenn dies anders erfolgt). Dies unterstützt das Prinzip der einheitlichen Verantwortung .
  3. Dies mag umstritten sein, aber das Prinzip der Schnittstellentrennung ermöglicht es Klassen, sich auf leichtere Schnittstellen zu verlassen, die das Verfolgen und Verstehen von Verspottungen erleichtern, da Sie nicht fragen müssen, warum diese 5 Methoden nicht auch verspottet wurden Noch wichtiger ist, dass Sie keine große Auswahl haben, wenn Sie sich für eine Methode zum Verspotten entscheiden. Dies ist gut, wenn Sie nicht wirklich den gesamten Code der Klasse durchgehen möchten, bevor Sie sie testen. Verwenden Sie einfach Versuch und Irrtum, um ein grundlegendes Verständnis der Funktionsweise zu erlangen.

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.

Yam Marcovic
quelle
Auch wenn Sie die Open / Closed- und Liskov-Substitution nicht befolgen, brechen Ihre Mocks später. Selbst wenn TDD Ihnen nicht dabei hilft, OCP und LSP durchzusetzen, werden Sie durch die erstellten Tests informiert, wenn Sie das Problem lösen. Eher ein Testeffekt im Allgemeinen, aber trotzdem erwähnenswert.
Jonas Schubert Erlandsson
9

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.

dietbuddha
quelle
2

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.

Heath Lilley
quelle
0

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 .

DaveFar
quelle