Тестирование функции подсчёта результатов любительской лиги

Небольшая таблица условной лиги рядом с результатами программных тестов

Функцию очков любительской лиги удобно тестировать отдельно от таблицы на странице. Сначала нужно записать правила. Для учебного примера договоримся: за победу три очка, за ничью по одному, за поражение ноль. Это условный регламент, а не утверждение о правилах любого реального турнира.

Функция очков и отдельный запускаемый тест

points.mjs

export function pointsFor(home, away) {
  if (![home, away].every(x => Number.isInteger(x) && x >= 0)) {
    throw new TypeError('Счёт должен состоять из неотрицательных целых');
  }
  if (home === away) return [1, 1];
  return home > away ? [3, 0] : [0, 3];
}

test.mjs

import assert from 'node:assert/strict';
import { pointsFor } from './points.mjs';
assert.deepEqual(pointsFor(2, 0), [3, 0]);
assert.deepEqual(pointsFor(0, 2), [0, 3]);
assert.deepEqual(pointsFor(0, 0), [1, 1]);
assert.deepEqual(pointsFor(3, 3), [1, 1]);
for (const pair of [[-1, 0], [1.5, 0], ['2', 0], [NaN, 1]]) {
  assert.throws(() => pointsFor(...pair), TypeError);
}
console.log('Проверки пройдены');

Сохраните файлы рядом и выполните node test.mjs. Используется встроенный node:assert/strict, отдельный пакет не нужен. Официальная документация Node описывает строгий режим сравнений; в нём строка и число не должны незаметно считаться одинаковыми. При нарушении ожидания команда завершится ошибкой, а не только напечатает сообщение.

Тестовые классы, а не случайные примеры
Что сравнить На что смотреть Что сделать
Победа хозяев Проверка первой ветки Ожидаются [3, 0]
Победа гостей Проверка симметрии Ожидаются [0, 3]
Ничья Нулевая и ненулевая Ожидаются [1, 1]
Неверный ввод Дробь, строка, отрицательное и NaN Ожидается исключение

Не тестируйте только удобный счёт

Один тест 2:0 не обнаружит ошибку ничьей или перепутанные позиции. Проверяйте смысловые группы и границы. Добавить тысячу похожих побед хозяев менее полезно, чем покрыть гостевую победу и неверный тип. При изменении регламента сначала обновите явно сформулированное правило и ожидания, затем код.

  • Проверить обе стороны победы.
  • Отдельно проверить нулевую ничью.
  • Отклонить нецелые и нечисловые значения.
  • Не делать DOM обязательным условием вычислительного теста.

Эта функция не строит полную турнирную таблицу. Здесь нет снятий команд, штрафных очков, технических результатов и критериев равенства. В реальной лиге их определяет подтверждённый регламент. Не добавляйте скрытые правила в функцию из личного опыта другого соревнования.

Вопросы и ответы

Почему массив, а не сумма очков?

Нужно сохранить результат для каждой стороны. Контракт возвращает две позиции в известном порядке.

Зачем проверять строки?

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

Тесты доказывают правильность всего сайта?

Нет. Они проверяют конкретный контракт функции. Вывод таблицы и получение данных требуют своих проверок.

Нужно ли внешнее тестовое окружение?

Для этого маленького примера достаточно Node и встроенных assertions. Более сложные сценарии могут потребовать другого инструмента.

Источники: nodejs.org.

Похожие записи