Bei einem aktuellen Projekt sollten die Kräfte, die Unit-Tests wünschen, in unseren Entwicklungszyklus einbezogen werden, um die konstante Anzahl von Fehlern zu vermeiden, die in unseren Code zu sickern scheinen. Das Problem ist, dass der Spaghetti-Code zu 95% prozedural ist, mit dem ich noch nie Unit-Tests durchgeführt habe (alle meine Erfahrungen mit Unit-Tests waren mit OOP-Code).
Meine Frage in aller Kürze lautet also, ob es ratsam ist, mit dem Testen von Einheiten auf unserer aktuellen Codebasis fortzufahren, oder ob es verschoben wird, bis die Anwendung auf ein geeignetes OOP-Framework migriert wurde.
PS: Während ich versuchte, diese Frage als sprachunabhängig zu bezeichnen, habe ich das Gefühl, dass die Angabe, dass die betreffende Anwendung PHP und Javascript verwendet, spezifischere Antworten liefert, die diese Frage beantworten könnten, da dieses Vorkommen erfahrungsgemäß am häufigsten bei solchen Anwendungen auftritt.
quelle
Antworten:
Unit-Tests eignen sich gut für Objekte, zumal sie viele ausgefallene Funktionen bieten, wie zum Beispiel Scheinobjekte, mit denen Sie schneller bessere Tests erstellen können.
Unter diesen Umständen ist es nicht verboten, Komponententests auf einer prozeduralen Codebasis durchzuführen . In OOP sind die meisten Komponententests Testmethoden, bei denen einige Parameter übergeben und entweder ein Ergebnis oder eine Ausnahme eines bestimmten Typs erwartet werden. Dies kann auch mit Prozedurcode durchgeführt werden. nur dass anstelle von Testmethoden, werden Sie Funktionen testen .
Beachten Sie, dass Sie Folgendes tun müssen:
Isolieren Sie die Funktionen, die Sie testen müssen, und diejenigen, die Sie nicht benötigen. In OOP ist dies einfach: Private Methoden müssen nicht getestet werden, da die Aufrufer niemals direkt darauf zugreifen können. Möglicherweise sind einige Funktionen in Ihrem Verfahrenscode so und erfordern keine Tests.
Denken Sie über den globalen Geltungsbereich nach . Das Problem besteht auch in OOP, aber wenn Sie sagen , dass Sie Spaghetti - Code zu testen, stehen die Chancen, dass die Leute , die diesen Code geschrieben haben schlechte Gewohnheiten, wie globale Reichweite zu viel verwenden, und einige tun verrückte Dinge wie das Ändern
$_GET
oder$_POST
Arrays innerhalb funktionen.Code außerhalb von Funktionen behandeln. Dies ist ein komplizierterer Fall, aber immer noch möglich. Entweder Sie rufen
require_once
eine Seite auf, um zu sehen, was passiert, und erfassen die Ausgabe überob_start
/ob_get_clean
, oder Sie führen eine HTTP-Anforderung aus der Testsuite aus und analysieren die Antwort, indem Sie den HTML-Code analysieren. Dies ist kein wirklicher UI-Test: Hier ist es Ihnen egal, ob eine Schaltfläche auf einer Seite links oder rechts angezeigt wird oder ob ein Link in großen roten Großbuchstaben oder in kleinen blauen angezeigt wird. Ihnen ist es wichtig, einige HTML-Elemente über DOM zu finden und ihren Inhalt mit dem erwarteten zu vergleichen.Testen Sie die Antwortcodes .
require_once
mit Ausgabepufferung ist gut, aber Sie müssen auch testen, wie die Webanwendung mit Fehlern umgeht. Wenn das erwartete Ergebnis eines Tests beispielsweise 404 Not Found lautet, müssen Sie eine HTTP-Anforderung ausführen, um die Antwort zu ermitteln.quelle
Richten Sie einige automatische Tests ein, bevor Sie auf eine andere Plattform migrieren, und nicht danach. Fügen Sie während der Migration weitere Tests hinzu, nicht danach. Wenn es sich bei diesen Tests um "Integrationstests" oder Unit-Tests handelt, müssen Sie selbst entscheiden. In der Regel können Sie jedoch Ihr bevorzugtes xUnit-Testframework für beide Arten verwenden.
quelle
Die effektivste Methode zum Starten von Komponententests besteht darin, die am häufigsten auftretenden oder die höchsten Kosten verursachenden Fehlerklassen zu ermitteln. Erstellen Sie dann Tests, die auf diese Fehler abzielen.
Wie diese Tests implementiert werden, unterscheidet sich zwischen Paradigmen und Sprachen. Das Wichtigste, was Ihre Fähigkeit zum Testen von Einheiten beeinträchtigt, ist die Qualität des Codes. weniger das verwendete Paradigma. Denken Sie daran, beim Unit-Testen geht es darum, eine "Unit" Code für sich zu testen. Alles, was sich auf Ihre Fähigkeit auswirkt, "Code-Einheiten" zu isolieren, erschwert das Testen.
All dies wird sich stärker auf die Schwierigkeit des Testens auswirken als das Sprachparadigma.
quelle
Wann immer Sie eine Situation haben, in der Sie Teile Ihres Codes automatisch testen können, können Unit-Tests effektiv sein. Die Frage ist also nicht, ob der prozedurale Code effektiv als Einheit getestet werden kann, sondern ob DIESER Code als Einheit getestet werden kann. Das hängt davon ab, wie viel Status es liest und wie viel Status es festlegt. Idealerweise ist die Antwort auf beide Fragen Null. Wenn dies nicht der Fall ist, können Sie sie trotzdem testen.
Wie immer müssen Sie das Vertrauen, dass der Code korrekt ist, gegen die Kosten für das Erreichen dieses Vertrauens abwägen. Denken Sie daran, dass ein Teil des Gewinns für Unit-Tests darin besteht, die Abhängigkeiten explizit zu identifizieren. In diesem Sinne ist es im Vergleich zu OOP-Code noch effektiver, prozeduralen Code für Unit-Tests zu verwenden.
quelle
Ich glaube nicht, dass es möglich ist, echte Komponententests gegen prozeduralen Code durchzuführen. Das Hauptproblem besteht darin, dass jede Prozedur wahrscheinlich viele Abhängigkeiten aufweist, die nicht ausgeschlossen werden können. Bestenfalls handelt es sich um Integrationstests. Ähnliches habe ich vor vielen Monden mit VB6-Modulen und VBA-Modulen in MS Access gemacht.
Das heißt, wenn Sie die Methoden, die die meisten Schmerzen verursachen, auf ein Testgerüst setzen können, muss das von Wert sein, oder?
quelle