Граничные значения: 2- и 3-точечные

В прошлом уроке классы эквивалентности сократили работу до одного представителя на класс: для диапазона 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-точечной проверке НИЖНЕЙ границы?

А17 и 18
Б18 и 99
В1 и 18

Подсказка: 2-точечный метод берёт саму границу и соседа сразу за ней с невалидной стороны.

Проверить ответ →

Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →

Контрольный вопрос. Поле «Возраст» принимает число от 18 до 99. Какая тройка значений соответствует 3-точечной проверке ВЕРХНЕЙ границы?

А98, 99, 100
Б17, 18, 19
В99, 100, 101

Подсказка: Верхняя граница диапазона — число 99. Возьми его и по одному соседу с каждой стороны.

Проверить ответ →

Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →

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

АПотому что программисты чаще ошибаются в операторах сравнения (< вместо <=), а середина диапазона с таким сравнением вообще не связана
БПотому что середину диапазона тестировщики никогда не проверяют
ВПотому что граничные значения технически сложнее ввести в поле

Подсказка: Вспомни рассуждение про код и оператор сравнения из середины урока.

Проверить ответ →

Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →

Контрольный вопрос. Сколько точек проверяет 3-точечный метод на ОДНУ границу диапазона?

А2
Б3
В4

Подсказка: Название метода прямо указывает на число точек.

Проверить ответ →

Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →

Контрольный вопрос. Какое число — точка «граница минус один» для НИЖНЕЙ границы этого диапазона? Ответь числом.

Поле принимает целое число от 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 (рублей).

Выберите все верные варианты.

А9999
Б10000
В10001
Г100

Подсказка: Определи верхнюю границу диапазона и выбери точки вокруг неё по 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, если в коде стоит <= вместо <.

✅ Готово, если: ты ввёл(а) верный ответ, и онлайн-проверка его приняла.

Проверить ответ →

Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →

Что дальше

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

Назад  ·  ↑ В начало урока  ·  ⌂ В начало курса  ·  Вперёд →

Школа Виктора Комлева