Aprende como o percurso de Clojure usa geradores de testes para gerar testes para os exercícios
O track de Clojure usa um gerador de testes para gerar automaticamente os testes dos exercícios de prática.
Baseia-se no facto de que a maioria dos exercícios definidos no repositório problem-specifications também tem um ficheiro canonical-data.json, com valores de entrada e de saída de teste normalizados que podem ser usados para implementar o exercício.
Para gerar os testes de um exercício de prática, o gerador de testes:
canonical-data.json
tests.toml para omitir e excluir casos de testecanonical-data.json
O gerador de testes analisa os casos de teste do ficheiro canonical-data.json do exercício com a biblioteca clojure/data.json.
Como alguns dados canónicos usam aninhamento, o caso de teste analisado inclui um campo path adicional, que contém as propriedades description de quaisquer elementos pais, bem como a própria propriedade description do caso de teste.
Nota: as chaves são analisadas como keywords.
tests.toml
Cada exercício tem um ficheiro tests.toml, no qual os testes individuais podem ser excluídos/desativados.
O gerador de testes remove os casos de teste que estejam marcados como excluídos (include = false).
Alguns exercícios podem precisar de alguns ajustes antes de renderizar os dados. Por exemplo, podes querer tornar a descrição menos verbosa.
Para ajustar os casos de teste, define um ficheiro .meta/generator.clj com um namespace <slug>-generator.
Há duas formas de transformar os casos de teste:
Para atualizar casos de teste individuais, define a seguinte função:
(defn update-test-case
"Update a test case"
[test-case]
;; function body
)
Este exemplo remove todos os elementos exceto o último do valor de :path (encurtando a descrição):
(ns difference-of-squares-generator)
(defn update-test-case [test-case]
(update test-case :path #(take-last 1 %)))
Para adicionar ou remover casos de teste, define a seguinte função:
(defn add-remove-test-cases
"Add/remove test case(s)"
[test-cases]
;; function body
)
Se definires ambas as funções, add-remove-test-cases é chamada primeiro e update-test-case depois.
Os casos de teste (potencialmente transformados) são depois passados ao ficheiro .meta/generator.tpl, que define como os testes devem ser renderizados com base nesses casos de teste.
O template renderizado é depois formatado com o cljfmt. Isto traz as seguintes vantagens:
Por fim, o resultado do template renderizado é escrito no ficheiro de teste do exercício.
Os templates são renderizados com a biblioteca hbs, que suporta a sintaxe handlebars (usando a handlebars.java).
Há duas formas de executar o gerador de testes:
bin/generate-tests: gera os testes de todos os exercícios que têm um template de geradorbin/generate-tests <slug>: gera os testes do exercício indicado, se este tiver um template de gerador