Как распределять уникальные пары входных данных для тестирования
Что проверяют
Знаете ли вы попарное тестирование (pairwise, all-pairs) и умеете ли сокращать комбинаторный взрыв осознанно, а не «проверим пару случайных вариантов». Следом обычно просят прикинуть число комбинаций на конкретном примере и спрашивают, чего pairwise не ловит.
Как отвечать
Идея: большинство дефектов вызывает один параметр или сочетание двух. Поэтому достаточно набора, где каждая пара значений любых двух параметров встречается хотя бы один раз.
Пример: браузер (3 значения), ОС (3), язык (2), способ оплаты (2). Полный перебор даёт 36 комбинаций, попарное покрытие укладывается примерно в 9-10 строк. Нижняя граница равна произведению двух самых больших размерностей, здесь 3 × 3 = 9.
Как это делается на практике:
- выбор значений: сначала классы эквивалентности и граничные значения, в модель идут представители классов, а не все числа подряд;
- генерация: утилита PICT, онлайн-генераторы pairwise, библиотеки вроде
allpairspyдля Python. Вручную таблицу больше чем на 4-5 параметров никто не строит; - ограничения: невозможные сочетания исключаются в модели, в PICT это строки вида
IF [OS] = "Windows" THEN [Browser] <> "Safari";; - негативные значения: в PICT помечаются префиксом
~, чтобы в одной строке не оказалось двух невалидных значений и одна ошибка не маскировала другую; - усиление: для рискованных связок порядок покрытия поднимают до троек (
/o:3) или добавляют обязательные комбинации вручную; - использование: строки таблицы становятся тест-кейсами или данными для параметризованных автотестов (
@pytest.mark.parametrize,@ParameterizedTestв JUnit 5).
Где спотыкаются
Считают pairwise полным покрытием. Дефект на стыке трёх параметров он может пропустить, поэтому критичные сценарии проверяют отдельно.
Забывают про ограничения, и генератор выдаёт невозможные строки. Если потом удалить их руками, часть пар теряется, и покрытие уже не попарное.
Подают в модель сырые значения без классов эквивалентности, и таблица раздувается до сотен строк без пользы.