Aprende cómo el track de Clojure usa generadores de tests para generar tests para los ejercicios
El track de Clojure usa un generador de tests para generar automáticamente los tests de los ejercicios de práctica.
Se basa en que la mayoría de los ejercicios definidos en el repositorio problem-specifications también tienen un fichero canonical-data.json, que contiene entradas y salidas de test estandarizadas que se pueden usar para implementar el ejercicio.
Para generar los tests de un ejercicio de práctica, el generador de tests:
canonical-data.json
tests.toml para omitir los casos de test excluidoscanonical-data.json
El generador de tests parsea los casos de test del canonical-data.json del ejercicio con la biblioteca clojure/data.json.
Como algunos datos canónicos usan anidamiento, el caso de test parseado incluye un campo path adicional que contiene las propiedades description de los elementos padre, además de la propiedad description del propio caso de test.
Nota: las claves se parsean como keywords.
tests.toml
Cada ejercicio tiene un fichero tests.toml en el que se pueden excluir o desactivar tests concretos.
El generador de tests eliminará los casos de test que estén marcados como excluidos (include = false).
Algunos ejercicios pueden necesitar algunos ajustes antes de renderizar los datos. Por ejemplo, puede que quieras hacer que la descripción sea menos verbosa.
Para ajustar los casos de test, define un fichero .meta/generator.clj con un namespace <slug>-generator.
Hay dos formas de transformar los casos de test:
Para actualizar casos de test concretos, define la siguiente función:
(defn update-test-case
"Update a test case"
[test-case]
;; function body
)
Este ejemplo elimina todos los elementos menos el último del valor de :path (acortando la descripción):
(ns difference-of-squares-generator)
(defn update-test-case [test-case]
(update test-case :path #(take-last 1 %)))
Para añadir o eliminar casos de test, define la siguiente función:
(defn add-remove-test-cases
"Add/remove test case(s)"
[test-cases]
;; function body
)
Si defines ambas funciones, se llama primero a add-remove-test-cases y después a update-test-case.
Los casos de test (posiblemente transformados) se pasan entonces al fichero .meta/generator.tpl, que define cómo deben renderizarse los tests a partir de esos casos de test.
La plantilla renderizada se formatea entonces con cljfmt. Esto tiene las siguientes ventajas:
Por último, la salida de la plantilla renderizada se escribe en el fichero de test del ejercicio.
Las plantillas se renderizan con la biblioteca hbs, que admite la sintaxis de handlebars (usando handlebars.java).
Hay dos formas de ejecutar el generador de tests:
bin/generate-tests: genera los tests de todos los ejercicios que tengan una plantilla de generadorbin/generate-tests <slug>: genera los tests del ejercicio indicado, si tiene una plantilla de generador