Перейти к основному содержимому

Один тест, много случаев

Большинству функций нужна одна и та же проверка для многих входных данных: обычные значения, отрицательные значения, ноль, граничные случаи. Если скопировать тест пять раз, получится пять мест, которые придётся поддерживать.

Обычное решение — табличный тест: поместите случаи в массив объектов — каждый случай содержит имя, входные данные и ожидаемый результат — и пройдите по ним одним циклом.

Добавление нового случая превращается в одну новую строку таблицы. Это самый распространённый шаблон тестов, который вы встретите в реальном коде.


Таблица

Таблица — это массив объектов с именованным типом, который пишется прямо рядом с тестом. Каждый элемент — один случай: имя (для сообщения об ошибке), входные данные и ожидаемый результат.

Цикл вызывает функцию по одному разу для каждого случая и сравнивает результат. Первое несовпадение выбрасывает ошибку и завершает тест, поэтому сообщение содержит имя случая — так вы узнаёте, какая строка сломалась.

Четыре случая в одной таблице

Четыре случая, один цикл, одна проверка. Здесь все проходят, поэтому запуск выводит одну строку ✔ add over the table. Чтобы проверить пятую ситуацию, вы добавите одну строку в таблицу — цикл останется без изменений.

Prompt
Напишите табличный тест на TypeScript для функции add: типизированный массив объектов с именем случая, двумя числовыми входными значениями и ожидаемым результатом, покрывающий случаи one plus one, positive and negative, both negative и zeros. Пройдите по таблице циклом внутри одного теста и подставьте имя случая в сообщение проверки. Покажите вывод.
Вывод: программа на TypeScript и захваченный вывод
Four cases in one table

Подтесты

Вызов t.test(name, fn) внутри теста превращает каждый случай таблицы в отдельный подтест. Внешняя тестовая функция получает контекст теста t в качестве аргумента, и каждый случай ожидается через await, чтобы он завершился до начала следующего.

Теперь имена случаев появляются в выводе с отступом под родительским тестом, каждое со своим ✔ или ✖. Благодаря этому сломанный случай легко заметить в длинной таблице.

У каждого случая есть имя

Та же таблица, обёрнутая в t.test. Теперь вывод перечисляет все четыре случая по отдельности под ▶ add, а итог насчитывает пять тестов: родительский плюс его четыре подтеста.

Prompt
Напишите тот же табличный тест на TypeScript для функции add, но выполните каждый случай как подтест с await и t.test, используя имя случая, чтобы каждый случай появился в выводе отдельно. Покажите вывод со всеми строками подтестов.
Вывод: программа на TypeScript и захваченный вывод

Запуск одного случая отдельно

Тесты можно выбирать из командной строки по имени с помощью --test-name-pattern:

node --test --test-reporter=spec --test-name-pattern 'both negative'

Шаблон сопоставляется с именем каждого зарегистрированного теста. Подтест нельзя выбрать сам по себе — если родительский тест не подходит, ничего внутри него не запускается — поэтому, чтобы это работало, каждый случай получает собственный вызов test(…) верхнего уровня с именем случая внутри.

Это отлично подходит, когда вы чините один сломанный случай: перезапускайте только его, пока он не станет зелёным, а потом запустите всё снова.

Фильтрация по имени

Таблица регистрируется как четыре отдельных теста с именами add: one plus one и так далее. При запуске с шаблоном both negative выполняется только один из четырёх — в итоге указано tests 1.

Prompt
Зарегистрируйте ту же таблицу для add как четыре отдельных теста верхнего уровня, названных по именам случаев, а затем покажите вывод запуска только одного из них с помощью опции --test-name-pattern 'both negative' средства запуска тестов.
Вывод: программа на TypeScript и захваченный вывод