Aprende sobre los generadores de tests

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.

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 fichero canonical-data.json
  2. Usa el fichero 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 con cljfmt
  6. Escribe la plantilla formateada en el fichero de test del ejercicio

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

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

Paso 3: transformar los casos de test (opcional)

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:

  • Actualizar casos de test
  • Añadir o eliminar casos de test

Actualizar 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
)
Ejemplo

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

Añadir o eliminar casos de test

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
)
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 fichero .meta/generator.tpl, que define cómo deben renderizarse los tests a partir de esos casos de test.

Paso 5: formatear la plantilla renderizada con cljfmt

La plantilla renderizada se formatea entonces con cljfmt. Esto tiene las siguientes ventajas:

  • Los ejercicios se formatean de forma consistente
  • No tienes que preocuparte demasiado por los espacios en blanco y la alineación cuando escribes plantillas

Paso 6: escribir la plantilla renderizada en el fichero de test del ejercicio

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

Plantillas

Las plantillas se renderizan con la biblioteca 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 indicado, si tiene una plantilla de generador