Диагностика решения: тесты, контрпримеры и локализация ошибки
Автор: Казачкин Даниил Михайлович · Обновлено
Отладка — это поиск причины ошибки в программе. Тестирование — проверка решения на заранее выбранных примерах. Для школьника эти навыки так же важны, как условия, циклы и списки, потому что большинство неправильных ответов появляется из-за невнимательности к деталям.
Начинайте тестирование не с большого набора данных, а с простого примера, который можно проверить вручную. Затем добавляйте граничные случаи: минимальное значение, одно число, пустую строку, одинаковые элементы, отрицательные числа, максимальную границу.
Печать промежуточных значений
Самый доступный способ отладки — временно вывести значения переменных.
numbers = [2, 4, 6]
total = 0
for number in numbers:
total += number
print('number =', number, 'total =', total)
print('answer =', total)После того как ошибка найдена, отладочные print нужно убрать, чтобы программа выводила только ответ.
Проверка функции тестами
Если часть решения оформлена функцией, ее удобно проверять отдельно.
def digit_sum(number):
total = 0
while number > 0:
total += number % 10
number //= 10
return total
assert digit_sum(123) == 6
assert digit_sum(900) == 9
assert digit_sum(0) == 0Третий тест показывает ошибку: текущая функция возвращает 0 для нуля, и это может быть правильным ответом, если условие просит сумму цифр числа. Такой пример нужно явно продумать, а не надеяться, что он не встретится.
Чек-лист перед отправкой
- Правильно ли прочитаны все входные данные?
- Совпадает ли формат вывода с условием?
- Проверены ли границы диапазонов?
- Нет ли деления на ноль?
- Работает ли код на минимальном примере?
Отладка экономит время на ОГЭ, ЕГЭ и олимпиадах. Вместо случайных исправлений школьник получает понятный процесс: воспроизвести ошибку, увидеть значения переменных, найти место расхождения с идеей и проверить исправление на нескольких тестах.
Практикум: локализация ошибки в среднем значении
Возьмите программу, которая читает числа, фильтрует отрицательные и вычисляет среднее, но даёт неверный ответ. Сначала запишите ожидаемый результат для набора 5, -2, 7, 0. Затем сократите вход до минимального, на котором дефект сохраняется. Проверьте состояние после чтения, после фильтра и перед делением; добавляйте диагностический вывод только на одной границе за раз. После исправления превратите найденный пример в assert, удалите временные сообщения и убедитесь, что исходный набор тоже проходит.
Контрольная точка
Чем симптом отличается от причины? Неверное среднее — симптом; причиной может быть ошибочный фильтр, неправильный счётчик или деление не на то значение. Назовите факт, который подтвердит каждую гипотезу.
Частые вопросы
Почему много print иногда мешает отладке?
Поток несвязанных значений затрудняет поиск первого неверного состояния. Полезнее печатать именованные данные на выбранной границе алгоритма, сравнивать их с ожиданием и постепенно сужать участок, где появляется расхождение.
Источники
- Босова Л.Л. Информатика. Базовый курс: учебник для 7-9 классов. - М.: БИНОМ. Лаборатория знаний.
- Поляков К.Ю., Еремин Е.А. Информатика. 10-11 классы. Углубленный уровень.
- Python Documentation: The Python Tutorial.