Граничные значения (boundary values) — это крайние точки диапазона допустимых данных: сама граница, значение сразу за ней и сразу перед ней. Анализ граничных значений (BVA, boundary value analysis) — техника тест-дизайна, которая проверяет программу именно на этих точках. Причина проста: большинство ошибок «на единицу» (off-by-one) прячется на границах диапазона, а не в его середине.

Коротко, что важно знать про граничные значения:

  • BVA — расширение классов эквивалентности: сначала делим вход на классы, затем берём их края.
  • Есть два подхода: 2-value (граница + сосед снаружи) и 3-value (сосед снаружи + граница + сосед внутри).
  • Типичный баг границы — >= вместо > в условии.
  • На каждую границу берут 2 или 3 тест-кейса, а не весь диапазон целиком.

Что такое граничные значения и почему они ловят баги

По данным istqb.org.

Граничные значения — крайние значения из входного диапазона. Метод направлен на выявление ошибок при обработке границ диапазона, где поведение программы меняется. По формулировке ISTQB, анализ граничных значений проверяет значения на краях классов эквивалентности, потому что дефекты имеют свойство скапливаться именно на границах.

Механика бага бытовая: разработчик пишет if age >= 18 вместо if age > 18 — и создаёт ошибку ровно на границе. В середине диапазона (например, на значении 40) такой баг не проявится, поэтому случайные значения его пропускают. Граничные значения бьют точно в это место.

ОБЗОРНЫЙ ПРАКТИКУМ ПО НАШУМЕВШИМ НЕЙРОСЕТЯМ
Нейросети DEEPSEEK И QWEN За 2 часа сделаем полный обзор новых мощных ИИ-моделей, которые бросают вызов нейросети ChatGPT
ТОП-подарки всем участникам лекции:
  • Возможность получить Доступ в Нейроклуб на целый месяц
  • Как ИИ ускоряет работу и приносит деньги
  • За 2 часа вы получите четкий план, как начать работать с ИИ прямо сейчас!

Как граничные значения связаны с классами эквивалентности

Порядок применения BVA: от классов к границам
Порядок применения BVA: от классов к границам

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

Порядок работы такой:

  • Разбить вход на классы эквивалентности (валидные и невалидные).
  • Найти границы каждого класса — минимум и максимум.
  • На каждую границу составить тест-кейсы по правилу 2-value или 3-value.

Мини-вывод: классы эквивалентности отвечают на вопрос «какие группы вообще есть», а граничные значения — «где эти группы ломаются». Их применяют вместе.

2-value и 3-value анализ граничных значений: в чём разница

Разница между подходами — в том, сколько точек берут на каждую границу.

Подход Кейсов на границу Что проверяем Когда применять
2-value 2 граница + значение сразу за ней (в соседнем классе) базовое покрытие, регрессионные наборы
3-value 3 значение до границы + граница + значение после критичные системы; находит баги, пропущенные 2-value

3-value строже: он добавляет соседа с внутренней стороны границы и потому ловит дефекты, которые 2-value может пропустить. Плата — больше тест-кейсов. Для большинства форм достаточно 2-value; для расчётных и платёжных систем берут 3-value.

Пример граничных значений: поле «возраст 18–65»

Числовая ось диапазона 18–65: где 2-value и 3-value берут тест-кейсы
Числовая ось диапазона 18–65: где 2-value и 3-value берут тест-кейсы

Пусть форма принимает возраст от 18 до 65 включительно. Классы эквивалентности: младше 18 (невалидно), 18–65 (валидно), старше 65 (невалидно). Границы — 18 и 65. Вот таблица тест-кейсов для обоих подходов:

Значение Ожидаемый результат Смысл точки Подход
17 отклонить сразу ниже нижней границы 2-value, 3-value
18 принять нижняя граница 2-value, 3-value
19 принять сразу выше нижней границы 3-value
64 принять сразу ниже верхней границы 3-value
65 принять верхняя граница 2-value, 3-value
66 отклонить сразу выше верхней границы 2-value, 3-value

На pytest эти же кейсы через параметризацию выглядят так:

import pytest def is_valid_age(age): return 18 <= age <= 65 @pytest.mark.parametrize("age, expected", [ (17, False), # ниже нижней границы (18, True), # нижняя граница (19, True), # сразу за нижней границей (64, True), # сразу перед верхней границей (65, True), # верхняя граница (66, False), # выше верхней границы ]) def test_age_boundaries(age, expected): assert is_valid_age(age) == expected

Если в is_valid_age закрадётся < вместо <=, кейс на значении 18 или 65 сразу упадёт — а без граничных тестов баг ушёл бы в прод.

Пример граничных значений: площадь прямоугольника

Программа считает площадь прямоугольника по сторонам. Граничные значения здесь:

  • Длина или ширина равны 0 — вырожденный случай.
  • Значение больше 0, но очень близкое к нулю (например, 0.0001).
  • Очень большие числа — проверка на переполнение типа.

Отдельная неявная граница — коллекции. Для функции, которая работает со списком сторон, границами будут пустой список, список из одного элемента и максимально длинный. Как корректно перебирать такие структуры — в материале про итерируемый класс в Python.

Типичные ошибки при работе с граничными значениями

  • Тестируют только валидную сторону. Взяли 18, забыли 17. Половина off-by-one-багов сидит именно в невалидном соседе.
  • Путают середину с границей. Проверять 40 для диапазона 18–65 бесполезно — это не край.
  • Игнорируют неявные границы. Пустая строка, 0, максимум типа данных, длина 255 — тоже границы, хоть их и нет в явной спецификации.
  • Выход за границу массива. Классика — обращение к индексу за последним элементом; см. разбор ошибки IndexError в Python.

Чек-лист анализа граничных значений

  • Разбил вход на классы эквивалентности — валидные и невалидные?
  • Нашёл минимум и максимум каждого класса?
  • Для каждой границы взял значение на ней и хотя бы одно за ней (2-value)?
  • Для критичной логики добавил соседа с внутренней стороны (3-value)?
  • Проверил обе стороны границы — и валидную, и невалидную?
  • Учёл неявные границы: 0, пустой ввод, максимум типа, длину коллекции?
  • Перепроверил условие на off-by-one (> vs >=)?

Частые вопросы про граничные значения

Сколько тест-кейсов нужно на одну границу?

В подходе 2-value — два: сама граница и значение сразу за ней. В 3-value — три: значение до границы, на границе и после неё.

Чем анализ граничных значений отличается от классов эквивалентности?

Классы эквивалентности делят вход на группы с одинаковым поведением, а граничные значения проверяют края этих групп. Это не конкурирующие, а взаимодополняющие техники.

Почему баги концентрируются на границах?

Из-за ошибок «на единицу» (off-by-one): перепутанные > и >=, счёт с нуля или с единицы, выход за последний индекс. В середине диапазона такие ошибки не видны.

BVA — это чёрный или белый ящик?

Классически это техника чёрного ящика: границы берут из спецификации, а не из кода. Её применяют на всех уровнях — от модульного до системного.

Обновлено: июль 2026.

РОССИЙСКИЕ НЕЙРОСЕТИ ДЛЯ ЖИЗНИ И КАРЬЕРЫ В 2025
Присоединяйся к онлайн-вебинару.
В прямом эфире разберем и потестируем лучшие на сегодняшний день отечественные ИИ!
Вы узнаете о том:
  • Выполним базовые задачи на российских нейросетях и посмотрим на результаты!
  • Файл-инструкцию «Как сделать нейро-фотосессию из своего фото бесплатно, без иностранных карт и прочих сложностей»
  • Покажем 10+ способов улучшить свою жизнь с ИИ каждому — от ребенка и пенсионера до управленца и предпринимателя
Участвовать бесплатно
ОБЗОРНЫЙ ПРАКТИКУМ ПО НАШУМЕВШИМ НЕЙРОСЕТЯМ
Нейросети DEEPSEEK И QWEN
За 2 часа сделаем полный обзор новых мощных ИИ-моделей, которые бросают вызов нейросети ChatGPT
Вы узнаете:
  • Возможность получить Доступ в Нейроклуб на целый месяц
  • Как ИИ ускоряет работу и приносит деньги
  • За 2 часа вы получите четкий план, как начать работать с ИИ прямо сейчас!
Участвовать бесплатно