В прошлом уроке классы эквивалентности сократили работу до одного представителя на класс: для диапазона 18-99 годится 45 для валидного класса и -5 для невалидного. Формально этого достаточно, чтобы проверить логику каждой ветки кода. Но практика тестирования показывает другое: баги концентрируются не там, где мы взяли представителя где-то в середине класса, а ровно на стыке между классами — на границе.
Чему научишься за этот урок:
— рассчитывать граничные точки числового диапазона;
— применять 2-точечный и 3-точечный метод проверки границ;
— находить классический баг off-by-one по описанию условия в коде.
Почему баги живут именно на границах
Разработчик пишет условие в коде почти всегда через оператор сравнения: если возраст >= 18, если количество <= 20. Самое частое место ошибки — перепутать «меньше» и «меньше или равно», забыть про «включительно» или «исключительно» в описании границы. Середина диапазона к этому оператору сравнения вообще не обращается — там просто нет кода, в котором можно ошибиться таким образом. Значит и багов там в разы меньше, чем на стыке классов.
2-точечный метод
2-точечный метод проверяет ровно стык между классами: саму границу и первое значение сразу за ней. Для диапазона 18-99: у нижней границы это 17 (за границей, невалидный) и 18 (граница, первое валидное значение). У верхней границы — 99 (граница, последнее валидное значение) и 100 (за границей). Итого 4 точки на диапазон с двумя границами.
3-точечный метод
3-точечный метод добавляет к каждой границе ещё одну точку — соседа с ДРУГОЙ стороны. Для нижней границы 18 это уже три значения: 17 (до границы), 18 (сама граница), 19 (после границы, ещё валидное). Такой набор точнее локализует проблему: если баг найден, три точки сразу показывают, сдвинута ли граница в коде целиком на одно значение или ошибка только с одной стороны. 2-точечный метод такой уверенности не даёт — он проверяет стык, но не проверяет, что происходит на один шаг дальше от него в обе стороны.
Классический баг: неверное условие сравнения
На нашем учебном полигоне у курса есть лимит группы — не больше 20 мест. Разработчик реализует проверку перед записью так: система смотрит, сколько человек уже записано (already_registered), и разрешает запись, если это число меньше или равно 20: если already_registered <= 20, то разрешить запись.
Кажется, что это то же самое, что «не больше 20». На деле — нет. Когда уже записано ровно 20 человек, условие 20 <= 20 всё ещё истинно — значит, система разрешит запись 21-му человеку, и группа станет из 21 человека, хотя лимит был 20. Правильное условие — already_registered < 20: разрешать запись, только пока записано СТРОГО меньше двадцати.
Диапазон «мест на курс»: допустимо 1 - 20 2-точечный метод (граница и сосед за ней): +--------+ +--------+ | 20 | | 21 | +--------+ +--------+ граница за границей 3-точечный метод (граница и соседи с обеих сторон): +--------+ +--------+ +--------+ | 19 | | 20 | | 21 | +--------+ +--------+ +--------+ до граница за границы границей
Итог:
— границы диапазона — место, где реально ошибаются программисты: перепутанный оператор сравнения (< вместо <=) встречается чаще, чем ошибка в середине диапазона;
— 2-точечный метод проверяет саму границу и соседа сразу за ней;
— 3-точечный метод добавляет соседа с другой стороны границы и даёт больше уверенности, особенно если нужно точно понять, где именно сдвинулось условие.
Контрольный вопрос. Поле «Возраст» принимает число от 18 до 99. Какая пара значений соответствует 2-точечной проверке НИЖНЕЙ границы?
Подсказка: 2-точечный метод берёт саму границу и соседа сразу за ней с невалидной стороны.
Проверить ответ →
Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →
Контрольный вопрос. Поле «Возраст» принимает число от 18 до 99. Какая тройка значений соответствует 3-точечной проверке ВЕРХНЕЙ границы?
Подсказка: Верхняя граница диапазона — число 99. Возьми его и по одному соседу с каждой стороны.
Проверить ответ →
Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →
Контрольный вопрос. Почему баги чаще концентрируются на границах диапазона, а не в его середине?
Подсказка: Вспомни рассуждение про код и оператор сравнения из середины урока.
Проверить ответ →
Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →
Контрольный вопрос. Сколько точек проверяет 3-точечный метод на ОДНУ границу диапазона?
Подсказка: Название метода прямо указывает на число точек.
Проверить ответ →
Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →
Контрольный вопрос. Какое число — точка «граница минус один» для НИЖНЕЙ границы этого диапазона? Ответь числом.
Поле принимает целое число от 1 до 10.
Подсказка: Нижняя граница диапазона — число 1. Отступи на один шаг ниже.
Проверить ответ →
Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →
Контрольный вопрос. Какое число — точка «граница плюс один» для ВЕРХНЕЙ границы этого диапазона? Ответь числом.
Поле принимает целое число от 1 до 10.
Подсказка: Верхняя граница диапазона — число 10. Отступи на один шаг выше.
Проверить ответ →
Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →
Контрольный вопрос. В каком случае имеет смысл применить именно 3-точечный метод, а не 2-точечный?
Подсказка: Вспомни, чем 3-точечный метод отличается от 2-точечного по числу проверяемых сторон границы.
Проверить ответ →
Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →
Задание. Перечисли все точки для 3-точечной проверки ОБЕИХ границ этого диапазона (нижней и верхней) — от меньшего значения к большему, через пробел, без запятых.
Поле «Количество билетов» принимает целое число от 1 до 4.
Подсказка: Для каждой из двух границ (1 и 4) возьми по три точки: граница минус один, сама граница, граница плюс один. Итого шесть чисел.
✅ Готово, если: ты ввёл(а) верный ответ, и онлайн-проверка его приняла.
Проверить ответ →
Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →
Задание. Какие два значения нужно добавить, чтобы 2-точечным методом проверить ещё и НИЖНЮЮ границу? Ответь через пробел, без запятых, от меньшего к большему.
Требование: поле «Оценка» принимает целое число от 1 до 5. Тестировщик уже проверил 2-точечным методом верхнюю границу: значения 5 и 6.
Подсказка: Нижняя граница диапазона — число 1. Возьми её и соседа с невалидной стороны.
✅ Готово, если: ты ввёл(а) верный ответ, и онлайн-проверка его приняла.
Проверить ответ →
Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →
Контрольный вопрос. Какие значения входят в 3-точечную проверку ВЕРХНЕЙ границы этого диапазона? Выбери все подходящие.
Поле «Стоимость товара» принимает число от 100 до 10000 (рублей).
Выберите все верные варианты.
Подсказка: Определи верхнюю границу диапазона и выбери точки вокруг неё по 3-точечному методу.
Проверить ответ →
Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →
Задание. Лимит группы — «не больше 20 человек» (already_registered — текущее число уже записавшихся). Напиши логическое условие на Python с переменной already_registered и числом 20, которое разрешает новую запись только пока лимит ещё не исчерпан.
На полигоне лимит группы курса — максимум 20 человек. already_registered — число уже записанных человек ДО текущей попытки записи.
Подсказка: Подставь already_registered = 20 (лимит уже исчерпан) и подумай, должна ли запись в этом случае пройти.
✅ Готово, если: ты ввёл(а) верный ответ, и онлайн-проверка его приняла.
Проверить ответ →
Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →
Задание. Сколько всего человек будет записано к моменту, когда условие впервые станет ложным? Ответь числом.
Лимит группы курса — 20 человек. Перед каждой попыткой записи система проверяет условие: already_registered <= 20, где already_registered — число уже записанных до этой попытки. Если условие истинно, человека записывают, и already_registered увеличивается на 1. Проверки идут одна за другой, начиная с already_registered = 0.
Подсказка: Проверь, что произойдёт при already_registered = 20, если в коде стоит <= вместо <.
✅ Готово, если: ты ввёл(а) верный ответ, и онлайн-проверка его приняла.
Проверить ответ →
Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →
Что дальше
Классы эквивалентности и границы отлично работают, когда результат зависит от ОДНОГО поля. Но что если результат зависит от комбинации нескольких условий сразу — например, скидка на курс одновременно зависит от промокода, повторной покупки и способа оплаты? Проверка каждого условия по отдельности не покажет, что происходит, когда они встречаются вместе. В следующем уроке разберём таблицы принятия решений — способ сделать такие комбинации явными и проверяемыми.
