Разработка

Протестируйте приложение как пользователь до релиза

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

Как агент работает

Прогон начинается с трёх ответов: какой URL стенда проверяем, под гостем или под учёткой, запрошенной через `request_form`, и что запрещено трогать: оплату, письма, SMS, остатки в боевом 1С или МойСклад, публикацию на Ozon и WB. Дальше выбирается режим: быстрый: главная и пять ключевых страниц, около пятнадцати действий; полный: все маршруты, формы и граничные значения, 60–120 действий; регрессия: область прошлого бага и соседние экраны, 20–40 действий; по изменениям: диф последнего PR, развёрнутый в список URL.

Каждый шаг доказывается полем `outcome`: вердикты «navigated», «changed», «unchanged» и «unknown», причём шаг с `unknown` считается непройденным, пока не подтверждён вторым фактом. Ложные баги отсекаются знанием ограничений: диалоги `confirm` и `alert` принимаются автоматически, cookie-баннеры закрываются по типовым селекторам, `console_errors` приходят только на `navigate` и не более двадцати записей, а браузер headless с десктопным юзер-агентом, поэтому вывод «на телефоне сломано» без эмуляции недействителен.

Прицельно проверяются классы, на которых ломаются российские формы: ОГРН в 13 знаков и ОГРНИП в 15 с контрольной цифрой по остатку от деления на 11 и на 13, КПП в 9 знаков, где 5-я и 6-я позиции бывают латинскими буквами, телефон в форматах +79991234567 и 89991234567, суммы «1 234,56» с неразрывным пробелом U+00A0, индекс из шести цифр строкой, «Артём» против «Артем» и разложенные буквы из буфера macOS.

Итог сводится в Health Score с фиксированными весами: функциональность 20%, консоль и UX по 15%, доступность 15%, ссылки и визуал по 10%, производительность 10% с порогом LCP 2,5 с, контент 5%. Вердикт из числа не выводится: критический баг даёт «Не готов» при любом score. Навык не чинит найденное по дороге и не проверяет ветку «Отмена» из-за автопринятия диалогов, поэтому раздел «Не проверено» в отчёте обязателен.

Инструкция навыка

С чего начинаешь

  1. Что тестируем: URL стенда (не прод, если есть выбор), сценарии, что считается «работает».
  2. Под кем: гость или авторизованный; учётку запроси через request_form, а не сообщением в чат.
  3. Что запрещено: по умолчанию всё, что видит третье лицо: оплата, письмо, SMS, заказ поставщику, остатки в боевом 1С/МойСклад, публикация на Ozon/WB.
РежимПокрытиеДействий
БыстрыйГлавная + 5 ключевых страниц, один сквозной сценарий~15
ПолныйВсе маршруты, формы, граничные значения, адаптивность60–120
РегрессияОбласть прошлого бага + соседние по данным экраны20–40
По изменениямДиф последнего PR → карта затронутых маршрутовпо дифу

Диф бери через sandbox_bash (git diff) и разворачивай в список URL: изменился компонент формы → все страницы, где он встроен; изменилась миграция → все экраны, читающие таблицу.

Основной инструмент: browser_interact

Управление постоянным Chromium: navigate, snapshot, act, click, fill, type, select, check, hover, scroll, press_key, upload_file, wait, screenshot, back. По ref (по умолчанию): номер элемента из дерева доступности (page_structure), дальше click/fill с номером: точно и дёшево. По intent: act с фразой «нажми кнопку Оформить заказ», когда дерево не даёт однозначного имени.

Как читать ответ

  • outcome: самое ценное поле. Для click/press_key/hover: navigated / changed (N DOM mutation(s), открытая вкладка, начатое скачивание) / unchanged / unknown: вердикт открывает строку. Для fill/type/select это значение поля после действия с пометкой расхождения: готовый детектор багов масок (ввёл +7 (999) 123-45-67, поле вернуло +7 (999) 123-45-6).
  • unchanged: не всегда провал: canvas-, iframe- и Flutter-интерфейсы не мутируют DOM. Прежде чем писать «кнопка не работает», проверь url и screenshot: дерево такой интерфейс не описывает.
  • unknown: не доказательство: шаг непройден, пока не подтверждён вторым фактом.
  • element_count: 0: почти всегда редирект на пустой экран, незагрузившийся SPA или требование входа.
  • console_errors: приходят на каждом действии, но только за его окно: ошибка, случившаяся между вызовами, в поле не попадёт. Не более 20 строк, подряд идущие повторы свёрнуты в одну со счётчиком, только error плюс необработанные исключения; у ресурса, которому сервер ответил 4xx/5xx, строка несёт его адрес.

Ограничения, из-за которых пишут ложные баги

  • Диалоги по умолчанию отклоняются: confirm/alert/prompt получают «Отмена», текст и исход приходят в ответе действия. Ветку «ОК» проверяешь повтором того же действия с accept_dialog: true; beforeunload принимается всегда.
  • Cookie-баннеры сами не закрываются: баннер, перекрывший контрол, закрывай обычным действием по его кнопке; баг самого баннера смотри первым navigate + screenshot.
  • Скриншот: видимая часть в JPEG невысокого качества: годится для «поехала вёрстка», не для «отступ 3px вместо 4px».
  • Браузер headless с десктопным юзер-агентом Windows Chrome: одна ширина окна, touch нет, поэтому «на телефоне сломано» без эмуляции ложно.
  • Сессия сохраняется между вызовами: вход один раз, зато тесту «первый вход» нужен свежий контекст.

Браузер один, и водит его только browser_interact

Ячейка repl_execute своего браузера не поднимает и к браузеру инструмента не подключается: Playwright в ней не работает вовсе: ядро исполняет ячейку внутри живого asyncio-цикла, и sync_playwright падает на входе, а браузер облака держит профиль и состояние сессии browser_interact, и второй хозяин на нём роняет следующий запуск. Отказ ячейки с Playwright не дефект кода, который надо чинить: не переписывай на async API, не ставь пакеты, не повторяй запуск. Страницу водит browser_interact, текст без кликов отдаёт web_fetch.

Что есть на какой поверхности:

НужноОблакоКомпьютер пользователя (mcp__chrome-devtools__*)
Ширина окна 360/390/768/1280нет, одна десктопная ширинаresize_page
Мобильный UA, тёмная теманетemulate (userAgent, colorScheme)
Обрыв сетинетemulate с networkConditions: "Offline"
Консоль и коды ответов за весь сценарийтолько окно каждого действия (console_errors)list_console_messages, list_network_requests
JS-проверка на страниценетevaluate_script
Часовой пояс браузеранетнет

На компьютере пользователя browser_interact поднимает локальный браузер и возвращает connected/launched, дальше страницу водят эти инструменты. Обрезанный текст там ищется машинно, evaluate_script с функцией:

scrollWidth > clientWidth при overflow:hidden: машинный признак обрезанного текста; document.documentElement.scrollWidth > innerWidth после resize_page на 360: несжимаемой вёрстки. Чего поверхность прогона не умеет, то уходит в «Не проверено» поимённо: «вьюпорт не менялся, сеть не отключалась, пояс не подменялся».

Протокол одного сценария

Сценарий: путь к результату, за который платят: «оформил заказ», «выгрузил акт сверки», а не «открыл страницу».

Классы дефектов, которые ищешь прицельно

Гонка при двойной отправке

Воспроизведение: два click по кнопке отправки без ожидания; отдельно press_key: Enter сразу после клика. Признаки: два одинаковых заказа/платежа/письма, два POST с одинаковым телом, счётчик вырос на 2, у кнопки нет состояния «отключена». Цена: двойное списание, две отгрузки. В баге не пиши «заблокировать кнопку»: она спасает только от клиентского дубля, настоящая защита: идемпотентный ключ на стороне API.

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

Воспроизведение: фильтры → карточка → back; три шага мастера → back → вперёд; ошибка валидации → back. Признаки: фильтры сброшены, пагинация на первой странице, введённое пропало, форма оплаты пустая, но заказ создан. Подкласс: back после успешной отправки показывает прежние данные, и повторная отправка создаёт дубль.

Часовые пояса и даты

В России 11 зон, от UTC+2 (Калининград) до UTC+12 (Камчатка); сервер почти всегда по Москве, пользователь нет. Пояс браузера не подменяется ни одной поверхностью, поэтому воспроизводишь данными: если в профиле или настройках продукта есть пояс, поставь Asia/Kamchatka и Europe/Kaliningrad и пройди те же сценарии; создай запись около полуночи по поясу пользователя и смотри, какой датой она попала в список, карточку, отчёт и выгрузку. Прогон «из другого пояса» без такой настройки уходит в «Не проверено». Признаки: дата документа сдвинута на сутки; «сегодня» в фильтре не включает только что созданную запись; отчёт «за 1 июля» у клиента из Владивостока содержит часть 30 июня; время в списке и карточке различается на 3 часа: одно место форматирует UTC, другое локальное. Правило: если хранение в UTC, а бизнес-сутки местные, сутки считаются в зоне пользователя; на закрытых сутках это расхождение с 1С, которое заметит бухгалтер.

Формы при потере сети

Воспроизведение (только на компьютере пользователя): заполнил → emulate с networkConditions: "Offline" → отправил → вернул сеть тем же emulate с networkConditions: "Fast 4G" (значения «без эмуляции» у поля нет). В облаке сеть не отключается, сценарий уходит в «Не проверено». Признаки: вечный спиннер без таймаута; «Ошибка» без ответа, сохранились ли данные; после возврата сети форма ушла повторно; сетевая ошибка показана как «Неверный логин или пароль». Разделяй: запрос не ушёл (повтор безопасен) и запрос ушёл без ответа (повтор опасен); интерфейс, не различающий их, «высокий» на денежном шаге.

Числа, деньги и файлы из 1С

Воспроизведение: 1 234,56, 1234.56, 1 234 567,89 ₽ с неразрывными пробелами (U+00A0), минус U+2212 вместо дефиса, отрицательный остаток, три знака после запятой. Признаки: запятая отвергается или молча превращает 1 234,56 в 1; вставка из Excel/1С ломается о неразрывный пробел; построчное округление копеек расходится с итогом. Файлы (upload_file): CSV в CP1251, CSV с BOM, .xlsx с объединёнными ячейками в шапке, файл 0 байт. Признак бага: кракозябры, «файл повреждён» без номера строки, импорт половины строк.

Пустые состояния и базовая безопасность

Пустое проверяй в свежем контексте: пустой список, поиск с 0 результатов, отчёт без данных, удалён последний элемент. Признаки: белая область, undefined, NaN, «0 из 0», вечный спиннер. В поля подставь <script>alert(1)</script>, "><img src=x onerror=alert(1)>, ' OR 1=1--, {{7*7}}: признак в том, что значение отрисовалось как разметка или появилось 49. Отдельно: чужой id документа в URL. Найденное здесь всегда «критический»; описывай без подробностей эксплуатации.

Граничные значения для российских форм

  • ОГРН и КПП: у ОГРН 13 знаков, у ОГРНИП 15; последняя цифра контрольная: это последняя цифра остатка от деления числа без неё (13 знаков на 11, 15 на 13). У КПП 9 знаков, 5-я и 6-я позиции могут быть латинскими буквами у иностранных организаций: форма «только цифры» отсекает часть контрагентов.
  • Телефон: +79991234567, 89991234567, +7 (999) 123-45-67, 8-800-555-35-35, городской с кодом, «доб. 123», международный +375…. Отдельно: вставка из буфера в маску и ввод в середину заполненной маски (каретка прыгает в конец). Баг, если 8 и +7 сохранились как разные номера.
  • Адрес, индекс, даты: длинные названия («улица имени 40-летия Победы»), литера дома («д. 5Б»: кириллическая Б и латинская B разные), «корп. 2 стр. 3», квартира «12/1», сёла без улиц. Индекс: 6 цифр строкой, числом теряет ведущий ноль. При подсказках адресов проверь ручной ввод того, чего нет в справочнике. Даты: 01.07.2026 и 2026-07-01 в одном интерфейсе уже дефект; 29.02 невисокосного года, конец периода раньше начала, ручной ввод с клавиатуры.

Классификация серьёзности

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

Серьёзность задаёт последствие: опечатка в сумме это критический баг, не низкий.

Health Score

Оценка нужна, чтобы сравнивать прогоны между собой: категории и веса не меняй.

КатегорияВесПочему столько
Функциональность20%Единственная, где дефект означает потерянные деньги сегодня
Консоль (JS-ошибки)15%Молчащая ошибка сегодня, сломанный сценарий завтра
UX15%Потери данных и неясные ошибки: из-за них пишут в поддержку
Доступность15%Элемент без имени не виден ни скринридеру, ни автоматизации
Ссылки10%Считается машинно и полностью, вес умеренный
Визуал10%Заметно, но обходится пользователем
Производительность10%Влияет на конверсию, но редко блокирует
Контент5%Дёшево чинится; ошибки в суммах идут в баги, а не сюда
  • Функциональность = 100 × (пройденные шаги / запланированные); шаг с unknown непройден.
  • Консоль = 100 − 15 × (уникальные JS-ошибки, дедуп по первой строке) − 25 × (ошибки на денежном или регистрационном шаге), не ниже 0.
  • UX = 100 − 10 за каждое: действие без отклика дольше секунды, потеря введённого, ошибка без объяснения, что делать.
  • Доступность = 100 × (доля интерактивных элементов с непустым именем в дереве) − 20, если фокус не виден, − 20, если сценарий непроходим с клавиатуры (press_key: Tab, Enter); элементы вида button "" дают прямой счётчик.
  • Ссылки = 100 × (доля ответов 2xx); 4xx/5xx дают ноль, редирект длиннее двух хопов половину.
  • Визуал = 100 − 8 за обрезанный элемент, − 15 за нечитаемый или перекрытый текст, − 20 за скролл вбок на 360px.
  • Производительность: по худшей странице маршрута: LCP до 2,5 с → 100, до 4 с → 60, дольше → 20; CLS выше 0,25 → −20 (пороги Core Web Vitals на 2026-07-28).
  • Контент = 100 − 10 за опечатку или расхождение в терминах.

Вердикт не выводится из числа. Критический баг есть → «Не готов» при любом score; критических нет, но score < 70 или высокие на ключевом сценарии → «Нужна доработка»; иначе → «Готов к релизу».

Итоговый отчёт

«Не проверено» обязателен: без него отчёт читается как «проверено всё», и первый баг из непокрытой области обнулит доверие. Отдавай отчёт через documents, регулярный прогон оформи задачей по расписанию через manage_task, критические находки называй первыми; правку можно довести до коммита в ветке (PR открывает владелец), но отчёт описывает состояние до неё.

Правила работы

  1. Экран не факт. «Кнопка не нажалась» без outcome и второй проверки это гипотеза, а не баг.
  2. Один шаг, один вызов: склейка делает невоспроизводимым и баг, и отчёт.
  3. Валидный путь сначала: пока сценарий не пройден целиком, непонятно, что считать нормой.
  4. Пять попыток для плавающего бага, и число в отчёте.
  5. Не чини по дороге: правки в середине прогона делают отчёт описанием несуществующей версии.
  6. Не трогай боевые данные: оплата только в тестовом режиме провайдера, рассылки только на свои адреса, остатки и заказы в 1С/МойСклад/Ozon/WB не меняешь.
  7. Пять доказанных багов лучше двадцати расплывчатых: закроют те, что удаётся воспроизвести.
  8. Ограничения инструмента входят в отчёт: не проверил вьюпорт или офлайн в облаке, так и напиши.

Похожие навыки

Ревью Pull RequestЭкспертное ревью PR: выявляет баги, уязвимости безопасности, проблемы производительности и дизайна. Структурированный отчёт с уровнями серьёзности, предложениями по коду, чек-листом безопасности и оценкой тестирования. Python, JS/TS, Go, Rust, SQL и другие языки.Аудит качества кодаГлубокий аудит кодовой базы: механический анализ + экспертная оценка архитектуры, элегантности, типобезопасности и тестового покрытия. Выдаёт числовой балл и приоритизированный план улучшений.QA-отчёт (без исправлений)QA-тестирование в режиме только отчёта -- находит баги, документирует, но ничего не исправляет. Используйте когда нужен отчёт о состоянии качества без вмешательства в код.Автоматический пайплайн ревьюАвтоматический пайплайн: CEO-ревью, затем дизайн-ревью, затем инженерное ревью -- последовательно. Используйте когда нужно провести комплексную проверку плана или проекта со всех сторон.Бенчмарк производительностиАнализ производительности: время загрузки, Core Web Vitals, размер бандла, время ответа API. Используйте для поиска и устранения проблем с производительностью.Деплой и мониторингЧек-лист деплоя: мерж, деплой, канарейка, верификация. Используйте при развёртывании в продакшен, чтобы не пропустить критичные шаги.
Категория
Разработка
Платформа
Сам Решу

Попробуйте этот навык

Зарегистрируйтесь и используйте навык «QA-тестирование» бесплатно.