#1 Начало работы, запуск теста и отладки- Pascal-js-intro

После того, как проект открыт в vs-codium, с помощью команды в терминале в корне проекта:

 npm ci

мы подтянули пакеты, в числе которых jest.

Jest представляет собой фреймворк для налаживания юнит теститорвания (junit testing) JavaScript. Unit testing - это тестирование отдельных модулей исходного кода.

Т.к. pascal.js-intro является интерпретатором языка программирования, у нас всегда имеются чёткие входные данные (код программы на яп) и ожидаемые результаты работы интерпретатора. Поэтому в данном проекте используется т.н. приемочное тестирование (acceptance testing) - процесс тестирования, который проверяет соответствие системы приемочным критериям.

Как устроен тест

Каждый тест состоит из входных данных и сценария теста. Jest ожидает, что все тесты находятся в директории __tests__:

Входные данные для нашего теста представлены файлом с кодом base.code. Данный файл содержит последовательность некоторых выражений (в стартовом состоянии проекта это просто арифметические выражения), разделяемых символом переноса строки.

Файл base.js является сценарием теста.

Что происходит при запуске

При выполнении запуска в режиме jest current среда NodeJs запустит скрипт jest, который получит путь к файлу base.js в качестве аргумента и выполнит его содержимое (для этого файл base.js должен быть открыт при запуске).

При выполнении сценария тестирования base.js в общих чертах происходит следующее:

  • 1. Функция runFile() получает на вход путь к файлу с кодом base.code и передаёт его объекту класса PascalJs.
  • 2. Класс PascalJs имеет свойство engine - движок, который и выполнит код из base.code. В нашем случае движок просто построчно вычисляет выражения и сохраняет результаты в массив.
  • 3. Далее функция test() выполняет проверку одного выражения. В качестве аргументов она принимает строку - некоторое описание теста, и функцию-обёртку, внутри которой вызывается expect(). В качестве аргумента expect() передаётся вычисленное значение выражения, которое мы хотим проверить. Expect() возвращает объект, имеющий ряд методов для сопоставления полученного значения с ожидаемым. В данном случае используется метод toBe(), который подходит для сравнения примитивных значений. В качестве аргумента toBe() передаётся ожидаемое значение вычисленного выражения. Функции test() и expect() являются глобальными функциями jest, поэтому доступны в base.js без импорта.

В итоге

При успешном выполнении, получим что-то вроде:

Дальше можно добавлять новые проверки, редактируя base.js, или добавить свой тест, поместив его, например, в папку new-test внутри __tests__.

Какие тесты работают на старте, а какие нет

Понять какая команда какие тесты запускает, можно посмотреть раздел scripts в файле package.json

Сразу после клонирования репозитория и установки зависимостей должен проходить стартовый тест:

npm run test_start

При это общий запуск всех тестов:

npm test

-- не должен успешно выполняться, в т.ч. потому, что репозий на старте не поддерживает работу с унарным минусом, про это будет задача, решение которой мы будем проверть в т.ч. командой (на старте проека будет завершаться ошибкой):

npm run test_unminis

При сдаче задач мы будем создавать новые папки в базовую директорию тестов tests/__tests__/ по аналогии с изначально добавленными:

  • tests/__tests__/base - базовый пример теста, работает сразу
  • tests/__tests__/task1_unminus - набор тестов для проверки работы унарного минуса (требуется добавить поддержку в коде проекта, изначально проверка не выполняется)

Корректное состояние тестов в процессе работы

В концу выполнения очередной задачи, начиная с первой, запуск всех тестов:

npm test

-- должен проходить успешно.

Видео-материалы

Key Words for FKN + antitotal forum (CS VSU):