Découvre les générateurs de tests

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.

Étapes

Pour générer les tests d'un exercice d'entraînement, le générateur de tests :

  1. Lit les cas de test de l'exercice dans son fichier canonical-data.json
  2. Utilise le fichier tests.toml pour omettre les cas de test exclus
  3. Transforme les cas de test (facultatif)
  4. Effectue le rendu des cas de test à l'aide du gabarit de générateur de l'exercice
  5. Met en forme le gabarit rendu avec cljfmt
  6. Écrit le gabarit mis en forme dans le fichier de test de l'exercice

Étape 1 : lis le fichier canonical-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.

Étape 2 : omets les tests exclus du fichier 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).

Étape 3 : transforme les cas de test (facultatif)

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 :

  • Mets à jour des cas de test
  • Ajoute ou supprime des cas de test

Mets à jour des 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
)
Exemple

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 %)))

Ajoute ou supprime des cas de test

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
)
Note

Si tu définis les deux fonctions, add-remove-test-cases est appelée en premier, puis update-test-case.

Étape 4 : effectue le rendu des cas de test

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.

Étape 5 : mets en forme le gabarit rendu avec cljfmt

Le gabarit rendu est ensuite mis en forme avec cljfmt. Cela présente les avantages suivants :

  • Les exercices sont mis en forme de manière cohérente
  • Tu n'as pas à te soucier outre mesure des espaces blancs et de l'alignement lorsque tu écris des gabarits

Étape 6 : écris le gabarit rendu dans le fichier de test de l'exercice

Enfin, la sortie du gabarit rendu est écrite dans le fichier de test de l'exercice.

Gabarits

Les gabarits sont rendus à l'aide de la bibliothèque hbs, qui prend en charge la syntaxe handlebars (via handlebars.java).

Interface en ligne de commande

Le générateur de tests peut être lancé de deux façons :

  1. bin/generate-tests : génère les tests de tous les exercices qui disposent d'un gabarit de générateur
  2. bin/generate-tests <slug> : génère les tests de l'exercice indiqué, s'il dispose d'un gabarit de générateur