Wie testen Sie Unit-Ausdrücke regulär?
Ich bin neu in TDD, und ich finde RegExp ganz speziellen Fall. Gibt es einen speziellen Weg, um Einheit zu testen, oder kann ich Sie nur behandeln Sie als regulären Funktionen?
InformationsquelleAutor der Frage Jader Dias | 2009-01-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie immer testen Sie Ihre regexen, wie jedes andere Stück code. Sie sind bei den meisten einfach eine Funktion, die einen string und gibt einen booleschen Wert, oder gibt ein array von Werten.
Hier sind einige Vorschläge, was Sie denken, wenn es um die Gestaltung von unit-tests für regexen. Diese sind nicht hart und schnell Rezepte für die unit-test-design, aber einige Richtlinien zu Form Ihr denken. Wie immer, Wiegen die Bedürfnisse Ihres Tests versus Kosten des Scheiterns ausgewogen, mit der Zeit, die erforderlich ist, um Sie zu implementieren alle. (Ich finde, dass die "Umsetzung" der test ist der einfache Teil! :-] )
Punkte zu berücksichtigen:
Für eine regex gibt Listen, denken Sie auch daran:
(?<name> thing1 ( thing2) )
) - dieses Verhalten kann unterschiedlich sein, basierend auf der regex-engine, die Sie verwenden.Wenn Sie keine erweiterten Funktionen, wie non-backtracking-Gruppen, stellen Sie sicher, dass Sie verstehen komplett wie das feature funktioniert, und die Verwendung der oben genannten Richtlinien, aufzubauen Beispiel Streicher, die sollten arbeiten für und gegen jede von Ihnen.
Je nach regex-Bibliothek Implementierung, die Art, wie Gruppen erfasst werden, kann auch anders sein. Perl 5 ist eine " offene Klammer, um das Bestell -, C# hat, dass teilweise außer für benannte Gruppen und so weiter. Stellen Sie sicher, zu Experimentieren mit Ihrem Geschmack, um genau zu wissen, was es tut.
Dann integrieren Sie direkt in Ihre unit-tests, sowohl im eigenen Modul oder neben dem Modul mit den regex. Für besonders böse regexen, die Sie finden müssen Sie Unmengen von tests, um zu überprüfen, dass die Muster und alle Funktionen, die Sie verwenden, korrekt sind. Wenn die regex macht einen großen (oder fast alle) der arbeiten, die die Methode tut, werde ich den Rat über die Mode Eingänge zu testen, dass die Funktion und nicht die regex direkt. So, wenn Sie später entscheiden, dass die regex ist nicht der Weg zu gehen, oder Sie wollen, es zu brechen, können Sie erfassen das Verhalten der regex ohne änderung der Schnittstelle - sprich, die Methode aufruft, die die regex.
Solange Sie wirklich wissen, wie man eine regex-Funktion soll die Arbeit in Ihrem Geschmack von regex, Sie sollten in der Lage sein zu entwickeln, menschenwürdige Testfälle für Sie. Nur stellen Sie sicher, dass Sie wirklich, wirklich, wirklich nicht verstehen, wie die Funktion funktioniert!
InformationsquelleAutor der Antwort
Nur werfen eine Reihe von Werten an, zu prüfen, dass Sie das richtige Ergebnis (ob das match/kein match oder einen bestimmten Wiederbeschaffungswert etc.).
Allem, wenn es keine Ecke Fällen, in denen Sie Wunder, ob Sie arbeiten oder nicht, erfassen Sie in einem unit-test und erklären in einem Kommentar warum Sie arbeiten. So jemand anderes, der das ändern will, der regex wird in der Lage sein zu überprüfen, dass die Ecke den Fall, funktioniert immer noch, und es gebe einen Hinweis, um Sie, wie um es zu beheben, wenn es bricht.
InformationsquelleAutor der Antwort Jon Skeet
Vermutlich Ihre reguläre Ausdrücke enthalten sind, die innerhalb einer Methode einer Klasse. Zum Beispiel:
Können Sie nun schreiben tests für diese Methode. Ich denke, der Punkt ist, dass die regex ist eine Implementierung detail - Ihre Testanforderungen testen Sie die Schnittstelle, die in diesem Fall ist nur die Validierung der E-Mail-Methode.
InformationsquelleAutor der Antwort ng5000
Ich würde schaffen eine Reihe von input-Werte mit dem erwarteten output-Werte, ähnlich wie bei jedem anderen test-Fall.
Außerdem kann ich durchweg empfehlen die Kostenlose Regex Tool Expresso.
Es ist eine fantastische regex-editor/debugger, der hat mich gerettet Tagen Schmerzen in der Vergangenheit.
InformationsquelleAutor der Antwort Andrew Rollings
Ich immer testen Sie, genauso wie ich jede andere Funktion. Stellen Sie sicher, Sie passen Dinge, die Sie denken, Sie sollten zueinander passen und dass Sie nicht übereinstimmen Dinge, die Sie nicht sollte.
InformationsquelleAutor der Antwort Bill the Lizard
Ich kann nicht glauben, dass niemand gepostet hat diese erstaunliche tool:
refiddle.com
Es ermöglicht Ihnen, testen Sie Ihre regulären Ausdrücke. Definieren Sie einige text mit strings, sollte es passen, und die Saiten sollte es nicht passen, und wenn es ist alles grün, Sie sind gut. Zum Beispiel hier habe ich passend zu Schnecken: http://refiddle.com/by/callum-locke/slug-matcher
InformationsquelleAutor der Antwort callum
Ich denke, ein einfaches input-ouput-test ausreichend. Wie die Zeit vergeht, und einige Fälle auftreten, in denen Sie Ihre regex scheitert, vergessen Sie nicht, fügen Sie diesen Fällen auf die Prüfung als auch während der Fixierung.
InformationsquelleAutor der Antwort DaSteph
Ich gerne testen regexp gegen eine gegenüber regex, ich werde ausführen, sowohl gegen die möglichen test und stellen Sie sicher, dass die Schnittmenge leer ist.
InformationsquelleAutor der Antwort mandel
Prüfen, schreiben die ersten tests, und nur schreiben, wie viel von der regexp-wie erforderlich-zu jedem Durchgang testen. Wenn Sie brauchen, um erweitern regexp, tun Sie es durch hinzufügen fehlgeschlagene tests.
InformationsquelleAutor der Antwort Andrew Grimm