Попарное тестирование и таблицы решений
Вопрос звучит как задачка на смекалку: «параметров пять, значений у каждого по три — это 243 комбинации, у вас два дня. Ваши действия?»
Pairwise (попарное) тестирование — техника, при которой набор тестов покрывает все пары значений разных параметров, но не все их комбинации целиком.
Вопрос 1: «Как сократить комбинаторный взрыв?»
Что на самом деле проверяет интервьюер
Знаете ли вы, на каком эмпирическом факте основана техника, и готовы ли честно назвать её ограничения. Заученное «pairwise сокращает тесты» без объяснения «почему это работает» звучит слабо.
Развёрнутый ответ
Эмпирика простая: подавляющее большинство дефектов вызывается либо одним значением параметра, либо взаимодействием двух параметров. Тройные и более сложные взаимодействия встречаются редко. Значит, если набор тестов покрывает все пары «значение A × значение B» для всех пар параметров, мы ловим почти все дефекты крошечной долей тестов.
from itertools import product, combinations
params = {
"Браузер": ["Chrome", "Firefox", "Safari"],
"ОС": ["Windows", "macOS"],
"Роль": ["гость", "юзер", "админ"],
}
names = list(params)
full = list(product(*params.values()))
idx = list(combinations(range(len(names)), 2))
need = set()
for a, b in idx:
for va in params[names[a]]:
for vb in params[names[b]]:
need.add((a, va, b, vb))
def pairs_of(c):
return {(a, c[a], b, c[b]) for a, b in idx}
covered, suite = set(), []
while covered != need:
best = max(full, key=lambda c: len(pairs_of(c) - covered))
suite.append(best)
covered |= pairs_of(best)
print("Полный перебор:", len(full), "тестов")
print("Уникальных пар значений:", len(need))
print("Попарное покрытие:", len(suite), "тестов")
for row in suite:
print(" ", " | ".join(row))
Вывод:
Полный перебор: 18 тестов Уникальных пар значений: 21 Попарное покрытие: 9 тестов Chrome | Windows | гость Chrome | macOS | юзер Firefox | Windows | юзер Firefox | macOS | гость Safari | Windows | админ Chrome | macOS | админ Safari | macOS | гость Firefox | Windows | админ Safari | Windows | юзер
Восемнадцать комбинаций сжались до девяти без потери ни одной пары. На реальных задачах с пятью-шестью параметрами эффект драматичнее: сотни комбинаций превращаются в полтора десятка тестов. Вручную такие наборы не строят — используют PICT от Microsoft, allpairs или онлайн-генераторы; на собеседовании достаточно назвать инструмент.
Ограничения, которые надо озвучить
- Дефекты от взаимодействия трёх и более параметров pairwise не гарантирует. Для критичных мест берут n-wise (тройное покрытие).
- Техника не знает про смысл: если комбинация «Safari + Windows» физически невозможна, её нужно исключить руками через ограничения генератора.
- Бизнес-критичные комбинации (например, «админ + оплата корпоративной картой») добавляют в набор принудительно, независимо от алгоритма.
Вопрос 2: «Что такое таблица решений и когда она лучше pairwise?»
Что на самом деле проверяет интервьюер
Различаете ли вы задачи «много независимых параметров» и «сложная логика с условиями». Это разные техники, и путать их — распространённая ошибка.
Развёрнутый ответ
Таблица решений (decision table) применяется там, где результат зависит от комбинации условий по бизнес-правилам. Условия — строки сверху, действия — снизу, каждый столбец — правило и одновременно тест-кейс.
Пример: скидка в интернет-магазине.
| Условие | Правило 1 | Правило 2 | Правило 3 | Правило 4 |
| Есть карта лояльности | да | да | нет | нет |
| Сумма заказа > 5000 | да | нет | да | нет |
| Действие | ||||
| Скидка | 15% | 10% | 5% | 0% |
Ценность таблицы не в тестах, а в том, что она вскрывает дыры в требованиях ещё до кодирования: как только вы её заполняете, обнаруживается столбец, про который аналитик не подумал. Если условий много, применяют «свёрнутые» таблицы, где несущественные условия помечают прочерком, и тогда часть столбцов схлопывается.
Коротко про выбор: pairwise — когда параметры независимы и комбинаций слишком много (браузеры, ОС, роли, способы оплаты). Таблица решений — когда между условиями есть логика «если… и… то…» и важно каждое сочетание.
Типичные ошибки кандидатов
- Утверждают, что pairwise «покрывает все комбинации». Он покрывает все пары, а не все комбинации — важно проговорить это самому.
- Применяют pairwise к бизнес-логике, где каждая комбинация условий даёт свой результат — там нужна таблица решений.
- Не исключают невозможные сочетания и потом заводят баг «Safari не запускается на Windows».
- Строят таблицу решений, но не проверяют её на противоречия и пропущенные комбинации.
Как ответить кратко
Полный перебор комбинаций растёт экспоненциально, а большинство дефектов вызвано одним параметром или взаимодействием двух. Поэтому применяю попарное тестирование: строю набор, покрывающий все пары значений, — обычно это в разы меньше тестов, чем полный перебор, инструменты вроде PICT считают это автоматически. Обязательно исключаю невозможные сочетания и вручную добавляю бизнес-критичные. Если же дело не в независимых параметрах, а в логике «при таких условиях такой результат», беру таблицу решений: условия — строки, каждый столбец — правило и тест-кейс; она заодно вскрывает пробелы в требованиях.