Когда результат зависит не от одного поля, а от сочетания условий и от истории
Классы и границы из раздела 05 работают с одним полем. Когда результат зависит от сочетания нескольких условий, нужна таблица решений: столбцы — правила, строки — условия и действия.
Требование службы доставки: «Доставка бесплатна, если сумма заказа от 3000 ₽ или у покупателя подписка „Плюс“. Для подписчиков доставка в день заказа, если заказ сделан до 14:00». Три условия, у каждого два значения — 23 = 8 правил:
| П1 | П2 | П3 | П4 | П5 | П6 | П7 | П8 | |
|---|---|---|---|---|---|---|---|---|
| Сумма ≥ 3000 ₽ | да | да | да | да | нет | нет | нет | нет |
| Подписка «Плюс» | да | да | нет | нет | да | да | нет | нет |
| Заказ до 14:00 | да | нет | да | нет | да | нет | да | нет |
| Бесплатно | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | — | — |
| В день заказа | ✓ | — | — | — | ✓ | — | — | — |
Каждый столбец — проверка: П3 — «заказ на 3500 ₽ без подписки в 11:00: бесплатно, но не в день заказа». Строя таблицу, тестировщик заодно проверяет требование: что, если подписчик заказал на 1000 ₽ в 13:59 — доставят сегодня? По тексту да (П5), и стоит спросить, так ли задумано.
Сокращение. П3, П4 и П7, П8 отличаются только временем, а время без подписки ни на что не влияет. Их можно объединить, поставив «—» (неважно) в строке времени: П3+П4 и П7+П8. Получится 6 правил вместо 8. Сокращают только тогда, когда уверены, что условие действительно не влияет, — иначе потеряется именно та комбинация, где программа ошибается.
У многих объектов есть состояния: заказ, заявка, документ, учётная запись. Результат действия зависит от того, в каком состоянии объект сейчас. Требование: «Заказ: Оформлен → Оплачен → Отправлен → Доставлен. Оформленный или оплаченный заказ можно отменить; при отмене оплаченного деньги возвращаются».
оплатить отправить вручить
[Оформлен] ──────────► [Оплачен] ──────────► [Отправлен] ──────────► [Доставлен]
│ │
│ отменить │ отменить (+ возврат денег)
▼ ▼
[Отменён] ◄────────────────┘
Диаграмму переводят в таблицу переходов: строки — состояния, столбцы — действия, в ячейке — новое состояние или «запрещено». Таблица показывает то, что диаграмма прячет: все запрещённые переходы.
| Состояние \ действие | оплатить | отправить | вручить | отменить |
|---|---|---|---|---|
| Оформлен | Оплачен | запрещено | запрещено | Отменён |
| Оплачен | запрещено | Отправлен | запрещено | Отменён + возврат |
| Отправлен | запрещено | запрещено | Доставлен | запрещено |
| Доставлен | запрещено | запрещено | запрещено | запрещено |
| Отменён | запрещено | запрещено | запрещено | запрещено |
Что проверять:
Интернет-магазин нужно проверить в 4 браузерах (Chrome, Firefox, Edge, Яндекс), 3 системах (Windows, Android, iOS), с 3 способами оплаты (карта, СБП, наличные) и 3 способами доставки (курьер, пункт выдачи, самовывоз). Все сочетания: 4 × 3 × 3 × 3 = 108 оформлений заказа. Если одно занимает 5 минут — 9 часов на одну функцию.
Наблюдение, на котором держится попарное тестирование: большинство дефектов взаимодействия вызывает сочетание двух параметров — «СБП не работает в Firefox», «самовывоз не выбирается на iOS». Дефектов, для которых нужно точное сочетание трёх и более параметров, намного меньше. Значит, достаточно, чтобы каждая пара значений встретилась хотя бы в одной проверке.
Подобрать набор, где встречаются все пары, вручную можно для 3–4 параметров, дальше удобнее программа. PICT — бесплатная консольная программа Microsoft: на странице выпусков скачайте pict.exe и положите в папку с моделью. Модель — текстовый файл в UTF-8 (Блокнот Windows 11 сохраняет так по умолчанию):
Браузер: Chrome, Firefox, Edge, Яндекс
ОС: Windows, Android, iOS
Оплата: Карта, СБП, Наличные
Доставка: Курьер, Пункт, Самовывоз
IF [ОС] = "iOS" THEN [Браузер] <> "Edge";
Последняя строка — ограничение: на iOS не проверяем Edge. Запуск в командной строке (cmd):
pict model.txt > pairs.txt
Получилось 12 строк вместо 108 — в каждой паре параметров все сочетания значений встречаются хотя бы раз (прогон в Windows 11, PICT 3.7.4; порядок строк у вас может отличаться):
Браузер ОС Оплата Доставка
Edge Windows Карта Самовывоз
Chrome Windows Наличные Курьер
Chrome Android СБП Самовывоз
Firefox iOS СБП Курьер
Chrome iOS Карта Пункт
Яндекс iOS Наличные Самовывоз
Firefox Android Наличные Пункт
Edge Windows СБП Пункт
Яндекс Android Карта Курьер
Firefox Windows Карта Самовывоз
Edge Android Наличные Курьер
Яндекс Windows СБП Пункт
Файл разделён табуляциями — его можно открыть в LibreOffice Calc или Excel и дописать столбцы «Ожидаемо» и «Итог».
pict model.txt > pairs.txt в PowerShell 5.1 сохраняет файл в UTF-16 с искажёнными русскими буквами. Запускайте в cmd или из PowerShell так: cmd /c "pict model.txt > pairs.txt". В Linux PICT собирается из исходников — проще сделать таблицу вручную.Попарное тестирование не заменяет мысль: важные сочетания (самый частый браузер с самой частой оплатой) добавляют отдельными проверками, а если известно, что дефект возникает при трёх параметрах, его проверяют явно.
Предугадывание ошибок (error guessing) — проверки, которые подсказывает опыт: «здесь обычно ломается». Это не замена техникам, а дополнение после них. Список типичных мест:
%, _, ', ", <b> — в программах, где строка попадает в запрос к базе или на страницу без обработки.Найденное предугадыванием записывают в чек-лист — в следующий раз это будет уже не догадка, а проверка.
| В требовании | Техника | Раздел |
|---|---|---|
| Поле с диапазоном, длиной, форматом | Классы эквивалентности и граничные значения | 05 |
| «Если … и … , то …», несколько условий | Таблица решений | 06 |
| Статусы, этапы, «можно только после» | Переходы состояний | 06 |
| Много независимых параметров: окружения, настройки, фильтры | Попарное тестирование | 06 |
| Любая функция после систематических проверок | Предугадывание ошибок | 06 |
| Новая функция без требований | Исследовательский проход, затем техники | 01, 02 |
Техники сочетаются: в таблице решений условие «сумма ≥ 3000 ₽» само по себе требует границ 2999,99 и 3000,00, а у каждого состояния заказа есть поля, к которым применимы классы.