Scopri i generatori di test

Scopri come il track di Clojure usa i generatori di test per generare i test degli esercizi


Il track Clojure usa un generatore di test per generare automaticamente i test degli esercizi di pratica. Sfrutta il fatto che la maggior parte degli esercizi definiti nel repo problem-specifications ha anche un file canonical-data.json, che contiene input e output di test standardizzati utilizzabili per implementare l'esercizio.

Fasi

Per generare i test di un esercizio di pratica, il generatore di test:

  1. Legge i casi di test dell'esercizio dal suo file canonical-data.json
  2. Usa il file tests.toml per omettere i casi di test esclusi
  3. Trasforma i casi di test (opzionale)
  4. Renderizza i casi di test usando il template del generatore dell'esercizio
  5. Formatta il template renderizzato usando cljfmt
  6. Scrive il template formattato nel file di test dell'esercizio

Fase 1: leggere il file canonical-data.json

Il generatore di test interpreta i casi di test dal file canonical-data.json dell'esercizio usando la libreria clojure/data.json.

Poiché alcuni dati canonici usano l'annidamento, il caso di test interpretato include un campo path aggiuntivo che contiene le proprietà description di eventuali elementi genitori, oltre alla proprietà description del caso di test stesso.

Nota: le chiavi vengono interpretate come keyword.

Fase 2: omettere i test esclusi dal file tests.toml

Ogni esercizio ha un file tests.toml, in cui i singoli test possono essere esclusi/disabilitati. Il generatore di test rimuoverà tutti i casi di test contrassegnati come esclusi (include = false).

Fase 3: trasformare i casi di test (opzionale)

Alcuni esercizi potrebbero richiedere qualche ritocco prima di renderizzare i dati. Per esempio, potresti voler rendere la descrizione meno verbosa.

Per ritoccare i casi di test, definisci un file .meta/generator.clj con un namespace <slug>-generator. Puoi trasformare i casi di test in due modi:

  • Aggiornare i casi di test
  • Aggiungere/rimuovere casi di test

Aggiornare i casi di test

Per aggiornare singoli casi di test, definisci la seguente funzione:

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

Questo esempio rimuove tutti gli elementi tranne l'ultimo del valore :path (accorciando la descrizione):

(ns difference-of-squares-generator)

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

Aggiungere o rimuovere casi di test

Per aggiungere o rimuovere casi di test, definisci la seguente funzione:

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

Se definisci entrambe le funzioni, add-remove-test-cases viene chiamata per prima e update-test-case per seconda.

Fase 4: renderizzare i casi di test

I casi di test (potenzialmente trasformati) vengono poi passati al file .meta/generator.tpl, che definisce come devono essere renderizzati i test in base a quei casi di test.

Fase 5: formattare il template renderizzato usando cljfmt

Il template renderizzato viene poi formattato usando cljfmt. Questo offre i seguenti vantaggi:

  • Gli esercizi vengono formattati in modo coerente
  • Non devi preoccuparti più di tanto degli spazi e dell'allineamento quando scrivi i template

Fase 6: scrivere il template renderizzato nel file di test dell'esercizio

Infine, l'output del template renderizzato viene scritto nel file di test dell'esercizio.

Template

I template vengono renderizzati usando la libreria hbs, che supporta la sintassi handlebars (tramite handlebars.java).

Interfaccia a riga di comando

Il generatore di test può essere eseguito in due modi:

  1. bin/generate-tests: genera i test per tutti gli esercizi che hanno un template del generatore
  2. bin/generate-tests <slug>: genera i test per l'esercizio specificato, se ha un template del generatore