[{"data":1,"prerenderedAt":42},["ShallowReactive",2],{"wiki-test-design-pairwise-testing-ru":3},{"meta":4,"html":8,"headings":9,"words":41},{"title":5,"description":6,"published":7,"updated":7,"sourceUpdated":7},"Попарное тестирование","Попарное тестирование: комбинаторный взрыв, покрытие всех пар значений параметров, покрывающие и ортогональные массивы, ограничения и t-сочетания.","2026-11-03","\u003Cp>\u003Cstrong>Попарное тестирование\u003C/strong> (pairwise testing) - техника тестирования методом чёрного ящика, при которой \u003Cspan class=\"wiki-term\" tabindex=\"0\" data-wiki-term=\"test-case\">тест-кейсы\u003C/span> строятся так, чтобы задействовать пары из пар «параметр - значение»: каждое значение каждого параметра хотя бы раз встречается вместе с каждым значением каждого другого параметра. Оно относится к \u003Cstrong>комбинаторному тестированию\u003C/strong> (combinatorial testing) - группе техник, в которых тест-кейсы задействуют определённые сочетания значений нескольких параметров. Попарное тестирование сокращает число тест-кейсов с произведения количеств всех значений до числа, которое медленно растёт с числом параметров.\u003C/p>\n\u003Cp>Техника пришла из статистического планирования экспериментов. В 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 техника не входит.\u003C/p>\n\u003Ch2 id=\"какую-задачу-решает-попарное-тестирование\" class=\"wiki-heading\">Какую задачу решает попарное тестирование\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"какую-задачу-решает-попарное-тестирование\" aria-label=\"Скопировать ссылку на раздел\" data-copied-label=\"Ссылка на раздел скопирована\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Cp>Число сочетаний значений параметров равно произведению количеств значений. У веб-формы, которую проверяют в трёх браузерах, трёх операционных системах, с тремя способами оплаты и на двух языках, 3 x 3 x 3 x 2 = 54 сочетания. Каждый новый параметр умножает это число. NIST приводит пример панели из 34 переключателей «вкл/выкл»: исчерпывающее тестирование потребовало бы 2 в степени 34 настроек, около 1,7 x 10^10.\u003C/p>\n\u003Cp>Поэтому проверить все сочетания для большинства реальных конфигураций невозможно. Проверить каждое значение по одному разу, как это делает \u003Cspan class=\"wiki-term\" tabindex=\"0\" data-wiki-term=\"each-choice-coverage\">покрытие Each Choice\u003C/span>, дёшево, но не проверяет ни одного взаимодействия: \u003Cspan class=\"wiki-term\" tabindex=\"0\" data-wiki-term=\"defect\">дефект\u003C/span>, который проявляется только в Safari при оплате по счёту, можно пропустить. Попарное тестирование - промежуточная точка. Оно исходит из того, что большинство отказов вызывает один параметр или взаимодействие двух, и покрывает все такие взаимодействия небольшим набором тест-кейсов.\u003C/p>\n\u003Cp>Выигрыш растёт с числом параметров. По данным NIST SP 800-142, число тестов, нужных для покрытия всех сочетаний t параметров, растёт пропорционально v^t log n, где v - число значений параметра, а n - число параметров. Произведение всех значений растёт как v^n.\u003C/p>\n\u003Ch2 id=\"параметры-значения-и-пары\" class=\"wiki-heading\">Параметры, значения и пары\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"параметры-значения-и-пары\" aria-label=\"Скопировать ссылку на раздел\" data-copied-label=\"Ссылка на раздел скопирована\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Cp>На входе техники - список параметров и их значений. Параметр - это ввод или настройка конфигурации: браузер, операционная система, способ оплаты, роль пользователя. Его значения - обычно \u003Cspan class=\"wiki-term\" tabindex=\"0\" data-wiki-term=\"equivalence-partition\">классы эквивалентности\u003C/span> параметра, а не все возможные значения: «карта» представляет все типы карт, если они обрабатываются одинаково. Как их выбирать, описано в статье \u003Ca href=\"/ru/wiki/test-design/equivalence-partitioning-and-boundary-values\" class=\"wiki-link wiki-link--article\">Классы эквивалентности и граничные значения\u003C/a>.\u003C/p>\n\u003Cp>\u003Cstrong>Пара «параметр - значение»\u003C/strong> (parameter-value pair) - параметр вместе с одним из его значений, например (Browser, Safari). В силлабусе Test Analyst элементы покрытия попарного тестирования - пары из пар «параметр - значение» для любых двух параметров, например (Browser, Safari) вместе с (Payment, Invoice). Покрытие - число таких пар, задействованных тестами, делённое на число всех таких пар.\u003C/p>\n\u003Cp>Число элементов покрытия - сумма по всем парам параметров произведений количеств их значений. Для формы выше оно такое:\u003C/p>\n\u003Cdiv class=\"wiki-table wiki-table--cols-2\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Пара параметров\u003C/th>\n\u003Cth>Пар значений\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Browser и OS\u003C/td>\n\u003Ctd>3 x 3 = 9\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Browser и Payment\u003C/td>\n\u003Ctd>3 x 3 = 9\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Browser и Language\u003C/td>\n\u003Ctd>3 x 2 = 6\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>OS и Payment\u003C/td>\n\u003Ctd>3 x 3 = 9\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>OS и Language\u003C/td>\n\u003Ctd>3 x 2 = 6\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Payment и Language\u003C/td>\n\u003Ctd>3 x 2 = 6\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Итого\u003C/td>\n\u003Ctd>45\u003C/td>\n\u003C/tr>\n\u003C/tbody>\n\u003C/table>\u003C/div>\n\u003Cp>Каждый тест-кейс покрывает по одной паре значений для каждой пары параметров, то есть сразу шесть элементов покрытия. Поэтому тест-кейсов нужно гораздо меньше, чем 54.\u003C/p>\n\u003Ch2 id=\"разобранный-пример\" class=\"wiki-heading\">Разобранный пример\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"разобранный-пример\" aria-label=\"Скопировать ссылку на раздел\" data-copied-label=\"Ссылка на раздел скопирована\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Cp>Параметры примера:\u003C/p>\n\u003Cdiv class=\"wiki-table wiki-table--cols-2\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Параметр\u003C/th>\n\u003Cth>Значения\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Browser\u003C/td>\n\u003Ctd>Chrome, Firefox, Safari\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>OS\u003C/td>\n\u003Ctd>Windows, macOS, Linux\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Payment\u003C/td>\n\u003Ctd>Card, Wallet, Invoice\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Language\u003C/td>\n\u003Ctd>en, de\u003C/td>\n\u003C/tr>\n\u003C/tbody>\n\u003C/table>\u003C/div>\n\u003Cp>Полное произведение содержит 54 сочетания. Попарному набору нужно не меньше 9 тест-кейсов: 9 пар значений Browser и OS можно покрыть только 9 разными строками. Следующие 9 тест-кейсов покрывают все 45 пар:\u003C/p>\n\u003Cdiv class=\"wiki-table wiki-table--cols-5\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Тест-кейс\u003C/th>\n\u003Cth>Browser\u003C/th>\n\u003Cth>OS\u003C/th>\n\u003Cth>Payment\u003C/th>\n\u003Cth>Language\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>PW-1\u003C/td>\n\u003Ctd>Chrome\u003C/td>\n\u003Ctd>Windows\u003C/td>\n\u003Ctd>Card\u003C/td>\n\u003Ctd>en\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>PW-2\u003C/td>\n\u003Ctd>Chrome\u003C/td>\n\u003Ctd>macOS\u003C/td>\n\u003Ctd>Wallet\u003C/td>\n\u003Ctd>de\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>PW-3\u003C/td>\n\u003Ctd>Chrome\u003C/td>\n\u003Ctd>Linux\u003C/td>\n\u003Ctd>Invoice\u003C/td>\n\u003Ctd>en\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>PW-4\u003C/td>\n\u003Ctd>Firefox\u003C/td>\n\u003Ctd>Windows\u003C/td>\n\u003Ctd>Wallet\u003C/td>\n\u003Ctd>en\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>PW-5\u003C/td>\n\u003Ctd>Firefox\u003C/td>\n\u003Ctd>macOS\u003C/td>\n\u003Ctd>Invoice\u003C/td>\n\u003Ctd>en\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>PW-6\u003C/td>\n\u003Ctd>Firefox\u003C/td>\n\u003Ctd>Linux\u003C/td>\n\u003Ctd>Card\u003C/td>\n\u003Ctd>de\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>PW-7\u003C/td>\n\u003Ctd>Safari\u003C/td>\n\u003Ctd>Windows\u003C/td>\n\u003Ctd>Invoice\u003C/td>\n\u003Ctd>de\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>PW-8\u003C/td>\n\u003Ctd>Safari\u003C/td>\n\u003Ctd>macOS\u003C/td>\n\u003Ctd>Card\u003C/td>\n\u003Ctd>en\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>PW-9\u003C/td>\n\u003Ctd>Safari\u003C/td>\n\u003Ctd>Linux\u003C/td>\n\u003Ctd>Wallet\u003C/td>\n\u003Ctd>en\u003C/td>\n\u003C/tr>\n\u003C/tbody>\n\u003C/table>\u003C/div>\n\u003Cp>Набор можно проверить пару за парой. Safari встречается с Invoice в PW-7, Linux с de - в PW-6, Wallet с de - в PW-2. Каждое значение Browser встречается с каждым значением OS и Payment ровно один раз, а оба языка встречаются с каждым значением остальных параметров.\u003C/p>\n\u003Cp>Таблица задаёт только входные данные. Каждая строка становится тест-кейсом со своим \u003Cspan class=\"wiki-term\" tabindex=\"0\" data-wiki-term=\"expected-result\">ожидаемым результатом\u003C/span>, взятым из базиса тестирования: заказ оформлен, страница подтверждения на выбранном языке, оплата по счёту предложена или нет. Сочетания, о которых известно, что они рискованны, добавляют к сгенерированному набору вручную.\u003C/p>\n\u003Ch2 id=\"ортогональные-и-покрывающие-массивы\" class=\"wiki-heading\">Ортогональные и покрывающие массивы\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"ортогональные-и-покрывающие-массивы\" aria-label=\"Скопировать ссылку на раздел\" data-copied-label=\"Ссылка на раздел скопирована\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Cp>Для построения комбинаторных \u003Cspan class=\"wiki-term\" tabindex=\"0\" data-wiki-term=\"test-suite\">наборов тестов\u003C/span> используют два математических объекта. \u003Cstrong>Ортогональный массив\u003C/strong> (orthogonal array) силы t - таблица, в которой каждое сочетание значений любых t столбцов встречается одинаковое число раз. Он пришёл из планирования экспериментов, где сбалансированность нужна, чтобы статистически оценить влияние каждого фактора. \u003Cstrong>Покрывающий массив\u003C/strong> (covering array) силы t - таблица, в которой каждое сочетание значений любых t столбцов встречается хотя бы один раз. Кун, Рагху Какер (Raghu Kacker) и Юй Лей (Yu Lei) описывают наборы тестов на основе покрывающих массивов как несбалансированные и отмечают, что статистические модели в таком тестировании не используются.\u003C/p>\n\u003Cdiv class=\"wiki-table wiki-table--cols-3\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Свойство\u003C/th>\n\u003Cth>Ортогональный массив\u003C/th>\n\u003Cth>Покрывающий массив\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Каждое сочетание t значений встречается\u003C/td>\n\u003Ctd>Одинаковое число раз\u003C/td>\n\u003Ctd>Хотя бы один раз\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Сбалансированность\u003C/td>\n\u003Ctd>Обязательна\u003C/td>\n\u003Ctd>Не требуется\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Происхождение\u003C/td>\n\u003Ctd>Планирование экспериментов\u003C/td>\n\u003Ctd>Комбинаторные схемы, тестирование программ\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Статистическая модель результатов\u003C/td>\n\u003Ctd>Используется\u003C/td>\n\u003Ctd>Не используется\u003C/td>\n\u003C/tr>\n\u003C/tbody>\n\u003C/table>\u003C/div>\n\u003Cp>Для четырёх параметров с тремя значениями каждый известен ортогональный массив силы 2 из 9 строк. Полное произведение содержит 81 сочетание, массив - 9 строк, и каждая из 54 пар значений встречается ровно в одной строке. Таблица разобранного примера построена из того же массива, но у Language только два значения. В четвёртом столбце массива три значения, и третье из них заменено на en, поэтому en встречается в шести строках, а de - в трёх. Каждая пара по-прежнему покрыта, но не одинаково часто: таблица - покрывающий массив, а не ортогональный.\u003C/p>\n\u003Cp>Для поиска отказов сбалансированность не нужна. Тест либо вызывает отказ, либо нет, и пара, проверенная дважды, не даёт больше покрытия, чем пара, проверенная один раз. Поэтому инструменты генерации попарных наборов строят покрывающие массивы: отказ от требования сбалансированности оставляет больше свободы для сокращения числа строк.\u003C/p>\n\u003Ch2 id=\"как-строится-попарный-набор\" class=\"wiki-heading\">Как строится попарный набор\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"как-строится-попарный-набор\" aria-label=\"Скопировать ссылку на раздел\" data-copied-label=\"Ссылка на раздел скопирована\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Cp>Силлабус Test Analyst отмечает, что найти минимальный набор тест-кейсов с попарным покрытием в общем случае трудно. Небольшие наборы, как в примере, можно построить вручную по известному ортогональному массиву. Большие наборы генерируют инструменты, которые используют эвристики, поэтому размер результата может отличаться от инструмента к инструменту.\u003C/p>\n\u003Cp>Работа идёт по шагам:\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Параметры и значения.\u003C/strong> Параметры берут из базиса тестирования, значения - классы каждого параметра.\u003C/li>\n\u003Cli>\u003Cstrong>Ограничения.\u003C/strong> Сочетания, которые не могут возникнуть, записывают в виде правил.\u003C/li>\n\u003Cli>\u003Cstrong>Генерация.\u003C/strong> Инструмент строит покрывающий массив нужной силы.\u003C/li>\n\u003Cli>\u003Cstrong>Обязательные строки.\u003C/strong> Добавляют сочетания, которые нужно проверить обязательно, например самую распространённую конфигурацию или конфигурацию из \u003Cspan class=\"wiki-term\" tabindex=\"0\" data-wiki-term=\"defect-report\">отчёта о дефекте\u003C/span>.\u003C/li>\n\u003Cli>\u003Cstrong>Ожидаемые результаты.\u003C/strong> Каждая строка получает ожидаемый результат из базиса тестирования.\u003C/li>\n\u003C/ul>\n\u003Cp>Microsoft PICT - генератор с интерфейсом командной строки, опубликованный на GitHub. Файл модели перечисляет по одному параметру в строке в виде \u003Ccode>Name: value1, value2\u003C/code>, а ограничения - в виде \u003Ccode>IF [Parameter] = &quot;value&quot; THEN ...;\u003C/code>. Порядок сочетаний по умолчанию - 2, он задаётся параметром \u003Ccode>/o\u003C/code>. Модель разобранного примера с одним ограничением:\u003C/p>\n\u003Cdiv class=\"wiki-code\" data-language=\"bash\">\u003Cdiv class=\"wiki-code__header\">\u003Cspan class=\"wiki-code__language\">Bash\u003C/span>\u003Cbutton type=\"button\" class=\"wiki-code__copy\" data-wiki-copy data-copied-label=\"Скопировано\">\u003Csvg class=\"wiki-code__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M216,28H88A12,12,0,0,0,76,40V76H40A12,12,0,0,0,28,88V216a12,12,0,0,0,12,12H168a12,12,0,0,0,12-12V180h36a12,12,0,0,0,12-12V40A12,12,0,0,0,216,28ZM156,204H52V100H156Zm48-48H180V88a12,12,0,0,0-12-12H100V52H204Z\"/>\u003C/svg>\u003Csvg class=\"wiki-code__icon wiki-code__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003Cspan class=\"wiki-code__label\">Копировать\u003C/span>\u003Cspan class=\"wiki-code__label wiki-code__label--done\">Скопировано\u003C/span>\u003C/button>\u003C/div>\u003Cpre>\u003Ccode>cat &gt; checkout.txt &lt;&lt;'EOF'\nBrowser:  Chrome, Firefox, Safari\nOS:       Windows, macOS, Linux\nPayment:  Card, Wallet, Invoice\nLanguage: en, de\n\nIF [Browser] = &quot;Safari&quot; THEN [OS] = &quot;macOS&quot;;\nEOF\n\npict checkout.txt /o:2\u003C/code>\u003C/pre>\u003C/div>\n\u003Cp>PICT выводит тест-кейсы строками, разделёнными табуляцией, с первой строкой из имён параметров. Обязательные строки (seeding rows) задаются в отдельном файле. NIST публикует ACTS - генератор покрывающих массивов, который тоже поддерживает ограничения и силу больше 2; по данным страницы проекта, последняя версия - 3.3, инструмент бесплатный и высылается по запросу.\u003C/p>\n\u003Ch2 id=\"ограничения-между-параметрами\" class=\"wiki-heading\">Ограничения между параметрами\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"ограничения-между-параметрами\" aria-label=\"Скопировать ссылку на раздел\" data-copied-label=\"Ссылка на раздел скопирована\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Cp>Реальные параметры редко независимы. Safari работает только на macOS; оплата по счёту может быть недоступна гостям; функция может существовать только на одном языке. \u003Cstrong>Ограничение\u003C/strong> (constraint) - правило, которое исключает сочетания, которые не могут возникнуть или не разрешены. Без ограничений генератор помещает такие сочетания в тест-кейсы, и эти тест-кейсы невозможно выполнить: PW-7 и PW-9 из примера запускают Safari на Windows и Linux.\u003C/p>\n\u003Cp>Ограничение меняет и полное произведение, и пары, которые нужно покрыть. С правилом «Safari только на macOS»:\u003C/p>\n\u003Cdiv class=\"wiki-table wiki-table--cols-3\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Число\u003C/th>\n\u003Cth>Без ограничения\u003C/th>\n\u003Cth>С ограничением\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Сочетаний в полном произведении\u003C/td>\n\u003Ctd>54\u003C/td>\n\u003Ctd>42\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Пар значений для покрытия\u003C/td>\n\u003Ctd>45\u003C/td>\n\u003Ctd>43\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Минимум попарных тест-кейсов\u003C/td>\n\u003Ctd>9\u003C/td>\n\u003Ctd>11\u003C/td>\n\u003C/tr>\n\u003C/tbody>\n\u003C/table>\u003C/div>\n\u003Cp>Пары (Safari, Windows) и (Safari, Linux) исчезают, но минимальный набор растёт. Safari должен встретиться с тремя способами оплаты, и все эти строки теперь на macOS. Windows и Linux нужно по три строки на три способа оплаты, с Chrome или Firefox. Chrome и Firefox нужно ещё по строке с macOS. Получается 3 + 3 + 3 + 2 = 11 строк:\u003C/p>\n\u003Cdiv class=\"wiki-table wiki-table--cols-5\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Тест-кейс\u003C/th>\n\u003Cth>Browser\u003C/th>\n\u003Cth>OS\u003C/th>\n\u003Cth>Payment\u003C/th>\n\u003Cth>Language\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>PC-1\u003C/td>\n\u003Ctd>Chrome\u003C/td>\n\u003Ctd>Windows\u003C/td>\n\u003Ctd>Card\u003C/td>\n\u003Ctd>en\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>PC-2\u003C/td>\n\u003Ctd>Firefox\u003C/td>\n\u003Ctd>Windows\u003C/td>\n\u003Ctd>Wallet\u003C/td>\n\u003Ctd>de\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>PC-3\u003C/td>\n\u003Ctd>Chrome\u003C/td>\n\u003Ctd>Windows\u003C/td>\n\u003Ctd>Invoice\u003C/td>\n\u003Ctd>de\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>PC-4\u003C/td>\n\u003Ctd>Firefox\u003C/td>\n\u003Ctd>Linux\u003C/td>\n\u003Ctd>Card\u003C/td>\n\u003Ctd>de\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>PC-5\u003C/td>\n\u003Ctd>Chrome\u003C/td>\n\u003Ctd>Linux\u003C/td>\n\u003Ctd>Wallet\u003C/td>\n\u003Ctd>en\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>PC-6\u003C/td>\n\u003Ctd>Firefox\u003C/td>\n\u003Ctd>Linux\u003C/td>\n\u003Ctd>Invoice\u003C/td>\n\u003Ctd>en\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>PC-7\u003C/td>\n\u003Ctd>Safari\u003C/td>\n\u003Ctd>macOS\u003C/td>\n\u003Ctd>Card\u003C/td>\n\u003Ctd>en\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>PC-8\u003C/td>\n\u003Ctd>Safari\u003C/td>\n\u003Ctd>macOS\u003C/td>\n\u003Ctd>Wallet\u003C/td>\n\u003Ctd>de\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>PC-9\u003C/td>\n\u003Ctd>Safari\u003C/td>\n\u003Ctd>macOS\u003C/td>\n\u003Ctd>Invoice\u003C/td>\n\u003Ctd>en\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>PC-10\u003C/td>\n\u003Ctd>Chrome\u003C/td>\n\u003Ctd>macOS\u003C/td>\n\u003Ctd>Card\u003C/td>\n\u003Ctd>de\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>PC-11\u003C/td>\n\u003Ctd>Firefox\u003C/td>\n\u003Ctd>macOS\u003C/td>\n\u003Ctd>Wallet\u003C/td>\n\u003Ctd>en\u003C/td>\n\u003C/tr>\n\u003C/tbody>\n\u003C/table>\u003C/div>\n\u003Cp>Ограничение - это утверждение о системе. Если магазин можно открыть в Safari на другой платформе, правило неверно, и сочетание, которое оно исключает, - как раз то, что не проверено.\u003C/p>\n\u003Cp>Недопустимые значения - отдельный случай. Негативный тест проверяет значение вне допустимого диапазона, например просроченную карту. Два недопустимых значения в одном тест-кейсе могут маскировать друг друга: первая ошибка останавливает обработку, и вторая не проверяется. PICT помечает недопустимые значения префиксом \u003Ccode>~\u003C/code> и помещает в тест-кейс не больше одного из них.\u003C/p>\n\u003Ch2 id=\"более-высокая-сила-и-пределы-попарного-тестирования\" class=\"wiki-heading\">Более высокая сила и пределы попарного тестирования\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"более-высокая-сила-и-пределы-попарного-тестирования\" aria-label=\"Скопировать ссылку на раздел\" data-copied-label=\"Ссылка на раздел скопирована\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Cp>Попарное тестирование - это тестирование t-сочетаний при t = 2. \u003Cstrong>Тестирование t-сочетаний\u003C/strong> (t-way testing) покрывает каждое сочетание значений любых t параметров; t называют силой (strength). Эмпирический вопрос в том, каким должно быть t. Кун, Уоллес и Галло проанализировали отчёты об отказах программ нескольких видов:\u003C/p>\n\u003Cdiv class=\"wiki-table wiki-table--cols-2\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Данные\u003C/th>\n\u003Cth>Результат\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>ПО медицинских устройств, отзывы FDA\u003C/td>\n\u003Ctd>97 процентов проанализированных дефектов можно было найти проверкой всех пар; самый сложный требовал четырёх условий\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Браузер Mozilla и сервер Apache\u003C/td>\n\u003Ctd>Более 70 процентов отказов вызваны одним или двумя условиями; ни один не требовал больше шести\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Распределённая база данных NASA, по NIST SP 800-142\u003C/td>\n\u003Ctd>67 процентов вызваны одним параметром, 93 процента - двумя, 98 процентов - тремя\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Планировщик NASA Remote Agent\u003C/td>\n\u003Ctd>Пары нашли более 80 процентов дефектов корректности и сходимости и около половины дефектов движка и интерфейсов\u003C/td>\n\u003C/tr>\n\u003C/tbody>\n\u003C/table>\u003C/div>\n\u003Cp>Авторы делают вывод, что попарное тестирование часто эффективно, но не всегда достаточно, и что для тестирования, близкого к исчерпывающему, нужна сила от 4 до 6 в зависимости от требований к надёжности. NIST обобщает свои исследования так же: большинство отказов вызваны одним или двумя параметрами, всё меньше - тремя и более, а наблюдавшиеся отказы вызывались взаимодействием от 1 до 6 параметров. Более высокая сила доступна: для 34 переключателей NIST приводит 33 теста для всех сочетаний трёх параметров и 85 - для всех сочетаний четырёх.\u003C/p>\n\u003Cp>Попарного тестирования недостаточно в нескольких случаях:\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Высокий риск.\u003C/strong> Программы, отказ которых дорого обходится, тестируют с силой 3 и выше.\u003C/li>\n\u003Cli>\u003Cstrong>Последовательности.\u003C/strong> Комбинаторное тестирование менее эффективно, когда отказ зависит от порядка событий. Такое поведение проверяют \u003Ca href=\"/ru/wiki/test-design/state-transition-testing\" class=\"wiki-link wiki-link--article\">тестированием переходов состояний\u003C/a>.\u003C/li>\n\u003Cli>\u003Cstrong>Известные бизнес-правила.\u003C/strong> Когда результат определён для конкретных сочетаний условий, все они покрываются \u003Ca href=\"/ru/wiki/test-design/decision-table-testing\" class=\"wiki-link wiki-link--article\">таблицей решений\u003C/a>.\u003C/li>\n\u003Cli>\u003Cstrong>Значения внутри параметра.\u003C/strong> Попарное тестирование использует те значения, которые ему дали. \u003Cspan class=\"wiki-term\" tabindex=\"0\" data-wiki-term=\"boundary-value\">Граничные значения\u003C/span> должны быть среди них, иначе тесты пропустят дефекты на границах.\u003C/li>\n\u003C/ul>\n\u003Ch2 id=\"попарное-тестирование-и-смежные-техники\" class=\"wiki-heading\">Попарное тестирование и смежные техники\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"попарное-тестирование-и-смежные-техники\" aria-label=\"Скопировать ссылку на раздел\" data-copied-label=\"Ссылка на раздел скопирована\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Cp>Комбинаторные техники различаются тем, какие сочетания они требуют. Таблица упорядочивает их от самой слабой к самой сильной и для сравнения добавляет \u003Cspan class=\"wiki-term\" tabindex=\"0\" data-wiki-term=\"decision-table\">таблицы решений\u003C/span>.\u003C/p>\n\u003Cdiv class=\"wiki-table wiki-table--cols-3\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Техника\u003C/th>\n\u003Cth>Что покрывается\u003C/th>\n\u003Cth>Тестов для примера\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Покрытие Each Choice\u003C/td>\n\u003Ctd>Каждое значение каждого параметра один раз\u003C/td>\n\u003Ctd>3\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Покрытие базового выбора\u003C/td>\n\u003Ctd>Базовое сочетание и каждое одиночное изменение в нём\u003C/td>\n\u003Ctd>1 + 2 + 2 + 2 + 1 = 8\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Попарное тестирование\u003C/td>\n\u003Ctd>Каждая пара значений любых двух параметров\u003C/td>\n\u003Ctd>9\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Тестирование t-сочетаний, t = 3\u003C/td>\n\u003Ctd>Каждая тройка значений любых трёх параметров\u003C/td>\n\u003Ctd>не меньше 27\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Все сочетания\u003C/td>\n\u003Ctd>Полное произведение\u003C/td>\n\u003Ctd>54\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Тестирование с таблицами решений\u003C/td>\n\u003Ctd>Каждое выполнимое сочетание условий одного правила\u003C/td>\n\u003Ctd>зависит от правила\u003C/td>\n\u003C/tr>\n\u003C/tbody>\n\u003C/table>\u003C/div>\n\u003Cp>Покрытие Each Choice описано в статье о классах эквивалентности; оно проверяет значения, а не взаимодействия. При покрытии базового выбора (base choice coverage), как его описывает силлабус Test Analyst, одно значение каждого параметра выбирают базовым, например самое распространённое. Первый тест-кейс использует все базовые значения, а каждый следующий меняет один параметр на одно из других его значений. Оно отвечает на вопрос «работает ли каждое отклонение от обычного случая?», но не сочетает два отклонения.\u003C/p>\n\u003Cp>Таблицы решений и попарное тестирование опираются на противоположные предположения. Таблица решений предполагает, что результат зависит от известного сочетания условий, и покрывает все такие сочетания одного правила. Попарное тестирование предполагает, что параметры в основном независимы и что неизвестные взаимодействия происходят в основном между двумя из них. Их сочетают: правило с зависимыми условиями помещают в таблицу решений, а независимые параметры конфигурации вокруг него - в попарный набор.\u003C/p>\n\u003Ch2 id=\"термины\" class=\"wiki-heading\">Термины\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"термины\" aria-label=\"Скопировать ссылку на раздел\" data-copied-label=\"Ссылка на раздел скопирована\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Cdiv class=\"wiki-table wiki-table--cols-2\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Термин\u003C/th>\n\u003Cth>Значение\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Попарное тестирование (pairwise testing)\u003C/td>\n\u003Ctd>Техника тестирования методом чёрного ящика, при которой тест-кейсы задействуют пары из пар «параметр - значение»\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Комбинаторное тестирование (combinatorial testing)\u003C/td>\n\u003Ctd>Техника тестирования методом чёрного ящика, при которой тест-кейсы задействуют определённые сочетания значений нескольких параметров\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Пара «параметр - значение» (parameter-value pair)\u003C/td>\n\u003Ctd>Параметр вместе с одним из его значений, например (Browser, Safari)\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Ортогональный массив (orthogonal array)\u003C/td>\n\u003Ctd>Таблица, в которой каждое сочетание значений любых t столбцов встречается одинаковое число раз\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Покрывающий массив (covering array)\u003C/td>\n\u003Ctd>Таблица, в которой каждое сочетание значений любых t столбцов встречается хотя бы один раз\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Ограничение (constraint)\u003C/td>\n\u003Ctd>Правило, которое исключает сочетания значений параметров, которые не могут возникнуть или не разрешены\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Тестирование t-сочетаний (t-way testing)\u003C/td>\n\u003Ctd>Комбинаторное тестирование, которое покрывает каждое сочетание значений любых t параметров; t - сила\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Покрытие базового выбора (base choice coverage)\u003C/td>\n\u003Ctd>Покрытие базового сочетания значений и каждого изменения одного параметра в нём\u003C/td>\n\u003C/tr>\n\u003C/tbody>\n\u003C/table>\u003C/div>\n\u003Ch2 id=\"источники\" class=\"wiki-heading\">Источники\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"источники\" aria-label=\"Скопировать ссылку на раздел\" data-copied-label=\"Ссылка на раздел скопирована\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Cul>\n\u003Cli>\u003Ca href=\"https://www.istqb.org/wp-content/uploads/sdm-uploads/ISTQB-CTAL-TA-Syllabus-v4.0-EN-4.pdf\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">ISTQB Certified Tester Advanced Level Test Analyst Syllabus v4.0, ISTQB, 2025\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(откроется в новой вкладке)\u003C/span>\u003C/a> (на английском)\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.istqb.org/wp-content/uploads/2024/11/ISTQB_CTFL_Syllabus_v4.0.1.pdf\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">ISTQB Certified Tester Foundation Level Syllabus v4.0.1, ISTQB, 2024\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(откроется в новой вкладке)\u003C/span>\u003C/a> (на английском)\u003C/li>\n\u003Cli>\u003Ca href=\"https://glossary.istqb.org/\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">Глоссарий ISTQB\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(откроется в новой вкладке)\u003C/span>\u003C/a> (на английском)\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.imbus.de/en/glossar/term/pairwise-testing\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">Зеркало глоссария ISTQB: pairwise testing, imbus\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(откроется в новой вкладке)\u003C/span>\u003C/a> (на английском)\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.iso.org/standard/79430.html\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">ISO/IEC/IEEE 29119-4:2021, Software and systems engineering, Software testing, Part 4: Test techniques\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(откроется в новой вкладке)\u003C/span>\u003C/a> (на английском)\u003C/li>\n\u003Cli>\u003Ca href=\"https://cacm.acm.org/research/orthogonal-latin-squares-an-application-of-experiment-design-to-compiler-testing/\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">Orthogonal Latin squares: an application of experiment design to compiler testing, R. Mandl, Communications of the ACM, vol. 28, no. 10, 1985\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(откроется в новой вкладке)\u003C/span>\u003C/a> (на английском)\u003C/li>\n\u003Cli>\u003Ca href=\"https://webarchive.library.unt.edu/eot2008/20080916140037/http://csrc.nist.gov/staff/Kuhn/kuhn-wallace-gallo-04.pdf\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">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\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(откроется в новой вкладке)\u003C/span>\u003C/a> (на английском)\u003C/li>\n\u003Cli>\u003Ca href=\"https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-142.pdf\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">Practical Combinatorial Testing, NIST SP 800-142, D. R. Kuhn, R. N. Kacker, Y. Lei, October 2010\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(откроется в новой вкладке)\u003C/span>\u003C/a> (на английском)\u003C/li>\n\u003Cli>\u003Ca href=\"https://webarchive.library.unt.edu/web/20130217091851/http:/csrc.nist.gov/groups/SNS/acts/documents/ieee-rs-atr.pdf\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">Advanced Combinatorial Test Methods for System Reliability, D. R. Kuhn, R. N. Kacker, Y. Lei, IEEE Reliability Society 2010 Annual Technical Report\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(откроется в новой вкладке)\u003C/span>\u003C/a> (на английском)\u003C/li>\n\u003Cli>\u003Ca href=\"https://csrc.nist.gov/projects/automated-combinatorial-testing-for-software\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">Automated Combinatorial Testing for Software (ACTS), NIST\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(откроется в новой вкладке)\u003C/span>\u003C/a> (на английском)\u003C/li>\n\u003Cli>\u003Ca href=\"https://github.com/microsoft/pict/blob/main/doc/pict.md\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">PICT documentation, Microsoft, GitHub\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(откроется в новой вкладке)\u003C/span>\u003C/a> (на английском)\u003C/li>\n\u003C/ul>\n",[10,14,17,20,23,26,29,32,35,38],{"id":11,"level":12,"text":13},"какую-задачу-решает-попарное-тестирование",2,"Какую задачу решает попарное тестирование",{"id":15,"level":12,"text":16},"параметры-значения-и-пары","Параметры, значения и пары",{"id":18,"level":12,"text":19},"разобранный-пример","Разобранный пример",{"id":21,"level":12,"text":22},"ортогональные-и-покрывающие-массивы","Ортогональные и покрывающие массивы",{"id":24,"level":12,"text":25},"как-строится-попарный-набор","Как строится попарный набор",{"id":27,"level":12,"text":28},"ограничения-между-параметрами","Ограничения между параметрами",{"id":30,"level":12,"text":31},"более-высокая-сила-и-пределы-попарного-тестирования","Более высокая сила и пределы попарного тестирования",{"id":33,"level":12,"text":34},"попарное-тестирование-и-смежные-техники","Попарное тестирование и смежные техники",{"id":36,"level":12,"text":37},"термины","Термины",{"id":39,"level":12,"text":40},"источники","Источники",2306,1793718892951]