Тестування на треку YAMLScript

Як тестувати свої вправи з YAMLScript на Exercism


Тестувати рішення вправ Exercism, написані мовою YAMLScript, надзвичайно легко. Легко запускати й легко розуміти.

Просто запустіть make test у каталозі вправи.

Коли ми вперше запускаємо make test, усі тести проваляться, просто тому що ми ще не написали жодного коду, який би їх проходив.

Звичайний процес роботи над вправою - почати з make test, а потім зосередитися на одному тесті за раз, пишучи код, щоб цей тест пройшов. Коли всі тести проходять, роботу завершено!

Бонусом запуск make test також подбає про те, щоб потрібна версія інтерпретатора ys YAMLScript (та, якої вимагає поточна вправа) була встановлена у правильному місці (у /path/to/exercism/yamlscript/.local/). Це означає, що нам навіть не потрібно заздалегідь встановлювати ys, щоб почати!

Структура каталогу вправи

Якщо ми працюємо над вправою the-great-exercise, то команда exercism download --exercise=the-great-exercise --track=yamlscript створить каталог /path/to/exercism/yamlscript/the-great-exercise.

Усередині цього каталогу тестовий файл матиме назву the-great-exercise-test.ys, а файл програми-розвʼязку - the-great-exercise.ys. Також буде файл README.md з описом вправи та файл HELP.md з корисною інформацією на випадок, якщо ми застрягнемо.

Для make буде два файли: Makefile і GNUmakefile. Це (без каламбуру) гарантує, що для запуску тестів ми використовуємо GNU make, а не якусь іншу команду make, яка може бути встановлена в нашій системі. Файл GNUmakefile - справжній, і GNU make завжди віддасть йому перевагу над Makefile. Інші команди make використають Makefile, який має завершитися помилкою з повідомленням про те, що треба використовувати GNU make!

Будова тестового файлу

Тести YAMLScript написані мовою YAMLScript, звісно! Оскільки YAMLScript - це YAML, а YAML - це дані, тести, по суті, просто дані.

Ось приклад простого тестового файлу. Насправді це перші 3 тести з вправи acronym. :-)

#!/usr/bin/env ys-0

use ys::taptest: :all
load: 'acronym.ys'

test::
- name: Basic
  code: abbreviate('Portable Network Graphics')
  want: PNG

- name: Lowercase words
  code: abbreviate('Ruby on Rails')
  want: ROR

- name: Punctuation
  code: abbreviate('First In, First Out')
  want: FIFO

done: 3

Перший рядок - це shebang-рядок, який вказує команді prove (її запускає Makefile) використовувати інтерпретатор ys YAMLScript для запуску тестів замість perl, який є типовим для prove.

Другий рядок - це інструкція use, яка завантажує бібліотеку тестування TAP ys::taptest із YAMLScript.

Примітка: TAP - це простий текстовий інтерфейс між тестовими скриптами та тестовими рушіями, а prove - стандартний рушій для запуску TAP-тестів у Perl. Оскільки Perl такий поширений, використання TAP і prove виявляється дуже вдалим вибором для наборів тестів багатьма мовами (зокрема YAMLScript).

Інструкція use завантажує програму-розвʼязок acronym.ys, яку перевіряє цей тестовий файл.

Усі наші тести - це YAML-послідовність під ключем test.

Останній рядок done: обовʼязковий, і він повідомляє тестовому рушію, що всі тести справді виконалися. Число (необовʼязкове) - це кількість тестів, які ми очікували запустити.

Кожен тест (під ключем test) - це відображення з такими парами ключ-значення:

  • name: - назва тесту, яку виводить prove -v.
  • code: - код YAMLScript, який треба виконати. Цей код викличе якусь функцію з програми-розвʼязку, над якою ми працюємо.
  • what: - для тестів, у яких очікується помилка, значення - error. У звичайних тестах цієї пари немає.
  • want: - очікуваний результат тесту. Це значення YAML, і воно може бути рядком тексту (англ. string), числом, булевим значенням (англ. Boolean), послідовністю або відображенням. Якщо what: - це error, то це значення - очікуване повідомлення про помилку.
  • SKIP: - встановіть true, щоб пропустити цей тест.
  • ONLY: - встановіть true, щоб запускати лише цей тест. Якщо у нас більше ніж один тест ONLY:, кожен із них буде запущено.

Це, мабуть, усе, що потрібно знати, щоб займатися розробкою через тестування мовою YAMLScript у вправах Exercism!

Бібліотека ys::taptest має інші можливості, які можна використати для написання складніших тестів, але тести Exercism уже написано за нас. Щоб дізнатися більше про бібліотеку ys::taptest, загляньте до документації.