Soll ich in meiner Anwendung Komponententests für komplexe reguläre Ausdrücke schreiben?
- Einerseits: Sie sind einfach zu testen, da das Eingabe- und Ausgabeformat oft einfach und genau definiert ist und sie oft so komplex werden können, dass Tests von ihnen besonders wertvoll sind.
- Auf der anderen Seite: Sie selbst sind selten Teil der Schnittstelle einer Einheit. Es ist möglicherweise besser, die Schnittstelle nur zu testen und dies auf eine Weise zu tun, die implizit die regulären Ausdrücke testet.
BEARBEITEN:
Ich stimme Doc Brown zu, der in seinem Kommentar feststellt, dass dies ein Sonderfall für das Testen interner Komponenten ist .
Als interne Komponenten haben reguläre Ausdrücke jedoch einige Besonderheiten:
- Ein einzeiliger regulärer Ausdruck kann sehr komplex sein, ohne wirklich ein separates Modul zu sein.
- Wandelt die Eingabe in die Ausgabe um, ohne dass Nebenwirkungen auftreten, und ist daher sehr einfach separat zu testen.
Antworten:
Abgesehen von der Prüfung des Dogmatismus ist die eigentliche Frage, ob er für den Komponententest komplexer regulärer Ausdrücke von Nutzen ist. Es scheint ziemlich klar zu sein, dass es einen Wert liefert (unabhängig davon, ob der reguläre Ausdruck Teil einer öffentlichen Schnittstelle ist), wenn der reguläre Ausdruck komplex genug ist, da es Ihnen ermöglicht, Fehler zu finden und zu reproduzieren und Regressionen vorzubeugen.
quelle
isValid
,parse
,tryParse
, oder Dingsbums, genau je nachdem , wie es verwendet wird), so dass der Client-Code nicht wissen muss, dass er aktuell mit einem regulären Ausdruck implementiert ist. Die Wrapper-Einheit hätte dann detaillierte Tests, die wiederum die aktuelle Implementierung nicht kennen müssten. Diese Tests testen de facto den regulären Ausdruck, jedoch auf implementierungsunabhängige Weise.FooValidator
auf ihre Ein- und Ausgänge, dann haben Sie keine Bedenken, wie es gemacht wird. ++Regex kann ein mächtiges Werkzeug sein, aber es ist kein Werkzeug, dem Sie vertrauen können, wenn Sie auch nur geringfügige Änderungen an komplexen regulären Ausdrücken vornehmen.
Erstellen Sie also viele Tests, die die Fälle dokumentieren, die abgedeckt werden sollen. Und erstellen Sie viele Tests, die Fälle dokumentieren, in denen ein Fehler auftreten sollte, wenn er zur Validierung verwendet wird.
Wann immer Sie Ihre regulären Ausdrücke ändern müssen, fügen Sie die neuen Fälle als Tests hinzu, ändern Sie Ihre regulären Ausdrücke und hoffen Sie auf das Beste.
Wenn ich in einer Organisation wäre, die im Allgemeinen keine Komponententests verwendet, würde ich trotzdem ein Testprogramm schreiben, das alle von uns verwendeten regulären Ausdrücke testet. Ich würde es sogar in meiner eigenen Zeit tun, wenn ich müsste, meine Haare brauchen keine Farbe mehr zu verlieren.
quelle
Reguläre Ausdrücke sind Code zusammen mit dem Rest Ihrer Anwendung. Sie sollten testen, ob der Code insgesamt das tut, was Sie von ihm erwarten. Dies hat mehrere Zwecke:
Da es eine zusätzliche Hürde gibt, Code in einer anderen Sprache in den Rest einzubetten, sollten Sie höchstwahrscheinlich diese zusätzliche Aufmerksamkeit zum Wohle der Wartung verwenden.
quelle
Kurz gesagt, sollten Sie Ihre Anwendung testen. Ob Sie Ihren regulären Ausdruck mit automatisierten Tests testen, die ihn einzeln ausführen, als Teil einer größeren Blackbox oder wenn Sie nur von Hand damit herumspielen, spielt für Sie eine untergeordnete Rolle, um sicherzustellen, dass er funktioniert.
Der Hauptvorteil von Unit-Tests ist, dass sie Zeit sparen. Sie können das Ding jetzt oder zu einem späteren Zeitpunkt so oft testen, wie Sie möchten. Wenn es irgendeinen Grund gibt zu glauben, dass Ihr Regex zu irgendeinem Zeitpunkt überarbeitet, optimiert, eingeschränkt usw. wird, dann wollen Sie wahrscheinlich einige Regressionstests dafür, oder wenn Sie es ändern, müssen Sie gehen durch eine Stunde des Denkens durch alle Randfälle, damit Sie es nicht brechen. Das, oder du lernst damit zu leben, Angst vor deinem Code zu haben und änderst ihn einfach nie.
quelle
Ich denke damit hast du es selbst beantwortet. Regexes in einer Unit sind höchstwahrscheinlich ein Implementierungsdetail.
Was zum Testen Ihres SQL-Codes gehört, gilt wahrscheinlich auch für reguläre Ausdrücke. Wenn Sie ein Stück SQL ändern, führen Sie es wahrscheinlich manuell über einen SQL-Client aus, um festzustellen, ob das Ergebnis Ihren Erwartungen entspricht. Das gleiche gilt, wenn ich einen regulären Ausdruck ändere. Ich verwende ein reguläres Ausdruck-Tool mit einigen Eingabebeispielen, um festzustellen, ob es das tut, was ich erwarte.
Was ich nützlich finde, ist ein Kommentar in der Nähe des regulären Ausdrucks mit einer Textprobe, mit der er übereinstimmen sollte.
quelle
Wenn Sie fragen müssen, ist die Antwort ja.
Angenommen, es kommt etwas FNG und er glaubt, dass er Ihren regulären Ausdruck "verbessern" kann. Jetzt ist er ein FNG, also automatisch ein Idiot. Genau die Person, die unter keinen Umständen Ihren wertvollen Code berühren sollte! Aber vielleicht hat er etwas mit dem PHB zu tun, also können Sie nichts tun.
Es sei denn, Sie wissen, dass der PHB Sie dazu bringt, auf dieses Projekt zu treten und zurückzuschreien, um "dem Kerl vielleicht ein paar Hinweise zu geben, wie Sie dieses Durcheinander verursacht haben", wenn alles schlecht wird. So schreiben Sie alle Fälle auf, die Sie beim Aufbau Ihres wunderschönen Meisterwerks der Ausdruckskraft sorgfältig erwogen haben .
Und da Sie sie alle aufgeschrieben haben, sind Sie zu zwei Dritteln in der Lage, eine Reihe von Testfällen zu erstellen, denn - seien wir ehrlich - Regex-Testfälle sind nach dem Erstellen des Frameworks kinderleicht auszuführen.
Jetzt haben Sie eine Reihe von Randbedingungen, Alternativen und erwarteten Ergebnissen. Und plötzlich sind die Testfälle die Dokumentation, so wie sie in all diesen me-too Agile-Blogposts versprochen wurde. Sie weisen den FNG nur darauf hin, dass es keine große Verbesserung darstellt, wenn seine "Verbesserung" die vorhandenen Testfälle nicht besteht, oder? Und wo sind seine vorgeschlagenen neuen Testfälle, die ein Problem mit dem ursprünglichen Code aufzeigen, den er, da er funktioniert, niemals ändern muss !!!
quelle