Shanraq.org Shanraq.org
Тесты и модули защищают изменения
Общество

Информатика: создаём своего цифрового помощника Урок 37 из 38

Тесты и модули защищают изменения

Превратим бумажные примеры в исполняемые тесты и разделим программу на понятные части.

Где мы на карте

Это урок 37 из 72 и часть блока Python (уроки 27–38). Опорная схема показывает проверяемые переходы. Продолжаем бумажный договор версии 0.3: пять исходов напоминания и исходные вымышленные задачи.

Тесты и модули защищают изменения

Ситуация и вопрос

Вчера помощник правильно напоминал о сроке. После добавления новой команды done он вдруг стал напоминать и о выполненных задачах. Как заметить это до передачи программы другу? Попросим компьютер повторять прежние проверки после каждого изменения.

Новые слова без пропусков

Модуль — файл Python, который можно импортировать: assistant_core.py хранит правила, assistant.py — команды. Импорт делает имя из модуля доступным другому файлу. Тест — выполняемая проверка входа и ожидаемого результата; assert сообщает о несовпадении. Модульный тест проверяет небольшую функцию отдельно; сквозной тест запускает команду через файл и смотрит результат. Регрессия — возвращение старой ошибки после изменения. Фикстура — подготовленные тестовые данные. Неправильное ожидаемое значение делает тест бесполезным, поэтому сначала сверяем его с бумажным договором.

Опорный сигнал

Вход → проверка правила → изменение состояния → наблюдаемый результат. Покажите пальцем, на каком шаге программа читает данные, где сравнивает их с договором и где только сообщает результат. Если шага не видно на схеме, найдите его в коде и добавьте в собственную трассу.

Разбираем шаг за шагом

Возьмите таблицу из версии 0.3: выполнено → DONE, срока нет → NO_DATE, срок прошёл → OVERDUE, сегодня или два дня до срока → REMIND, более двух дней → NOT_YET. Сделайте отдельную проверку каждого случая; пример показывает самый короткий assert. Затем поменяйте условие <= 2 на < 2: тест границы в два дня обязан упасть. Верните правило и проверьте все случаи. Тест на дубликат id нужен отдельно от теста даты: он защищает другой договор.

Предскажите и проверьте

Закройте блок с выводом. По строкам проследите значения имён и напишите точный ожидаемый текст, включая регистр и порядок строк. Только затем выполните код из каталога step-03 командой python3 и сравните посимвольно. Поменяйте один вход; до запуска запишите новый прогноз. Если результат отличается, найдите первую строку расхождения, а не подгоняйте ответ задним числом.

from datetime import date
from assistant_core import reminder_status
task = {"done": False, "due_date": "2026-10-11"}
actual = reminder_status(task, date(2026, 10, 9))
assert actual == "REMIND"
print("Boundary test passed")

Ожидаемый вывод

Boundary test passed

Поймайте ошибку

Тест assert result == result всегда проходит, даже когда результат неверен. Тест, который использует сегодняшний день без фиксации даты, может проходить сегодня и падать завтра. Запишите заранее точный ожидаемый выход и передавайте today явно.

Изменение проекта

tests/test_assistant.py запускается одной командой python3 -m unittest discover -s tests -v. Правила, файл и CLI проверяются независимо. Три вымышленные записи версии 0.2 остаются исходными данными, а новые тесты используют временные копии, не подменяя их.

Задание и доказательство

Создайте тесты для пяти исходов напоминания, подсчёта 0 и 3 выполненных, повторного id, неверного февраля и сохранения Ә. Добавьте один сквозной тест add → done → повторное чтение. Сначала намеренно испортите правило, убедитесь, что тест падает, затем верните и запишите команду запуска всей проверки.

Перенос в новую ситуацию

В школьной викторине исправили подсчёт баллов. Какой прежний тест мог поймать случай, когда верный ответ снова оценивается в ноль? Придумайте вход, ожидаемый выход и границу, которую следует проверять отдельно.

Возврат через 1, 7 и 30 дней

Через 1 день восстановите правило и один граничный пример без страницы. Через 7 дней объясните ошибку в новом примере однокласснику. Через 30 дней повторите тест проекта, проверьте, что прежние записи и вывод сохранились, и снова перенесите правило на другую задачу.

Следующий урок

Далее: Выпуск 1.0: консольный цифровой помощник

Если вы нашли ошибку или опечатку в тексте статьи, то сообщите нам об этом

Проверить доказательство проекта

Запишите наблюдение, объяснение, исправление ошибки и изменение своего проекта. Модель укажет первую перепутанную или недоказанную связь, но не даст готовый ответ.

Чтобы проверить, нужно войти. Войти

Комментарии (0)

Пока нет комментариев. Будьте первым.