Математика в тест-дизайне

Классы эквивалентности. Делим на группы

Поле принимает возраст от 1 до 99. Проверять 99 значений бессмысленно. Делим множество на классы. Меньше 1. От 1 до 99. Больше 99. Внутри каждого класса поведение одинаковое.

Принцип расчёта. Берём число классов K. Формула простая: T = K. Для нашего случая три теста. Выбираем по одному представителю: 0, 50, 100. Экономия — 96 проверок.

Граничные значения. Ловим баги на краях

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

Принцип расчёта. Для одного диапазона берём две границы. Формула: T = 2n + 1, где n — число границ. Для диапазона 1–99 получаем 5. Проверяем 0, 1, 2, 98, 99, 100. Шесть значений, потому что добавляем середину для полноты. Логика простая: минимум, чуть выше минимума, чуть ниже максимума, максимум, чуть выше максимума.

Попарное тестирование. Спасаемся от комбинаторного взрыва

Три параметра. Каждый имеет 10 значений. Полный перебор даёт 1000 комбинаций. Руками не проверить.

Принцип расчёта. Считаем число пар. Формула: P = C(n, 2) × v². Где n — число факторов, v — число значений. Для трёх факторов по 10 значений: 3 × 100 = 300 пар. Дальше алгоритм строит матрицу так, чтобы каждая пара встретилась хотя бы раз. На практике выходит 20–30 тестов. Вместо 1000.

Таблицы принятия решений. Логика ветвления

Условия и действия. Кредитный скоринг: возраст больше 18, доход выше 50 тысяч, хорошая история. Каждое условие истинно или ложно.

Принцип расчёта. Формула: T = 2ⁿ, где n — число условий. Для трёх условий: 8 комбинаций. Рисуем таблицу с 8 строками. Для каждой прописываем результат. Ни одна ветка не остаётся в тени. Добавили четвёртое условие — стало 16 строк. Каждое новое условие удваивает число проверок.

Комбинаторика. Считаем варианты

Три формулы. Разберём каждую.

Сочетания. Формула: C(n, k) = n! / (k! × (n−k)!). Порядок не важен. Из 20 деталей выбрать 3: C(20, 3) = 1140 способов. Считаем так: 20! делим на 3! и на 17!. Сокращаем факториалы: остаётся (20 × 19 × 18) / (3 × 2 × 1) = 6840 / 6 = 1140. Цифра показывает масштаб проверок.

Размещения. Формула: A(n, k) = n! / (n−k)!. Порядок важен. Выбор старосты и заместителя из 30 человек: A(30, 2) = 30! / 28!. Сокращаем: 30 × 29 = 870 вариантов. Так оцениваем число сценариев с последовательностью действий.

Перестановки. Формула: P(n) = n!. Все элементы разные, порядок учитывается. Три шара расставляем шестью способами: 3! = 1 × 2 × 3 = 6.

Вероятности. Оцениваем риск

Знаете, что из 100 сценариев 10 могут упасть. Вероятность наткнуться на дефект: P(A) = m / n. Где m — число дефектных, n — общее. Получаем 10 / 100 = 0,1. Десять процентов.

Принцип расчёта для серии. Запускаете 20 случайных тестов. Считаем вероятность найти хотя бы один баг через обратную вероятность. P = 1 − (0,9)²⁰. Возводим 0,9 в двадцатую степень. Получаем примерно 0,12. Отнимаем от единицы: 0,88. Восемьдесят восемь процентов. Эта цифра помогает решить, сколько тестов запускать, чтобы покрыть риски.

Тестирование переходов состояний

У системы есть состояния и переходы. Формула: T = E + 1, где E — число переходов. Для трёх состояний и пяти переходов получаем шесть проверок. Каждый путь от начальной точки до конечной.

Пример расчёта на реальной задаче

Форма с тремя полями. Имя — 20 символов. Возраст — 1–99. Email — валидный или нет.

Классы: имя — 3, возраст — 3, email — 2. Полный перебор: 3 × 3 × 2 = 18 тестов. Применяем попарное: сокращаем до 8–10. Добавляем границы для возраста: 6 тестов. Для имени: 4 теста. Для email: 2 теста. Получаем около 14 проверок вместо 18. Для 10 полей разница станет в сотни раз.

Как применять на практике

Смотрите на задачу. Считаете классы эквивалентности. Добавляете граничные значения. Комбинаций много — берёте попарное. Логика ветвится — рисуете таблицу. Вероятности помогают приоритизировать.

Никогда не проверяете всё подряд. Считаете на бумаге. Цифры дают уверенность, что критичный баг не пройдёт мимо.