Aprende cómo el track de Clojure usa generadores de pruebas para generar las pruebas de los ejercicios
El track de Clojure usa un generador de tests para generar automáticamente los tests de los ejercicios de práctica.
Aprovecha que la mayoría de los ejercicios definidos en el repositorio problem-specifications también tienen un archivo 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 analiza los casos de test del canonical-data.json del ejercicio usando la librería clojure/data.json.
Como algunos datos canónicos usan anidamiento, el caso de test analizado incluye un campo path adicional que contiene las propiedades description de cualquier elemento padre, así como la propiedad description del propio caso de test.
Nota: las claves se analizan como keywords.
tests.toml
Cada ejercicio tiene un archivo tests.toml, en el que se pueden excluir o deshabilitar tests individuales.
El generador de tests eliminará cualquier caso de test que esté marcado como excluido (include = false).
Algunos ejercicios pueden necesitar algunos ajustes antes de renderizar los datos. Por ejemplo, quizás quieras hacer que la descripción sea menos verbosa.
Para ajustar los casos de test, define un archivo .meta/generator.clj con un espacio de nombres <slug>-generator.
Hay dos formas en las que puedes transformar los casos de test:
Para actualizar casos de test individuales, define la siguiente función:
(defn update-test-case
"Update a test case"
[test-case]
;; function body
)
Este ejemplo elimina todos los elementos excepto el último del valor :path (acortando la descripción):
(ns difference-of-squares-generator)
(defn update-test-case [test-case]
(update test-case :path #(take-last 1 %)))
Para agregar 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 archivo .meta/generator.tpl, que define cómo se deben renderizar los tests a partir de esos casos de test.
La plantilla renderizada se formatea luego usando cljfmt. Esto tiene los siguientes beneficios:
Por último, la salida de la plantilla renderizada se escribe en el archivo de tests del ejercicio.
Las plantillas se renderizan usando la librería 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 especificado, si tiene una plantilla de generador