Testgeneratoren kennenlernen

Lerne, wie der Clojure-Track Testgeneratoren einsetzt, um Tests für Übungen zu erzeugen


Der Clojure-Track verwendet einen Testgenerator, um automatisch Tests für Übungen zu generieren. Er macht sich zunutze, dass die meisten Übungen im problem-specifications-Repo auch eine Datei canonical-data.json haben, die standardisierte Test-Eingaben und -Ausgaben enthält, mit denen sich die Übung implementieren lässt.

Schritte

Um die Tests einer Übung zu generieren, geht der Testgenerator so vor:

  1. Er liest die Testfälle der Übung aus ihrer Datei canonical-data.json
  2. Er verwendet die Datei tests.toml, um ausgeschlossene Testfälle auszulassen
  3. Er transformiert die Testfälle (optional)
  4. Er rendert die Testfälle mit der Generator-Vorlage der Übung
  5. Er formatiert die gerenderte Vorlage mit cljfmt
  6. Er schreibt die formatierte Vorlage in die Testdatei der Übung

Schritt 1: die Datei canonical-data.json lesen

Der Testgenerator parst die Testfälle aus der canonical-data.json der Übung mit der clojure/data.json-Bibliothek.

Da einige kanonische Daten verschachtelt sind, enthält der geparste Testfall ein zusätzliches Feld path, das die description-Eigenschaften aller übergeordneten Elemente sowie die description-Eigenschaft des Testfalls selbst enthält.

Hinweis: Schlüssel werden als Keywords geparst.

Schritt 2: ausgeschlossene Tests aus der Datei tests.toml auslassen

Jede Übung hat eine Datei tests.toml, in der einzelne Tests ausgeschlossen/deaktiviert werden können. Der Testgenerator entfernt alle Testfälle, die als ausgeschlossen markiert sind (include = false).

Schritt 3: die Testfälle transformieren (optional)

Einige Übungen brauchen vielleicht ein paar Anpassungen, bevor die Daten gerendert werden. Zum Beispiel möchtest du vielleicht die Beschreibung weniger ausführlich machen.

Um Testfälle anzupassen, definiere eine Datei .meta/generator.clj mit einem Namespace <slug>-generator. Es gibt zwei Möglichkeiten, Testfälle zu transformieren:

  • Testfall/Testfälle aktualisieren
  • Testfall/Testfälle hinzufügen/entfernen

Testfall/Testfälle aktualisieren

Um einzelne Testfälle zu aktualisieren, definiere die folgende Funktion:

(defn update-test-case
  "Update a test case"
  [test-case]
  ;; function body
)
Beispiel

Dieses Beispiel entfernt alle Elemente bis auf das letzte aus dem Wert :path (und kürzt so die Beschreibung):

(ns difference-of-squares-generator)

(defn update-test-case [test-case]
  (update test-case :path #(take-last 1 %)))

Testfall/Testfälle hinzufügen oder entfernen

Um Testfälle hinzuzufügen oder zu entfernen, definiere die folgende Funktion:

(defn add-remove-test-cases
  "Add/remove test case(s)"
  [test-cases]
  ;; function body
)
Note

Wenn du beide Funktionen definierst, wird add-remove-test-cases zuerst und update-test-case danach aufgerufen.

Schritt 4: die Testfälle rendern

Die (möglicherweise transformierten) Testfälle werden dann an die Datei .meta/generator.tpl übergeben, die festlegt, wie die Tests anhand dieser Testfälle gerendert werden sollen.

Schritt 5: die gerenderte Vorlage mit cljfmt formatieren

Die gerenderte Vorlage wird dann mit cljfmt formatiert. Das hat die folgenden Vorteile:

  • Übungen werden einheitlich formatiert
  • Du musst dir beim Schreiben von Vorlagen keine großen Gedanken über Leerzeichen und Ausrichtung machen

Schritt 6: die gerenderte Vorlage in die Testdatei der Übung schreiben

Schließlich wird die Ausgabe der gerenderten Vorlage in die Testdatei der Übung geschrieben.

Vorlagen

Die Vorlagen werden mit der hbs-Bibliothek gerendert, die die Handlebars-Syntax unterstützt (mit handlebars.java).

Kommandozeilenschnittstelle

Es gibt zwei Möglichkeiten, den Testgenerator auszuführen:

  1. bin/generate-tests: generiert die Tests für alle Übungen, die eine Generator-Vorlage haben
  2. bin/generate-tests <slug>: generiert die Tests für die angegebene Übung, sofern sie eine Generator-Vorlage hat