Aprende sobre los generadores de pruebas

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.

Pasos

Para generar los tests de un ejercicio de práctica, el generador de tests:

  1. Lee los casos de test del ejercicio desde su archivo canonical-data.json
  2. Usa el archivo tests.toml para omitir los casos de test excluidos
  3. Transforma los casos de test (opcional)
  4. Renderiza los casos de test usando la plantilla del generador del ejercicio
  5. Formatea la plantilla renderizada usando cljfmt
  6. Escribe la plantilla formateada en el archivo de tests del ejercicio

Paso 1: leer el archivo canonical-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.

Paso 2: omitir los tests excluidos del archivo 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).

Paso 3: transformar los casos de test (opcional)

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:

  • Actualizar caso(s) de test
  • Agregar o eliminar caso(s) de test

Actualizar caso(s) 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
)
Ejemplo

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

Agregar o eliminar caso(s) de test

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

Si defines ambas funciones, se llama primero a add-remove-test-cases y después a update-test-case.

Paso 4: renderizar los casos de test

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.

Paso 5: formatear la plantilla renderizada usando cljfmt

La plantilla renderizada se formatea luego usando cljfmt. Esto tiene los siguientes beneficios:

  • Los ejercicios se formatean de forma consistente
  • No tienes que preocuparte mucho por los espacios en blanco y la alineación al escribir plantillas

Paso 6: escribir la plantilla renderizada en el archivo de tests del ejercicio

Por último, la salida de la plantilla renderizada se escribe en el archivo de tests del ejercicio.

Plantillas

Las plantillas se renderizan usando la librería hbs, que admite la sintaxis de handlebars (usando handlebars.java).

Interfaz de línea de comandos

Hay dos formas de ejecutar el generador de tests:

  1. bin/generate-tests: genera los tests de todos los ejercicios que tengan una plantilla de generador
  2. bin/generate-tests <slug>: genera los tests del ejercicio especificado, si tiene una plantilla de generador