За пределами одномерных границ
Анализ граничных значений (Урок 3.2) тестирует одну переменную за раз. Но реальное ПО имеет входные пространства, определяемые отношениями между несколькими переменными. Рассмотрим систему одобрения кредитов:
- Одобрено, если:
income >= 30000 AND debt_ratio < 0.4 AND credit_score >= 650
Это создаёт трёхмерный входной домен. Граница — не точка, а поверхность в 3D-пространстве. Тестирование каждой переменной независимо (как делает BVA) пропускает дефекты на пересечении границ.
Доменный анализ, формализованный Бейзером и позднее Биндером, расширяет BVA для систематической работы с многомерными входными пространствами.
Базовые концепции
Входной домен
Множество всех возможных комбинаций входных данных.
Граница домена
Условие, разделяющее входное пространство на области с различным поведением.
Точки On и Off
On point: Значение точно на границе.
Off point: Значение, минимально отличающееся от on point, по другую сторону границы.
| Граница | On Point | Off Point |
|---|---|---|
| x <= 10 (домен x <= 10) | 10 (в домене) | 11 (вне) |
| x < 10 (домен x < 10) | 9 (в домене) | 10 (вне) |
| x >= 5 (домен x >= 5) | 5 (в домене) | 4 (вне) |
| x > 5 (домен x > 5) | 6 (в домене) | 5 (вне) |
In Points
Значения явно внутри домена — далеко от границ.
Out Points
Значения явно вне домена.
Типы доменных ошибок
Сдвиг границы
Граница в неверной позиции. Должно быть x <= 100, но реализовано x <= 99.
Ошибка замыкания
Граница неверного типа. Должно быть x <= 10, реализовано x < 10.
Отсутствующая граница
Граница, которая должна быть, отсутствует.
Лишняя граница
Граница существует, но не должна.
Наклонённая граница
Для многомерных границ типа x + y <= 100 граница имеет неверный наклон.
Метод доменного анализа
Шаг 1: Определить переменные и границы
Пример: Страховая котировка
- Переменные: age (18-80), driving_years (0-62), accidents (0-10)
- Границы: age >= 25, driving_years >= 3, accidents <= 2 → стандартный тариф
Шаг 2: Для каждой границы выбрать точки On и Off
| Граница | Переменная | On Point | Off Point |
|---|---|---|---|
| age >= 25 | age | 25 | 24 |
| driving_years >= 3 | driving_years | 3 | 2 |
| accidents <= 2 | accidents | 2 | 3 |
Шаг 3: Построить доменную матрицу
| Тест | age | driving_years | accidents | Тестируемая граница | Ожидаемый |
|---|---|---|---|---|---|
| 1 | 25 | 10 | 0 | age ON | Стандартный |
| 2 | 24 | 10 | 0 | age OFF | Высокий тариф |
| 3 | 35 | 3 | 0 | years ON | Стандартный |
| 4 | 35 | 2 | 0 | years OFF | Высокий тариф |
| 5 | 35 | 10 | 2 | accidents ON | Стандартный |
| 6 | 35 | 10 | 3 | accidents OFF | Высокий тариф |
| 7 | 35 | 10 | 0 | IN point | Стандартный |
2 теста на границу + 1 внутренняя точка = 2B + 1 всего.
Многомерные границы
Пример: Бесплатная доставка если quantity * price >= 100
On points на линии quantity * price = 100: (10, 10), (20, 5), (50, 2)
Off points чуть ниже: (10, 9.99), (20, 4.99), (50, 1.99)
Тестируйте несколько пар on/off вдоль границы для обнаружения ошибок наклона.
Упражнение: Доменный анализ
Задача 1
Калькулятор парковки использует правила:
- Первый час: $5.00
- Часы 2-4: $3.00/час
- Часы 5-8: $2.00/час
- Часы 9-24: $1.50/час
- Более 24 часов: $1.00/час
- Максимальный тариф: $50/день
Решение
Границы и тест-кейсы:
| # | duration | Ожидаемая стоимость | Тестирует |
|---|---|---|---|
| 1 | 0.5 | $5.00 | IN point |
| 2 | 1.0 | $5.00 | ON граница 1 |
| 3 | 1.01 | $5.03 | OFF граница 1 |
| 4 | 4.0 | $14.00 | ON граница 2 |
| 5 | 4.01 | $14.02 | OFF граница 2 |
| 6 | 8.0 | $22.00 | ON граница 3 |
| 7 | 24.0 | $46.00 | ON граница 4 |
| 8 | 48 | $50.00 (лимит) | Граница макс. тарифа |
Задача 2
Фитнес-приложение категоризирует пользователей по двум переменным:
- BMI: недовес (<18.5), норма (18.5-24.9), избыточный вес (25-29.9), ожирение (>=30)
- Уровень активности: сидячий (<150 мин/нед), умеренный (150-300), активный (>300)
Решение
Границы:
| # | Переменная | Граница | On | Off |
|---|---|---|---|---|
| 1 | BMI | 18.5 | 18.5 | 18.4 |
| 2 | BMI | 25.0 | 24.9 | 25.0 |
| 3 | BMI | 30.0 | 29.9 | 30.0 |
| 4 | Активность | 150 | 150 | 149 |
| 5 | Активность | 300 | 300 | 301 |
Доменная матрица:
| # | BMI | Активность | Категория |
|---|---|---|---|
| 1 | 18.4 | 100 | Недовес + Сидячий |
| 2 | 18.5 | 100 | Норма + Сидячий |
| 3 | 22.0 | 149 | Норма + Сидячий (OFF граница активности) |
| 4 | 22.0 | 150 | Норма + Умеренный (ON граница активности) |
| 5 | 22.0 | 225 | Норма + Умеренный (IN point) |
| 6 | 24.9 | 225 | Норма + Умеренный (ON граница BMI) |
| 7 | 25.0 | 225 | Избыточный + Умеренный |
| 8 | 30.0 | 225 | Ожирение + Умеренный |
Когда использовать доменный анализ
Используйте когда:
- Несколько переменных взаимодействуют для определения поведения
- Границы включают отношения между переменными
- Нужно обнаружить ошибки off-by-one, замыкания и сдвига
Предпочтите простой BVA когда:
- Переменные независимы
- Одномерных границ достаточно
Ключевые выводы
- Доменный анализ расширяет BVA на многомерные входные пространства
- On points лежат точно на границах; off points — минимально по другую сторону
- 2 точки на границу (on + off) + внутренние точки = 2B + 1 минимум
- Четыре типа ошибок: сдвиг границы, замыкание, отсутствующая граница, наклонённая граница
- Стройте доменные матрицы, варьируя одну границу при фиксации остальных на внутренних значениях
- Для многомерных границ тестируйте несколько пар on/off для обнаружения ошибок наклона