Découvrir comment le parcours Clojure utilise les générateurs de tests pour générer les tests des exercices
Le parcours Clojure utilise un générateur de tests pour générer automatiquement les tests des exercices d'entraînement.
Il tire parti du fait que la plupart des exercices définis dans le dépôt problem-specifications possèdent aussi un fichier canonical-data.json, qui contient des entrées et des sorties de test standardisées pouvant servir à implémenter l'exercice.
Pour générer les tests d'un exercice d'entraînement, le générateur de tests :
canonical-data.json
tests.toml pour omettre les cas de test excluscanonical-data.json
Le générateur de tests analyse les cas de test de l'exercice dans son canonical-data.json à l'aide de la bibliothèque clojure/data.json.
Comme certaines données canoniques utilisent l'imbrication, le cas de test analysé comporte un champ path supplémentaire qui contient les propriétés description des éventuels éléments parents, ainsi que la propriété description du cas de test lui-même.
Remarque : les clés sont analysées comme des mots-clés.
tests.toml
Chaque exercice dispose d'un fichier tests.toml, dans lequel des tests individuels peuvent être exclus ou désactivés.
Le générateur de tests supprime tous les cas de test marqués comme exclus (include = false).
Certains exercices peuvent avoir besoin de quelques ajustements avant d'effectuer le rendu des données. Par exemple, il se peut que tu veuilles rendre la description moins verbeuse.
Pour ajuster des cas de test, définis un fichier .meta/generator.clj contenant un espace de noms <slug>-generator.
Il y a deux façons de transformer les cas de test :
Pour mettre à jour des cas de test individuels, définis la fonction suivante :
(defn update-test-case
"Update a test case"
[test-case]
;; function body
)
Cet exemple supprime tous les éléments de la valeur :path sauf le dernier (ce qui raccourcit la description) :
(ns difference-of-squares-generator)
(defn update-test-case [test-case]
(update test-case :path #(take-last 1 %)))
Pour ajouter ou supprimer des cas de test, définis la fonction suivante :
(defn add-remove-test-cases
"Add/remove test case(s)"
[test-cases]
;; function body
)
Si tu définis les deux fonctions, add-remove-test-cases est appelée en premier, puis update-test-case.
Les cas de test (éventuellement transformés) sont ensuite transmis au fichier .meta/generator.tpl, qui définit comment effectuer le rendu des tests à partir de ces cas de test.
Le gabarit rendu est ensuite mis en forme avec cljfmt. Cela présente les avantages suivants :
Enfin, la sortie du gabarit rendu est écrite dans le fichier de test de l'exercice.
Les gabarits sont rendus à l'aide de la bibliothèque hbs, qui prend en charge la syntaxe handlebars (via handlebars.java).
Le générateur de tests peut être lancé de deux façons :
bin/generate-tests : génère les tests de tous les exercices qui disposent d'un gabarit de générateurbin/generate-tests <slug> : génère les tests de l'exercice indiqué, s'il dispose d'un gabarit de générateur