functional-regression-matrix отвечает на вопрос «работает ли функция вообще» и даёт snapshot статусов pass/fail/partial. Этот промт задаёт другой вопрос: насколько хорошо работает каждая функция — под реальной нагрузкой, с плохими данными, при потере сети, при нетипичном поведении пользователя. Это не планирование покрытия, а сам процесс тестирования с вынесением качественного вердикта по каждой функции.
Без этого аудита продукт выглядит рабочим на smoke и matrix, но ломается у пяти процентов пользователей в граничных ситуациях — а именно там доверие к продукту рушится быстрее всего.
Product: {{product_url}} Critical functions: {{critical_functions}}
1. Что проверяется в «глубокой» проверке
Для каждой функции исследуются четыре измерения:
1.1 Базовая работоспособность
- Выполняет ли функция свою задачу при нормальных условиях?
- Каков ожидаемый outcome и как убедиться что он достигнут?
1.2 Robustness (устойчивость к стрессу)
| Стресс-сценарий | Описание | Как проверить |
|---|---|---|
| Пустой ввод | Submit формы с пустыми полями | Вручную очистить поля, нажать Submit |
| Плохой ввод | SQL-injection фрагменты, HTML-теги, эмодзи, строка из 10 000 символов | Вставить через буфер |
| Двойной клик | Быстро кликнуть кнопку действия дважды | Нажать два раза за <300ms |
| Double-submit | Отправить форму дважды через Enter | Enter + Enter или кнопка + Enter |
| Slow 3G | Отправить действие на медленной сети | DevTools → Network → Slow 3G |
| Offline mid-action | Запрос в полёте, выключить сеть | DevTools → Offline после click |
| Interrupt / navigate-away | Начать действие, уйти на другую страницу | Навигация до завершения запроса |
| Back button mid-flow | Пройти несколько шагов, нажать Back | Браузерная кнопка Back |
| Refresh mid-state | Обновить страницу в середине multi-step flow | F5 после первого шага |
1.3 Поведение на граничных данных
- Минимальное валидное значение (1 символ, 0, пустой список)
- Максимальное валидное значение (лимит поля, 9999 элементов, дата из прошлого)
- Граничные типы: только пробелы, только спецсимволы, очень длинное слово без пробелов
1.4 Воспринимаемое качество
- Latency: есть ли feedback в ≤100ms после действия? (loader, disabled state, optimistic-update)
- Jank: есть ли прыжки layout, дёргания при загрузке?
- Optimistic UI: если применён — корректно ли откатывается при ошибке сервера?
- Layout shift (CLS): не прыгает ли страница при загрузке данных?
- Recovery: если что-то сломалось — предлагает ли интерфейс выход или пользователь в тупике?
2. Рубрика Robustness Score (0-3)
| Балл | Название | Определение |
|---|---|---|
| 0 | Broken | Функция не выполняет свою задачу в нормальных условиях ИЛИ крашится при базовом стрессе (двойной клик, пустой ввод) |
| 1 | Fragile | Работает при happy path, но любой из стресс-сценариев вызывает: потерю данных, silent failure без сообщения об ошибке, невозможность повторить попытку, бесконечный loader |
| 2 | Works-but-janky | Функция надёжна, ошибки обработаны, но: feedback >500ms без индикатора, оптимистичный UI откатывается неправильно, layout shift при загрузке, дублирование данных при double-submit без видимой блокировки |
| 3 | Solid | Feedback ≤100ms, все стресс-сценарии обработаны явно, ошибки понятны и дают выход, двойной submit невозможен, offline gracefully сообщается, back/refresh сохраняет state или корректно сбрасывает |
Балл 0 или 1 = blocker. Балл 2 = polish backlog. Балл 3 = готово.
3. Рецепты стресс-теста по типу взаимодействия
Форма / ввод данных
- ✓ Submit с каждым полем пустым по отдельности
- ✓ Вставить 10 000 символов в текстовое поле
- ✓ Tab через все поля — порядок и focus-визуал
- ✓ Submit → немедленно navigate away → данные сохранились?
- ✓ Submit → Offline → retry → данные не дублировались?
- ✓ Submit → двойной Enter → один запрос или два?
Список / грид
- ✓ Пустое состояние: что показывается при 0 элементах?
- ✓ 1 элемент, 2 элемента (граничные визуально)
- ✓ >1000 элементов: pagination / virtual scroll работает?
- ✓ Delete последнего элемента → пустое состояние появляется?
- ✓ Filter → нет результатов → снять filter → список восстанавливается?
- ✓ Sort → navigate away → back → sort сохранился?
Поиск
- ✓ Пустой запрос → Submit
- ✓ Спецсимволы:
<script>,%20,--," - ✓ Очень длинный запрос (300+ символов)
- ✓ Быстрый ввод (debounce работает?) → нет дублирующих запросов
- ✓ Запрос → navigate → back → запрос в поле сохранился?
- ✓ Offline → попробовать поиск → понятная ошибка
Асинхронное действие (delete, publish, send)
- ✓ Кликнуть дважды быстро → одно действие или два?
- ✓ Slow 3G → кнопка disabled во время запроса?
- ✓ Offline mid-request → UI откатывается к предыдущему состоянию?
- ✓ 500 от сервера → retry доступен? Данные не повреждены?
- ✓ Timeout (30s) → что показывает интерфейс?
Навигация между страницами
- ✓ Back на шаге 3 из 3 multi-step flow → шаг 2 или начало?
- ✓ Refresh на шаге 2 → потеря прогресса или восстановление?
- ✓ Открыть в двух вкладках → конфликт состояния?
- ✓ Navigate away во время upload → предупреждение?
- ✓ Глубокая ссылка (direct URL) → корректный контент?
Реальное время (websocket, polling, live updates)
- ✓ Отключить сеть → переподключиться → данные синхронизировались?
- ✓ Долгое бездействие (15 мин) → reconnect без потери данных?
- ✓ Два пользователя меняют одну запись → merge conflict / last-write-wins?
- ✓ Очень быстрые обновления → UI не «мелькает»?
4. Где инвестировать глубину проверки
| Уровень | Когда | Что делать |
|---|---|---|
| Deep | Auth flows, платёжный flow, delete/publish/destructive actions, любая запись в БД | Все 9 стресс-сценариев + все рецепты типа + воспринимаемое качество |
| Middle | Search, filter/sort, pagination, secondary forms, settings | Пустой/плохой ввод + double-submit + offline error |
| Surface | Static pages, read-only views, informational modals | Базовая работоспособность + latency feedback |
Критические функции из {{critical_functions}} → Deep по умолчанию.
5. Как проводить сессию
- Подготовка (30 мин): Перечисли все функции. Отметь каждой уровень Deep/Middle/Surface. Создай таблицу для scores.
- Deep-pass (основное время): По каждой Deep-функции — пройти все стресс-сценарии, зафиксировать поведение, выставить балл 0-3.
- Middle-pass: Сокращённый набор проверок, balл 0-3.
- Surface-pass: Только базовая работоспособность.
- Заполнение output: Таблица + blockers + polish-backlog.
Anti-patterns
- ❌ Остановиться на «работает при happy path» — это smoke, не deep verification
- ❌ Тестировать только на хорошем соединении — 20% пользователей на медленной сети
- ❌ Игнорировать double-submit — самый частый способ задублировать данные в БД
- ❌ «Offline не поддерживаем» без явного UI — пользователь видит бесконечный loader и уходит
- ❌ Пропустить back/refresh для multi-step flow — здесь теряются данные незаметно
- ❌ Не проверять optimistic UI rollback — оптимистичный UI без rollback хуже чем pessimistic UI
- ❌ Считать latency feedback «косметикой» — >100ms без отклика меняет восприятие надёжности
- ❌ Тестировать под одним аккаунтом — некоторые баги видны только при первом использовании функции
- ❌ Начинать без списка функций — без инвентаря Deep-проверка становится случайной
Output
- Quality score table — каждая функция: Robustness Score (0-3) + одна строка описания состояния
- Blockers (score 0-1) — каждый: repro-шаги (numbered), условие воспроизведения, ссылка на видео/скриншот, severity (data-loss / silent-fail / crash / bad-ux)
- Polish backlog (score 2) — каждый: описание проблемы, effort (S / M / L), ожидаемый impact на восприятие
- Severity-ranked issue list — все находки отсортированы: data-loss → silent-fail → crash → bad-ux → cosmetic
Полный UX-аудит сайта
Эвристическая оценка по Нильсену + проверка ключевых сценариев. На выходе — приоритизированный список проблем.
Аудит производительности (Core Web Vitals)
Глубокая проверка LCP, INP, CLS с привязкой к коду и приоритизированным планом исправлений.
Аудит доступности по WCAG 2.2 AA
Проверка контраста, клавиатурной навигации, скринридеров, фокус-индикаторов и ARIA.