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.
Um die Tests einer Übung zu generieren, geht der Testgenerator so vor:
canonical-data.json
tests.toml, um ausgeschlossene Testfälle auszulassencanonical-data.json lesenDer 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.
tests.toml auslassenJede Ü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).
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:
Um einzelne Testfälle zu aktualisieren, definiere die folgende Funktion:
(defn update-test-case
"Update a test case"
[test-case]
;; function body
)
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 %)))
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
)
Wenn du beide Funktionen definierst, wird add-remove-test-cases zuerst und update-test-case danach aufgerufen.
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.
Die gerenderte Vorlage wird dann mit cljfmt formatiert. Das hat die folgenden Vorteile:
Schließlich wird die Ausgabe der gerenderten Vorlage in die Testdatei der Übung geschrieben.
Die Vorlagen werden mit der hbs-Bibliothek gerendert, die die Handlebars-Syntax unterstützt (mit handlebars.java).
Es gibt zwei Möglichkeiten, den Testgenerator auszuführen:
bin/generate-tests: generiert die Tests für alle Übungen, die eine Generator-Vorlage habenbin/generate-tests <slug>: generiert die Tests für die angegebene Übung, sofern sie eine Generator-Vorlage hat