Попарное тестирование (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. Модель разобранного примера с одним ограничением:
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:2PICT выводит тест-кейсы строками, разделёнными табуляцией, с первой строкой из имён параметров. Обязательные строки (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) | Покрытие базового сочетания значений и каждого изменения одного параметра в нём |
Источники
- ISTQB Certified Tester Advanced Level Test Analyst Syllabus v4.0, ISTQB, 2025(откроется в новой вкладке) (на английском)
- ISTQB Certified Tester Foundation Level Syllabus v4.0.1, ISTQB, 2024(откроется в новой вкладке) (на английском)
- Глоссарий ISTQB(откроется в новой вкладке) (на английском)
- Зеркало глоссария ISTQB: pairwise testing, imbus(откроется в новой вкладке) (на английском)
- ISO/IEC/IEEE 29119-4:2021, Software and systems engineering, Software testing, Part 4: Test techniques(откроется в новой вкладке) (на английском)
- Orthogonal Latin squares: an application of experiment design to compiler testing, R. Mandl, Communications of the ACM, vol. 28, no. 10, 1985(откроется в новой вкладке) (на английском)
- Software Fault Interactions and Implications for Software Testing, D. R. Kuhn, D. R. Wallace, A. M. Gallo, IEEE Transactions on Software Engineering, vol. 30, no. 6, 2004(откроется в новой вкладке) (на английском)
- Practical Combinatorial Testing, NIST SP 800-142, D. R. Kuhn, R. N. Kacker, Y. Lei, October 2010(откроется в новой вкладке) (на английском)
- Advanced Combinatorial Test Methods for System Reliability, D. R. Kuhn, R. N. Kacker, Y. Lei, IEEE Reliability Society 2010 Annual Technical Report(откроется в новой вкладке) (на английском)
- Automated Combinatorial Testing for Software (ACTS), NIST(откроется в новой вкладке) (на английском)
- PICT documentation, Microsoft, GitHub(откроется в новой вкладке) (на английском)