2009-08-27 7 views
0

Zum Beispiel, ich habe ein Stück Code, der eine SQL * Loader-Steuerdatei aus dieser Vorlage (mit Python) ist zu erzeugen:Wie testen Sie den Vorlagencode?

template = """ 
LOAD DATA 
INFILE '%(file_path)s' 
APPEND 
INTO TABLE %(table_name)s 
FIELDS TERMINATED BY "%(delimiter)" 
OPTIONALLY ENCLOSED BY "" 
(\n%(column_specifications)s\n) 
""" 

Es gibt nur zwei Möglichkeiten, die ich von zu Unit-Test denken kann dies:

  1. Kommen Sie mit Eingaben, herauszufinden, wie die Ausgabe aussehen soll, dann behaupten, dass die Ausgabe gleich ist.
  2. Testen Sie, dass bestimmte Zeichenfolgen, die in der Datei enthalten sein sollten, in der Datei enthalten sind.

Für mich stellen diese Tests zwei verschiedene Extreme dar. Die erste Technik scheint sehr fragil zu sein, da ich den Test aktualisieren muss, wenn ich nur den Leerraum ändere. Die zweite Technik scheint fast nutzlos, weil sie nicht wirklich testet, dass Text am richtigen Ort ist. Gibt es hier eine Art fröhliches Medium, das meine Tests einfach hält?

Antwort

1

Ich würde gerne einreichen, dass Sie diesen Test überhaupt nicht schreiben sollten.

In meiner Erfahrung geht es bei Unit Testing darum sicherzustellen, dass das Programm tatsächlich die Dinge tut, die es tun sollte. Wenn Sie den Vorlagencode nicht selbst geschrieben haben, sollten Sie nicht testen müssen, ob sich das Templating korrekt verhält oder nicht. Stellen Sie stattdessen sicher, dass die Werte korrekt sind und dass die richtigen Daten ordnungsgemäß in die Datenbank geladen werden. Nach all dem ist das Endziel Ihres Codes, nicht die entsprechende SQL-Zeichenfolge zu erzeugen.

1

Persönlich denke ich, ich wäre glücklich mit Option # 1, wenn die Wahrscheinlichkeit, dass jemand dies ändert, sobald es funktioniert, gering ist.

Wenn Sie jedoch die Whitespace-Sache ärgern, könnten Sie immer vom Standpunkt des Verbrauchers aus testen. Es scheint, dass Sie hier eine SQL-Abfrage erstellen, also führen Sie es gegen eine Test-DB mit einer Test-Eingabedatei und überprüfen Sie, ob die Anzahl der Datensätze (oder der Inhalt) mit dem erwarteten Wert übereinstimmt.

+0

Das wäre jedoch kein Unit-Test. :-) –

+1

Es wäre kein schneller Komponententest, aber wenn Sie Code schreiben, der Bilder, Dateien usw. generiert, neigen die Tests dazu, sich dem Ansatz der "Goldenen Datei"/Referenzdatei zu nähern. Wie wäre es mit der Ausgabe der String/Datei-Inhalte gegen ein Kommandozeilen-Diff-Tool, das Whitespace ignoriert – Gishu

1

Wenn Sie testen möchten, dass das Templating funktioniert, # 1. Es ist am einfachsten zu schreiben und genau. Wenn Sie feststellen, dass es spröde ist, können Sie schnell als # 2 umschreiben (aber es ist nicht notwendig, dies im Voraus zu tun).

Wenn Sie das SQL testen möchten, benötigen Sie wirklich etwas über einen Komponententest hinaus mit einem vereinfachten db-Fixture und führen das SQL tatsächlich aus. Es wird langsamer als der Komponententest, aber wahrscheinlich nicht besonders langsam.