Попарное тестирование

Попарное тестирование (pairwise testing) - техника тестирования методом чёрного ящика, при которой тест-кейсы строятся так, чтобы задействовать пары из пар «параметр - значение»: каждое значение каждого параметра хотя бы раз встречается вместе с каждым значением каждого другого параметра. Оно относится к комбинаторному тестированию (combinatorial testing) - группе техник, в которых тест-кейсы задействуют определённые сочетания значений нескольких параметров. Попарное тестирование сокращает число тест-кейсов с произведения количеств всех значений до числа, которое медленно растёт с числом параметров.

Техника пришла из статистического планирования экспериментов. В 1985 году Роберт Мандл (Robert Mandl) описал в журнале Communications of the ACM применение ортогональных латинских квадратов для проектирования тестов набора Ada Compiler Validation Capability. По данным NIST, ортогональные массивы применяют для попарного тестирования программ методом чёрного ящика с 1980-х годов. В 2004 году Д. Ричард Кун (D. Richard Kuhn), Долорес Уоллес (Dolores Wallace) и Альберт Галло (Albert Gallo) опубликовали данные о том, сколько параметров участвует в реальных отказах программ. Сегодня стандарт ISO/IEC/IEEE 29119-4:2021 описывает комбинаторные техники тест-дизайна в разделе 5.2.5. Силлабус ISTQB Advanced Level Test Analyst (версия 4.0, 2025 год, раздел 3.1.2) определяет попарное покрытие; в силлабус Foundation Level 4.0.1 техника не входит.

Какую задачу решает попарное тестирование

Число сочетаний значений параметров равно произведению количеств значений. У веб-формы, которую проверяют в трёх браузерах, трёх операционных системах, с тремя способами оплаты и на двух языках, 3 x 3 x 3 x 2 = 54 сочетания. Каждый новый параметр умножает это число. NIST приводит пример панели из 34 переключателей «вкл/выкл»: исчерпывающее тестирование потребовало бы 2 в степени 34 настроек, около 1,7 x 10^10.

Поэтому проверить все сочетания для большинства реальных конфигураций невозможно. Проверить каждое значение по одному разу, как это делает покрытие Each Choice, дёшево, но не проверяет ни одного взаимодействия: дефект, который проявляется только в Safari при оплате по счёту, можно пропустить. Попарное тестирование - промежуточная точка. Оно исходит из того, что большинство отказов вызывает один параметр или взаимодействие двух, и покрывает все такие взаимодействия небольшим набором тест-кейсов.

Выигрыш растёт с числом параметров. По данным NIST SP 800-142, число тестов, нужных для покрытия всех сочетаний t параметров, растёт пропорционально v^t log n, где v - число значений параметра, а n - число параметров. Произведение всех значений растёт как v^n.

Параметры, значения и пары

На входе техники - список параметров и их значений. Параметр - это ввод или настройка конфигурации: браузер, операционная система, способ оплаты, роль пользователя. Его значения - обычно классы эквивалентности параметра, а не все возможные значения: «карта» представляет все типы карт, если они обрабатываются одинаково. Как их выбирать, описано в статье Классы эквивалентности и граничные значения.

Пара «параметр - значение» (parameter-value pair) - параметр вместе с одним из его значений, например (Browser, Safari). В силлабусе Test Analyst элементы покрытия попарного тестирования - пары из пар «параметр - значение» для любых двух параметров, например (Browser, Safari) вместе с (Payment, Invoice). Покрытие - число таких пар, задействованных тестами, делённое на число всех таких пар.

Число элементов покрытия - сумма по всем парам параметров произведений количеств их значений. Для формы выше оно такое:

Пара параметров Пар значений
Browser и OS 3 x 3 = 9
Browser и Payment 3 x 3 = 9
Browser и Language 3 x 2 = 6
OS и Payment 3 x 3 = 9
OS и Language 3 x 2 = 6
Payment и Language 3 x 2 = 6
Итого 45

Каждый тест-кейс покрывает по одной паре значений для каждой пары параметров, то есть сразу шесть элементов покрытия. Поэтому тест-кейсов нужно гораздо меньше, чем 54.

Разобранный пример

Параметры примера:

Параметр Значения
Browser Chrome, Firefox, Safari
OS Windows, macOS, Linux
Payment Card, Wallet, Invoice
Language en, de

Полное произведение содержит 54 сочетания. Попарному набору нужно не меньше 9 тест-кейсов: 9 пар значений Browser и OS можно покрыть только 9 разными строками. Следующие 9 тест-кейсов покрывают все 45 пар:

Тест-кейс Browser OS Payment Language
PW-1 Chrome Windows Card en
PW-2 Chrome macOS Wallet de
PW-3 Chrome Linux Invoice en
PW-4 Firefox Windows Wallet en
PW-5 Firefox macOS Invoice en
PW-6 Firefox Linux Card de
PW-7 Safari Windows Invoice de
PW-8 Safari macOS Card en
PW-9 Safari Linux Wallet en

Набор можно проверить пару за парой. Safari встречается с Invoice в PW-7, Linux с de - в PW-6, Wallet с de - в PW-2. Каждое значение Browser встречается с каждым значением OS и Payment ровно один раз, а оба языка встречаются с каждым значением остальных параметров.

Таблица задаёт только входные данные. Каждая строка становится тест-кейсом со своим ожидаемым результатом, взятым из базиса тестирования: заказ оформлен, страница подтверждения на выбранном языке, оплата по счёту предложена или нет. Сочетания, о которых известно, что они рискованны, добавляют к сгенерированному набору вручную.

Ортогональные и покрывающие массивы

Для построения комбинаторных наборов тестов используют два математических объекта. Ортогональный массив (orthogonal array) силы t - таблица, в которой каждое сочетание значений любых t столбцов встречается одинаковое число раз. Он пришёл из планирования экспериментов, где сбалансированность нужна, чтобы статистически оценить влияние каждого фактора. Покрывающий массив (covering array) силы t - таблица, в которой каждое сочетание значений любых t столбцов встречается хотя бы один раз. Кун, Рагху Какер (Raghu Kacker) и Юй Лей (Yu Lei) описывают наборы тестов на основе покрывающих массивов как несбалансированные и отмечают, что статистические модели в таком тестировании не используются.

Свойство Ортогональный массив Покрывающий массив
Каждое сочетание t значений встречается Одинаковое число раз Хотя бы один раз
Сбалансированность Обязательна Не требуется
Происхождение Планирование экспериментов Комбинаторные схемы, тестирование программ
Статистическая модель результатов Используется Не используется

Для четырёх параметров с тремя значениями каждый известен ортогональный массив силы 2 из 9 строк. Полное произведение содержит 81 сочетание, массив - 9 строк, и каждая из 54 пар значений встречается ровно в одной строке. Таблица разобранного примера построена из того же массива, но у Language только два значения. В четвёртом столбце массива три значения, и третье из них заменено на en, поэтому en встречается в шести строках, а de - в трёх. Каждая пара по-прежнему покрыта, но не одинаково часто: таблица - покрывающий массив, а не ортогональный.

Для поиска отказов сбалансированность не нужна. Тест либо вызывает отказ, либо нет, и пара, проверенная дважды, не даёт больше покрытия, чем пара, проверенная один раз. Поэтому инструменты генерации попарных наборов строят покрывающие массивы: отказ от требования сбалансированности оставляет больше свободы для сокращения числа строк.

Как строится попарный набор

Силлабус Test Analyst отмечает, что найти минимальный набор тест-кейсов с попарным покрытием в общем случае трудно. Небольшие наборы, как в примере, можно построить вручную по известному ортогональному массиву. Большие наборы генерируют инструменты, которые используют эвристики, поэтому размер результата может отличаться от инструмента к инструменту.

Работа идёт по шагам:

  • Параметры и значения. Параметры берут из базиса тестирования, значения - классы каждого параметра.
  • Ограничения. Сочетания, которые не могут возникнуть, записывают в виде правил.
  • Генерация. Инструмент строит покрывающий массив нужной силы.
  • Обязательные строки. Добавляют сочетания, которые нужно проверить обязательно, например самую распространённую конфигурацию или конфигурацию из отчёта о дефекте.
  • Ожидаемые результаты. Каждая строка получает ожидаемый результат из базиса тестирования.

Microsoft PICT - генератор с интерфейсом командной строки, опубликованный на GitHub. Файл модели перечисляет по одному параметру в строке в виде Name: value1, value2, а ограничения - в виде IF [Parameter] = "value" THEN ...;. Порядок сочетаний по умолчанию - 2, он задаётся параметром /o. Модель разобранного примера с одним ограничением:

Bash
cat > checkout.txt <<'EOF'
Browser:  Chrome, Firefox, Safari
OS:       Windows, macOS, Linux
Payment:  Card, Wallet, Invoice
Language: en, de

IF [Browser] = "Safari" THEN [OS] = "macOS";
EOF

pict checkout.txt /o:2

PICT выводит тест-кейсы строками, разделёнными табуляцией, с первой строкой из имён параметров. Обязательные строки (seeding rows) задаются в отдельном файле. NIST публикует ACTS - генератор покрывающих массивов, который тоже поддерживает ограничения и силу больше 2; по данным страницы проекта, последняя версия - 3.3, инструмент бесплатный и высылается по запросу.

Ограничения между параметрами

Реальные параметры редко независимы. Safari работает только на macOS; оплата по счёту может быть недоступна гостям; функция может существовать только на одном языке. Ограничение (constraint) - правило, которое исключает сочетания, которые не могут возникнуть или не разрешены. Без ограничений генератор помещает такие сочетания в тест-кейсы, и эти тест-кейсы невозможно выполнить: PW-7 и PW-9 из примера запускают Safari на Windows и Linux.

Ограничение меняет и полное произведение, и пары, которые нужно покрыть. С правилом «Safari только на macOS»:

Число Без ограничения С ограничением
Сочетаний в полном произведении 54 42
Пар значений для покрытия 45 43
Минимум попарных тест-кейсов 9 11

Пары (Safari, Windows) и (Safari, Linux) исчезают, но минимальный набор растёт. Safari должен встретиться с тремя способами оплаты, и все эти строки теперь на macOS. Windows и Linux нужно по три строки на три способа оплаты, с Chrome или Firefox. Chrome и Firefox нужно ещё по строке с macOS. Получается 3 + 3 + 3 + 2 = 11 строк:

Тест-кейс Browser OS Payment Language
PC-1 Chrome Windows Card en
PC-2 Firefox Windows Wallet de
PC-3 Chrome Windows Invoice de
PC-4 Firefox Linux Card de
PC-5 Chrome Linux Wallet en
PC-6 Firefox Linux Invoice en
PC-7 Safari macOS Card en
PC-8 Safari macOS Wallet de
PC-9 Safari macOS Invoice en
PC-10 Chrome macOS Card de
PC-11 Firefox macOS Wallet en

Ограничение - это утверждение о системе. Если магазин можно открыть в Safari на другой платформе, правило неверно, и сочетание, которое оно исключает, - как раз то, что не проверено.

Недопустимые значения - отдельный случай. Негативный тест проверяет значение вне допустимого диапазона, например просроченную карту. Два недопустимых значения в одном тест-кейсе могут маскировать друг друга: первая ошибка останавливает обработку, и вторая не проверяется. PICT помечает недопустимые значения префиксом ~ и помещает в тест-кейс не больше одного из них.

Более высокая сила и пределы попарного тестирования

Попарное тестирование - это тестирование t-сочетаний при t = 2. Тестирование t-сочетаний (t-way testing) покрывает каждое сочетание значений любых t параметров; t называют силой (strength). Эмпирический вопрос в том, каким должно быть t. Кун, Уоллес и Галло проанализировали отчёты об отказах программ нескольких видов:

Данные Результат
ПО медицинских устройств, отзывы FDA 97 процентов проанализированных дефектов можно было найти проверкой всех пар; самый сложный требовал четырёх условий
Браузер Mozilla и сервер Apache Более 70 процентов отказов вызваны одним или двумя условиями; ни один не требовал больше шести
Распределённая база данных NASA, по NIST SP 800-142 67 процентов вызваны одним параметром, 93 процента - двумя, 98 процентов - тремя
Планировщик NASA Remote Agent Пары нашли более 80 процентов дефектов корректности и сходимости и около половины дефектов движка и интерфейсов

Авторы делают вывод, что попарное тестирование часто эффективно, но не всегда достаточно, и что для тестирования, близкого к исчерпывающему, нужна сила от 4 до 6 в зависимости от требований к надёжности. NIST обобщает свои исследования так же: большинство отказов вызваны одним или двумя параметрами, всё меньше - тремя и более, а наблюдавшиеся отказы вызывались взаимодействием от 1 до 6 параметров. Более высокая сила доступна: для 34 переключателей NIST приводит 33 теста для всех сочетаний трёх параметров и 85 - для всех сочетаний четырёх.

Попарного тестирования недостаточно в нескольких случаях:

  • Высокий риск. Программы, отказ которых дорого обходится, тестируют с силой 3 и выше.
  • Последовательности. Комбинаторное тестирование менее эффективно, когда отказ зависит от порядка событий. Такое поведение проверяют тестированием переходов состояний.
  • Известные бизнес-правила. Когда результат определён для конкретных сочетаний условий, все они покрываются таблицей решений.
  • Значения внутри параметра. Попарное тестирование использует те значения, которые ему дали. Граничные значения должны быть среди них, иначе тесты пропустят дефекты на границах.

Попарное тестирование и смежные техники

Комбинаторные техники различаются тем, какие сочетания они требуют. Таблица упорядочивает их от самой слабой к самой сильной и для сравнения добавляет таблицы решений.

Техника Что покрывается Тестов для примера
Покрытие Each Choice Каждое значение каждого параметра один раз 3
Покрытие базового выбора Базовое сочетание и каждое одиночное изменение в нём 1 + 2 + 2 + 2 + 1 = 8
Попарное тестирование Каждая пара значений любых двух параметров 9
Тестирование t-сочетаний, t = 3 Каждая тройка значений любых трёх параметров не меньше 27
Все сочетания Полное произведение 54
Тестирование с таблицами решений Каждое выполнимое сочетание условий одного правила зависит от правила

Покрытие Each Choice описано в статье о классах эквивалентности; оно проверяет значения, а не взаимодействия. При покрытии базового выбора (base choice coverage), как его описывает силлабус Test Analyst, одно значение каждого параметра выбирают базовым, например самое распространённое. Первый тест-кейс использует все базовые значения, а каждый следующий меняет один параметр на одно из других его значений. Оно отвечает на вопрос «работает ли каждое отклонение от обычного случая?», но не сочетает два отклонения.

Таблицы решений и попарное тестирование опираются на противоположные предположения. Таблица решений предполагает, что результат зависит от известного сочетания условий, и покрывает все такие сочетания одного правила. Попарное тестирование предполагает, что параметры в основном независимы и что неизвестные взаимодействия происходят в основном между двумя из них. Их сочетают: правило с зависимыми условиями помещают в таблицу решений, а независимые параметры конфигурации вокруг него - в попарный набор.

Термины

Термин Значение
Попарное тестирование (pairwise testing) Техника тестирования методом чёрного ящика, при которой тест-кейсы задействуют пары из пар «параметр - значение»
Комбинаторное тестирование (combinatorial testing) Техника тестирования методом чёрного ящика, при которой тест-кейсы задействуют определённые сочетания значений нескольких параметров
Пара «параметр - значение» (parameter-value pair) Параметр вместе с одним из его значений, например (Browser, Safari)
Ортогональный массив (orthogonal array) Таблица, в которой каждое сочетание значений любых t столбцов встречается одинаковое число раз
Покрывающий массив (covering array) Таблица, в которой каждое сочетание значений любых t столбцов встречается хотя бы один раз
Ограничение (constraint) Правило, которое исключает сочетания значений параметров, которые не могут возникнуть или не разрешены
Тестирование t-сочетаний (t-way testing) Комбинаторное тестирование, которое покрывает каждое сочетание значений любых t параметров; t - сила
Покрытие базового выбора (base choice coverage) Покрытие базового сочетания значений и каждого изменения одного параметра в нём

Источники

Серия

Техники тест-дизайна
  1. Классы эквивалентности и граничные значения
  2. Таблицы решений
  3. Тестирование переходов состояний
  4. Попарное тестированиеТекущая
  5. Тестирование по вариантам использования

Статьи Wiki пишет и поддерживает команда ComplexQA.