it-swarm.com.de

Sollte es Unit-Tests für komplexe reguläre Ausdrücke geben?

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 klar definiert ist und oft so komplex wird, dass Tests speziell für sie wertvoll sind.
  • Auf der anderen Seite: Sie selbst sind selten Teil der Schnittstelle einer Einheit. Es ist möglicherweise besser, nur die Schnittstelle zu testen und dies so zu tun, dass die regulären Ausdrücke implizit getestet werden.

BEARBEITEN:

Ich stimme Doc Brown zu, der in seinem Kommentar feststellt, dass dies ein Sonderfall von nit-Test von internen Komponenten ist.

Als interne Komponenten haben Regexe jedoch einige Besonderheiten:

  1. Ein einzeiliger Regex kann sehr komplex sein, ohne wirklich ein separates Modul zu sein.
  2. Regexes ordnen die Eingabe ohne Nebenwirkungen der Ausgabe zu und sind daher sehr einfach separat zu testen.
34
Lii

Abgesehen von der Prüfung des Dogmatismus ist die eigentliche Frage, ob er den komplexen regulären Ausdrücken von Unit-Tests einen Wert verleiht. 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 Sie damit Fehler finden und reproduzieren und Regressionen verhindern können.

102
JacquesB

Regex kann ein leistungsstarkes Werkzeug sein, aber es ist kein Werkzeug, dem Sie vertrauen können, dass es nur noch funktioniert, wenn Sie auch nur geringfügige Änderungen an komplexen Regexen vornehmen.

Erstellen Sie also viele Tests, die die Fälle dokumentieren, die abgedeckt werden sollen. Und erstellen Sie viele Tests, die dokumentieren, dass Fälle fehlschlagen sollten, wenn sie zur Validierung verwendet werden.

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 auf das Beste.

Wenn ich in einer Organisation wäre, die im Allgemeinen keine Komponententests verwendet, würde ich immer noch ein Testprogramm schreiben, das alle von uns verwendeten regulären Ausdrücke testet. Ich würde es sogar in meiner Freizeit tun, wenn ich müsste, meine Haare müssen keine Farbe mehr verlieren.

21
Bent

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:

  • Test sind ausführbare Dokumentation. Es zeigt deutlich, wozu Sie den Code benötigen. Wenn es getestet wird, ist es wichtig.
  • Zukünftige Betreuer können sicher sein, dass die Tests sicherstellen, dass das Verhalten unverändert bleibt, wenn sie es ändern.

Da es eine zusätzliche Hürde gibt, die zu überwinden ist, wenn Code in einer anderen Sprache in den Rest eingebettet ist, sollten Sie dieser zusätzlichen Aufmerksamkeit höchstwahrscheinlich zum Nutzen der Wartung widmen.

Kurz gesagt, Sie sollten Ihre Bewerbung testen. Ob Sie Ihren Regex mit automatisierten Tests testen, die ihn isoliert ausführen, als Teil einer größeren Black Box oder wenn Sie nur von Hand damit herumspielen, ist zweitrangig, bis Sie sicherstellen müssen, dass er funktioniert.

Der Hauptvorteil von Unit-Tests besteht darin, dass sie Zeit sparen. Mit ihnen können Sie das Ding jetzt oder zu einem späteren Zeitpunkt so oft testen, wie Sie möchten. Wenn es überhaupt einen Grund zu der Annahme gibt, dass Ihre Regex zu irgendeinem Zeitpunkt überarbeitet, optimiert, mehr Einschränkungen usw. erhalten wird, dann möchten Sie wahrscheinlich einige Regressionstests dafür, oder wenn Sie sie ändern, müssen Sie gehen durch eine Stunde des Durchdenkens aller Edge-Fälle, damit Sie es nicht brechen. Das, oder Sie lernen, mit Angst vor Ihrem Code zu leben und ihn einfach nie zu ändern.

1
sara