Ответ
Анализ граничных значений (Boundary Value Analysis, BVA) — это техника тест-дизайна для поиска ошибок на границах разделов эквивалентности. Для числового поля, принимающего значения в диапазоне [min, max], мы тестируем значения на границах и непосредственно за ними.
Правило "3 точки на границу" (для двусторонней границы): Для каждой границы (минимум и максимум) мы проверяем:
- Значение на самой границе (valid).
- Значение непосредственно ниже границы (invalid).
- Значение непосредственно выше границы (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 точки на границу» — это вообще гениально. Берёшь каждую границу — минимум и максимум — и долбишь по ней с трёх сторон:
- Прямо в саму границу (валидно). 18 лет? Проходи, гражданин.
- На один шаг ниже границы (невалидно). 17? Иди нахуй, малолетка.
- На один шаг выше границы (невалидно). 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 ебнется. Используй проверку с допуском.
Короче, смысл в чём: не умничай, а бей чётко по границам. Как в боксе — самый эффективный удар не в лоб, а в челюсть на её пределе поворота. Вот и тут так же. Удачи, тестировщик. Не проёбывайся.