Как применить технику анализа граничных значений для тестирования числового поля ввода?

Ответ

Анализ граничных значений (Boundary Value Analysis, BVA) — это техника тест-дизайна для поиска ошибок на границах разделов эквивалентности. Для числового поля, принимающего значения в диапазоне [min, max], мы тестируем значения на границах и непосредственно за ними.

Правило "3 точки на границу" (для двусторонней границы): Для каждой границы (минимум и максимум) мы проверяем:

  1. Значение на самой границе (valid).
  2. Значение непосредственно ниже границы (invalid).
  3. Значение непосредственно выше границы (invalid).

Пример: Поле "Возраст участника" принимает целые числа от 18 до 65 включительно.

Тип значения Тестовое значение Ожидаемый результат Пояснение
Ниже минимума 17 Невалидно Значение за нижней границей.
Минимум 18 Валидно Нижняя граница диапазона.
Выше минимума 19 Валидно Типичное значение внутри диапазона (проверка "счастливого пути").
Ниже максимума 64 Валидно Типичное значение внутри диапазона.
Максимум 65 Валидно Верхняя граница диапазона.
Выше максимума 66 Невалидно Значение за верхней границей.
Особый случай Пустая строка Невалидно Проверка обработки отсутствия ввода (часто забываемая граница "ниже минимума").

Реализация в виде юнит-тестов (JavaScript / Jest):

describe('Валидация поля "Возраст" (диапазон 18-65)', () => {
  const validateAge = (value) => {
    const age = Number.parseInt(value, 10);
    return !isNaN(age) && age >= 18 && age <= 65;
  };

  // Валидные граничные значения и внутри диапазона
  test.each([18, 19, 50, 64, 65])('Принимает валидный возраст %i', (age) => {
    expect(validateAge(age)).toBe(true);
  });

  // Невалидные значения (за границами и некорректный ввод)
  test.each([17, 66, '', ' ', 'abc', '18.5', null, undefined])(
    'Отклоняет невалидное значение: %s',
    (invalidInput) => {
      expect(validateAge(invalidInput)).toBe(false);
    }
  );
});

Важные нюансы:

  • Если границы исключающие (например, (18, 65> — старше 18, до 65 включительно), тестовые значения смещаются (минимумом будет 19).
  • Всегда стоит дополнять BVA тестированием классов эквивалентности (например, отрицательное число, ноль, нечисловой ввод).
  • Для полей с плавающей точкой нужно учитывать точность (эпсилон).

Ответ 18+ 🔞

Давай разберём эту вашу теорию тестирования, а то я вижу — народ путается, как слепой кот в сортире. Слушай сюда, я сейчас всё разложу по полочкам, чтобы даже твоя бабка поняла.

Вот есть у нас, допустим, поле «Возраст». Ну, классика жанра. От 18 до 65, включительно. Всё, казалось бы, просто. Но нет же, найдётся умник, который введёт 17 или 66, а потом будет орать: «Система говно, не работает!». А система-то, блядь, работает, это ты — мудак, который не протестировал границы.

Так вот, техника эта, BVA, она как раз для таких умников. Суть проще пареной репы: чтобы найти баги, надо тыкать палкой не куда попало, а точно в стыки. В самое больное место. В границы, ёпта!

Правило «3 точки на границу» — это вообще гениально. Берёшь каждую границу — минимум и максимум — и долбишь по ней с трёх сторон:

  1. Прямо в саму границу (валидно). 18 лет? Проходи, гражданин.
  2. На один шаг ниже границы (невалидно). 17? Иди нахуй, малолетка.
  3. На один шаг выше границы (невалидно). 66? Пенсия, дед, отдыхай.

Вот и вся магия. Не надо перебирать все числа от 1 до 100. Достаточно этих шести хуёв (17, 18, 19, 64, 65, 66) и ты уже покрыл основные сценарии падений системы.

Смотри, как это выглядит на практике для нашего поля «Возраст (18-65)»:

Что проверяем Пример значения Что должно быть Объяснение для особо одарённых
Ниже плинтуса 17 Ошибка Ещё не дорос, пацан.
Сам плинтус 18 Ок Ура, совершеннолетие! Можно.
Чуть выше плинтуса 19 Ок Ну, обычный возраст внутри диапазона. Типичный «счастливый путь».
Чуть ниже потолка 64 Ок Ещё работает, молодец.
Сам потолок 65 Ок Последний год, держись.
Пробил потолок 66 Ошибка Всё, пиздец, пенсия.
Особый пиздец Пустое поле Ошибка А это, сука, часто забывают! Это же тоже граница — граница между «что-то введено» и «ничего нет»!

А вот как это в коде выглядит, чтобы эти тесты сами бегали и кричали, если что-то не так (JavaScript, Jest):

describe('Проверка поля "Возраст" (должно быть от 18 до 65, блядь)', () => {
  // Функция, которую мы тестируем. Пусть будет такая.
  const validateAge = (value) => {
    const age = Number.parseInt(value, 10);
    // Если не число, или меньше 18, или больше 65 — нахуй.
    return !isNaN(age) && age >= 18 && age <= 65;
  };

  // ТЕСТ 1: Валидные значения должны проходить
  // Сюда кидаем и границы (18, 65), и что-то из середины
  test.each([18, 19, 50, 64, 65])('Должно пропустить нормальный возраст %i', (age) => {
    expect(validateAge(age)).toBe(true); // true — значит, ОК
  });

  // ТЕСТ 2: Всё остальное должно отлетать с треском
  // Тут и наши граничные 17 с 66, и всякий мусор
  test.each([17, 66, '', ' ', 'абвгд', '18.5', null, undefined])(
    'Должно послать нахуй невалидное значение: "%s"',
    (invalidInput) => {
      expect(validateAge(invalidInput)).toBe(false); // false — значит, ошибка
    }
  );
});

Важные нюансы, которые сожрут твой проект, если их проебать:

  • Исключающие границы. Если в требованиях написано «старше 18» (т.е. 18 уже нельзя), то это пиздец. Минимумом для теста будет уже 19, а 18 — это тест на ошибку. Читай ТЗ, долбоёб!
  • BVA — не панацея. Это только по границам. Обязательно добавь классы эквивалентности: отрицательное число, ноль, дробное число, строку из букв. Система должна отбивать всё это смачно.
  • Для дробных чисел — отдельная песня. Там из-за погрешностей вычислений (эпсилон) число 10.0 может на самом деле быть 9.999999999999. И твой тест на равенство 10.0 ебнется. Используй проверку с допуском.

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