Знайомство з генераторами тестів

Дізнайтеся, як трек Clojure використовує генератори тестів для створення тестів до вправ


Трек Clojure використовує генератор тестів, щоб автоматично генерувати тести практичних вправ. Він спирається на те, що більшість вправ, визначених у репозиторії problem-specifications, також мають файл canonical-data.json, який містить стандартизовані вхідні та вихідні дані тестів, що їх можна використати для реалізації вправи.

Кроки

Щоб згенерувати тести практичної вправи, генератор тестів:

  1. Читає тестові випадки вправи з її файлу canonical-data.json
  2. Використовує файл tests.toml, щоб пропустити виключені тестові випадки
  3. Перетворює тестові випадки (необовʼязково)
  4. Рендерить тестові випадки за допомогою шаблону генератора вправи
  5. Форматує відрендерений шаблон за допомогою cljfmt
  6. Записує відформатований шаблон у файл тестів вправи

Крок 1: читання файлу canonical-data.json

Генератор тестів розбирає тестові випадки з файлу canonical-data.json вправи за допомогою бібліотеки clojure/data.json.

Оскільки деякі канонічні дані мають вкладену структуру, розібраний тестовий випадок містить додаткове поле path з властивостями description усіх батьківських елементів, а також власну властивість description тестового випадку.

Зауваження: ключі розбираються як ключові слова.

Крок 2: пропуск виключених тестів із файлу tests.toml

Кожна вправа має файл tests.toml, у якому окремі тести можна виключити/вимкнути. Генератор тестів прибирає всі тестові випадки, позначені як виключені (include = false).

Крок 3: перетворення тестових випадків (необовʼязково)

Деяким вправам перед рендерингом даних можуть знадобитися невеликі правки. Наприклад, нам може знадобитися зробити опис менш докладним.

Щоб підправити тестові випадки, створіть файл .meta/generator.clj із простором імен <slug>-generator. Перетворювати тестові випадки можна двома способами:

  • Оновлення тестових випадків
  • Додавання й видалення тестових випадків

Оновлення тестових випадків

Щоб оновити окремі тестові випадки, створіть таку функцію:

(defn update-test-case
  "Update a test case"
  [test-case]
  ;; function body
)
Приклад

У цьому прикладі залишається лише останній елемент значення :path (це скорочує опис):

(ns difference-of-squares-generator)

(defn update-test-case [test-case]
  (update test-case :path #(take-last 1 %)))

Додавання й видалення тестових випадків

Щоб додати або видалити тестові випадки, створіть таку функцію:

(defn add-remove-test-cases
  "Add/remove test case(s)"
  [test-cases]
  ;; function body
)
Note

Якщо визначити обидві функції, спочатку викликається add-remove-test-cases, а потім update-test-case.

Крок 4: рендеринг тестових випадків

Далі (можливо, вже перетворені) тестові випадки передаються у файл .meta/generator.tpl, який визначає, як саме рендерити тести на основі цих тестових випадків.

Крок 5: форматування відрендереного шаблону за допомогою cljfmt

Далі відрендерений шаблон форматується за допомогою cljfmt. Це дає такі переваги:

  • Вправи форматоються однаково
  • Пишучи шаблони, не потрібно особливо дбати про пробіли та вирівнювання

Крок 6: запис відрендереного шаблону у файл тестів вправи

Насамкінець результат відрендереного шаблону записується у файл тестів вправи.

Шаблони

Шаблони рендеряться за допомогою бібліотеки hbs, яка підтримує синтаксис handlebars (використовуючи handlebars.java).

Інтерфейс командного рядка

Генератор тестів можна запускати двома способами:

  1. bin/generate-tests: згенерувати тести для всіх вправ, які мають шаблон генератора
  2. bin/generate-tests <slug>: згенерувати тести для вказаної вправи, якщо вона має шаблон генератора