Попарное тестирование и таблицы решений

Вопрос звучит как задачка на смекалку: «параметров пять, значений у каждого по три — это 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 считают это автоматически. Обязательно исключаю невозможные сочетания и вручную добавляю бизнес-критичные. Если же дело не в независимых параметрах, а в логике «при таких условиях такой результат», беру таблицу решений: условия — строки, каждый столбец — правило и тест-кейс; она заодно вскрывает пробелы в требованиях.

Проверьте себя
1. Что гарантирует попарное (pairwise) тестирование?
AПокрытие всех возможных комбинаций значений параметров
BПокрытие всех пар значений разных параметров хотя бы одним тестом
CОбнаружение 100% дефектов интеграции
DМинимально возможное число тестов для любой задачи
2. Скидка зависит от наличия карты лояльности и суммы заказа, для каждого сочетания свой процент. Какая техника подходит лучше всего?
AПопарное тестирование
BАнализ граничных значений вместо всего остального
CТаблица решений: условия — строки, каждый столбец — правило и тест-кейс
DИсследовательское тестирование
3. Генератор pairwise выдал комбинацию «Safari + Windows», которой не существует. Что правильно сделать?
AЗавести баг на разработчиков
BЗадать ограничение в генераторе и перегенерировать набор
CВыполнить тест как есть и записать результат «не воспроизводится»
DОтказаться от pairwise и вернуться к полному перебору