Как проверять обработку граничных дат, например февраль и високосный год
Что проверяют
Знаете ли вы точное правило високосного года и умеете ли превратить его в набор граничных значений, а не ограничиться 29 февраля 2024. Следом обычно спрашивают, как проверить поведение, зависящее от текущей даты, не дожидаясь февраля.
Как отвечать
Начните с правила: год високосный, если делится на 4, кроме тех, что делятся на 100, но не на 400. Отсюда 2024 и 2000 високосные, а 2025, 1900 и 2100 нет. Ошибка реализации обычно прячется именно в вековых годах.
Дальше разложите проверки по классам:
- ввод даты: 28.02 принимается в любом году; 29.02.2024 и 29.02.2000 принимаются; 29.02.2025 и 29.02.1900 отклоняются; 30.02 и 31.04 отклоняются всегда;
- арифметика: 31.01 плюс месяц даёт 28.02 или 29.02 в зависимости от года; 29.02.2024 плюс год даёт 28.02.2025 или 01.03.2025, это надо уточнить в требованиях;
- переходы: 28.02 на 01.03 в невисокосный год, 31.12 на 01.01, число дней в периоде через конец февраля (проценты, сроки доставки, подписка на месяц);
- день рождения 29 февраля: когда человеку исполняется 18 в невисокосный год и в какой день приходит поздравление;
- часовые пояса: событие 1 марта в 01:30 по Москве в UTC ещё относится к 28 февраля, и отчёт за месяц может посчитать его не туда;
- формат:
02/03это 2 марта или 3 февраля в зависимости от локали.
Чтобы не ждать календаря, время подменяют: в автотестах на Python через freezegun или time-machine, на Java через внедрённый Clock, на стенде через системное время или параметр конфигурации, если разработчики его предусмотрели. Об этом стоит договориться заранее.
Где спотыкаются
Проверяют правило «делится на 4» и забывают про 1900 и 2100. Именно такие реализации проходят все тесты с 2024 годом.
Тестируют только ввод и не трогают вычисления. Форма корректно принимает 29.02, а отчёт за месяц или продление подписки ломается на следующем шаге.
Не фиксируют ожидаемый результат для спорных случаев вроде «29.02 плюс год» и заводят баг там, где просто нет требования. Сначала вопрос аналитику, потом тест-кейс.