Как ИИ-агент проходит весь цикл мобильного тестирования в hh.ru. qa.. qa. qa automation.. qa. qa automation. qa testing.. qa. qa automation. qa testing. Блог компании hh.ru.. qa. qa automation. qa testing. Блог компании hh.ru. ИИ.. qa. qa automation. qa testing. Блог компании hh.ru. ИИ. мобильное тестирование.. qa. qa automation. qa testing. Блог компании hh.ru. ИИ. мобильное тестирование. тестирование.. qa. qa automation. qa testing. Блог компании hh.ru. ИИ. мобильное тестирование. тестирование. Тестирование IT-систем.. qa. qa automation. qa testing. Блог компании hh.ru. ИИ. мобильное тестирование. тестирование. Тестирование IT-систем. тестирование веб-приложений.. qa. qa automation. qa testing. Блог компании hh.ru. ИИ. мобильное тестирование. тестирование. Тестирование IT-систем. тестирование веб-приложений. Тестирование веб-сервисов.. qa. qa automation. qa testing. Блог компании hh.ru. ИИ. мобильное тестирование. тестирование. Тестирование IT-систем. тестирование веб-приложений. Тестирование веб-сервисов. Тестирование мобильных приложений.. qa. qa automation. qa testing. Блог компании hh.ru. ИИ. мобильное тестирование. тестирование. Тестирование IT-систем. тестирование веб-приложений. Тестирование веб-сервисов. Тестирование мобильных приложений. тесты.
Как ИИ-агент проходит весь цикл мобильного тестирования в hh.ru - 1

Привет! Меня зовут Александр Чернышев, я занимаюсь тестированием мобильных приложений hh.ru, и за последние полгода моя рабочая рутина кардинально поменялась благодаря ИИ-инструментам, которые мы активно используем в HeadHunter. В моём случае это Claude Code с моделью Opus 5 — по моему опыту, она лучше всего справляется с рабочими задачами. Оговорюсь: у меня подписка Max, поэтому лимитов хватает с запасом. Сейчас я подключаю агента к большинству своих задач. Основа рабочего процесса — это скиллы: инструкции, которые задают агенту последовательность действий и не дают ему каждый раз импровизировать. Вместе с ними я использую MCP-серверы и плагины, через которые агент может взаимодействовать с внешними инструментами, например с Figma (figma-mcp).

В этой статье я разберу весь жизненный цикл задачи — от подготовки чеклиста и сверки с ТЗ до ретеста и автотестов — и покажу, как на каждом этапе использую ИИ-агента. Расскажу, какие локальные и корпоративные скиллы и MCP помогают мне в работе и что в итоге всё равно остаётся на стороне тестировщика. Сразу оговорюсь: названия скиллов у нас внутренние — за пределами hh.ru вы их не встретите. Поехали!

Шаг 1. Чеклист из кода (/generate-test-instructions)

Для начала стоит сказать, что в нашей компании давно нет разделения на ручных и авто-QA: каждый инженер работает с кодом приложения напрямую. Поэтому, когда приходит задача на тестирование, мы открываем Claude Code CLI или Desktop прямо из фиче-ветки и первым делом собираем чеклист проверок.

Для этого мы используем скилл /generate-test-instructions. По сути, это markdown-файл с инструкцией для агента: где взять базовую ветку, как получить merge-base, что прочитать целиком, в каком порядке рассуждать и что не стоит включать в результат. 

Отдельный промт не нужен: запускаем скилл, агент анализирует diff и собирает чек-лист. На выходе получаем пять фиксированных разделов: затронутые модули, что изменилось, регресс, что проверить, аналитика и конфиги. Пошаговые сценарии намеренно не используем, тестировщик знает приложение лучше модели, которая на этом этапе видит только diff. Поэтому задача агента — не расписать тестирование за человека, а показать, что изменилось и где искать потенциальные проблемы.

В результате мы получаем полноценную карту изменений, от которой можем отталкиваться и строить стратегию тестирования. Причем сейчас даже запускать скилл вручную не приходится: он автоматически вызывается на уровне CI при создании пулл-реквеста. Остаётся только открыть пулл-реквест и забрать  готовый чеклист.

Вырезка из отчета

Вырезка из отчета

Шаг 2. Сверка с ТЗ и макетами (/read-jira и figma-mcp)

На первом шаге агент собрал чек-лист только по коду. Но нам важно проверить не только саму реализацию, но и то, насколько она соответствует ТЗ и макетам. Поэтому следующим шагом просим агента актуализировать чек-лист, сопоставив его с ТЗ из задачи в Jira и макетом из Figma.

За ТЗ отвечает скилл /read-jira. Передаем ему ссылку на задачу, а дальше он через  MCP-сервер Jira получает нужные данные, в том числе ключ и описание задачи.

С макетами работает Figma MCP: он дает агенту доступ к структуре нод и скриншоту.В Figma копируем ссылку на конкретный слой через Copy link to selection — так в ней будет параметр node-id. Без него агент читает фрейм целиком и тратит лишние запросы, а нам это не надо. 

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

В итоге у агента есть три источника: код, ТЗ из Jira и макет из Figma. Их можно сверить между собой и ещё до ручного тестирования найти расхождения: например, баги вёрстки или отсутствующие части флоу. Это заметно сокращает время и повышает качество тестирования.

Шаг 3. Сверка iOS и Android по одной фиче (/hh-mobile-crossplatform)

Но и это ещё не всё. Наш следующий шаг — проверить, одинаково ли работает фича на Android и iOS. У нас есть доступ к коду обеих платформ, поэтому такую сверку тоже можно поручить агенту. 

Достаточно написать: «Сравни, как сделали на iOS» или «Сравни, как сделали на Android». Скилл находит реализацию одной фичи в iOS- и Android-репозиториях и ищет расхождения по 14 осям: бизнес-логика, состояния экрана, крайние случаи, аналитика, эксперименты, API, кэш, сетевые ошибки, авторизация, оффлайн, конфигурация, навигация, тексты, тесты. 

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

Шаг 4. Ручное тестирование и симулятор в Claude Code

Теперь можно заняться работой, ради которой всё это затевалось. Часть этой работы тоже можно отдать агенту: в июле 2026 года в Claude Code Desktop встроили iOS Simulator — пока в публичной бете, только на macOS. Агент может собрать iOS-приложение, установить его, запустить, прокликать созданный ранее чек-лист и проверить результат. Для этого достаточно команды вроде: «Собери и запусти приложение, проверь его по чек-листу».

Скриншот из Claude Code Desktop

Скриншот из Claude Code Desktop

Не могу сказать, что я сильно доволен симулятором. По скорости здесь пока выигрывает человек: тестовые сценарии я прохожу в 10–30 раз быстрее агента. Кроме того агент может тупить на ровном месте и уходить далеко в степь и заодно быстро съедать лимиты. 

Вдобавок есть важное «но». Только человек способен оценить UX: здесь важен не формальный результат проверки, а опыт использования приложения. Насколько понятен сценарий, удобно ли взаимодействовать с интерфейсом, где пользователь может запутаться — такие вещи лучше замечаешь, когда сам проходишь флоу.

И не стоит забывать, что агент работает только в симуляторе, а тестировать нужно на реальном устройстве. Симулятор запускает приложение на процессоре Mac с его памятью и скоростью, поэтому такое тестирование не воспроизводит реальные условия работы смартфона и может не показать проблемы с производительностью, долгую холодную загрузку и краши на бюджетных телефонах. Отличается и само взаимодействие с интерфейсом: вместо тач-события в симуляторе — мышь, поэтому жесты, скорость свайпа и попадание пальцем в маленькие элементы ощущаются иначе. Значительная часть багов, которые доходят до пользователей, живёт именно в этих зонах. 

Поэтому я использую симулятор как дополнительный инструмент: отдаю агенту часть функциональных проверок и прогон чек-листа, а сам параллельно занимаюсь тем, где важны реальное устройство и человеческая оценка. Финальную приёмку фичи в любом случае провожу на реальном девайсе.

Шаг 5. Тестирование аналитики (/test-analytics)

После функциональных проверок переходим к мобильной аналитике. Это одна из самых трудоёмких частей тестирования: проходишь сценарий, ищешь нужное событие среди сотен строк и сверяешь параметры. Что-то легко пропустить, а ошибка в трекинге может привести к тому, что после запуска фичи мы не сможем корректно оценить её эффект на пользователей.

(Кстати, недавно мой коллега рассказывал о нашей мобильной аналитике на митапе— запись можно посмотреть на Youtube или VK-Video). 

Чтобы не сверять всё вручную, я использую скилл /test-analytics. Прежде надо сказать, что в hh есть единый репозиторий hh-mobile-analytics: в нём в формате YAML описаны все события, отправляемые из мобильных приложений (iOS и Android). Этот репозиторий служит единственным источником правды для обеих платформ. Это значит, что скилл на входе принимает пулл-реквест в develop с новой аналитикой в соответствующий репозиторий. 

Перед запуском мы вручную проходим флоу приложения, и вместе с пулл-реквестом передаём  файл с затреканной аналитикой. Это может быть logcat файл или экспорт из Charles (.chls).

Дальше скилл сопоставляет три источника: пулл-реквест аналитики, код приложения и затреканые события. Первый показывает, что должно трекаться, второй — что реализовано в коде, третий — что произошло на самом деле. Так можно увидеть, где именно возникло расхождение. 

На выходе получаем диагноз в виде markdown-отчета с таблицей по всем событиям и разбором каждой проблемы: цитата схемы → что было затрекано/что не было затрекано → причина.

Вырезка из отчета

Вырезка из отчета

Скилл сильно ускоряет тестирование аналитики и сводит к минимуму человеческий фактор. То есть избавляет нас от долгой, тяжелой и скрупулёзной работы, чему я лично несказанно рад.

Шаг 6. Быстрый баг-репорт (/bug-report)

Баг нашли — теперь его нужно передать разработчику. Со скиллом создание баг-репорта по шаблону через jira-mcp занимает меньше трёх минут и избавляет от рутины с оформлением тикета по структуре  «идеального баг-репорта». 

Достаточно описать баг в свободной форме одним сообщением и при необходимости приложить скриншот. Агент вытаскивает из текста и изображения всю доступную информацию и спрашивает только о том, чего не хватает: шаги воспроизведения, фактический и ожидаемый результат.

Часть контекста он добирает сам. Платформу определяет по репозиторию, а если баг найден в текущей ветке, подтягивает её имя, номер задачи и затронутые файлы. Там, где есть ограниченный набор вариантов — например, исполнитель или тип связи, — агент предлагает выбрать нужный вариант кликом вместо набора строки.

В итоге вместо того, чтобы открывать вкладку в Jira, вручную писать подробный баг-репорт, добавлять связи и префиксы в название тикета, достаточно перейти в ветку в папке проекта, накидать описание бага и приложить скрин. Скилл через наш внутренний Jira MCP сам проставит связи, по шаблону опишет шаги и предусловия, спросит исполнителя через AskUserQuestion и покажет черновик на одобрение. Останется только всё проверить и подтвердить — и тот самый «идеальный баг-репорт» появится в Jira на радость разработчику.

Шаг 7. Ретест (/retest)

После того как разработчик починил баги, нужно провести ретест. Но  ещё лучше перед этим сделать статический анализ кода. Для этого есть скилл /retest. 

Он читает тикет с баг-репортом, разбирает дифф и по каждому дефекту даёт вердикт в виде таблицы. Так можно заранее понять, какие изменения внес  разработчик и действительно ли они должны исправить найденную проблему.

Вырезка из отчета

Вырезка из отчета

Шаг 8. Автотесты (/ui-test)

Когда фича протестирована и вмержена в develop, самое время приступить к автотестам. В hh мы используем нативные фреймворки Kaspresso (о нём рассказывали здесь) и Rafinad (о нём можно прочитать здесь). Дальше речь пойдёт конкретно про UI-тесты на iOS, поскольку к созданию скилла я имею непосредственное отношение.

В iOS-приложениях hh своя развитая инфраструктура UI-тестов: DSL-разметка Accessibility, типизированные Page Object и сервисы фикстур, привязанные к Swagger. Всё это подробно описано в стайл-гайде — md-файле в самом репозитории.

Скилл /ui-test состоит из папки с SKILL.md и девяти файлов в references/. Точка входа не содержит правил, она маршрутизирует, а сами правила лежат отдельно.

Чтобы запустить скилл, достаточно кратко описать желаемый тест, например: «Напиши автотест на отклик через экран вакансии пользователем, зарегистрированным в Беларуси». Чем больше деталей, тем лучше, но обычно хватает минимума по правилу: что делаем, где проверяем и как.

Результат складывается из трёх частей: Accessibility-файл, Page Object и тест.

  • Accessibility-файл лежит рядом с модулем, а не в тестах. Без него DSL не знает, к какому классу привязывать якоря, по которым ищется элемент на экране.

  • Page Object строится по жёсткой структуре: Waits, Actions, Asserts, Private. Здесь есть ещё два правила: не писать методы «на будущее»  — метод без вызова в тесте не верифицирован — и не дублировать уже созданные универсальные PO из shared модуля.

  • Тест. Имя состоит из трёх обязательных частей: test_<СтартовыеУсловия>_<ЧтоДелаем>_<ЧтоПроверяем>. И главное правило скилла: тест заканчивается assert*(), а не действием или ожиданием.

Как это выглядит на практике

Допустим, есть простая задача: «Напиши тест на то, что при пустом списке откликов со статусом „Отказ“ показывается заглушка». Вот что происходит дальше.

1. Разведка — где вообще этот экран

Агент не начинает сразу писать код. Сначала он ищет экран в коде и убеждается, что нашёл именно тот, — по текстам и по описанию интерфейса. 

Дальше идёт обратный ход: откуда пользователь на этот экран попадает, кто его открывает, какая кнопка ведёт, что должно быть выполнено, чтобы точка входа вообще была доступна — например, авторизация, наличие резюме или откликов. Так собирается цепочка от главного экрана до целевого. 

К концу этого шага агент должен назвать цепочку целиком и для каждого её звена определить, есть ли уже описание нужного экрана в тестах или его придётся писать. Отдельно он ищет похожие тесты. Если такие уже есть, подготовку данных можно взять оттуда, а не изобретать заново.

2. Сверка — что уже написано

Теперь агент смотрит, что из необходимого уже существует: описание целевого и родительского экрана, и способ перехода между ними. 

Универсальные компоненты — диалоги, списки выбора, подсказки — у нас описаны один раз на всех, поэтому скилл прямо велит сначала заглянуть туда и не плодить дубли. 

На этом же этапе могут всплыть пробелы. Например, на родительском экране нет метода для перехода, а нужная кнопка не размечена. Лучше узнать это сейчас, чем после написания теста.

3. Разметка экрана

Если целевой экран не размечен, агент начинает с него. Он описывает структуру экрана: какие есть блоки, какие элементы внутри и что из них повторяется списком. Потом расставляет пометки на самих элементах в интерфейсе. 

Скилл держит агента за руку в двух местах. Во-первых, имена элементов берутся из кода, а не придумываются «по смыслу для пользователя». Во-вторых, размечается только то, что нужно для текущего теста. Никакого «заодно помечу всё, вдруг пригодится».

4. Описание экрана для тестов

Дальше агент пишет объект, через который тест будет работать с экраном. Напрямую к элементам тест не обращается — только через такое описание. 

Внутри всё раскладывается по трём группам в фиксированном порядке: ожидания, действия, проверки. Действия называются потому, что физически делает пользователь: нажал, выбрал, ввёл.

5. Сам тест

Теперь можно собирать сам тест. Это цепочка вызовов, которая читается как обычный сценарий: дождались главный экран, открыли отклики, выбрали вкладку «Отказ», дождались заглушку, проверили её заголовок. 

6. Тестовые данные

Этот шаг может не понадобиться вовсе, и скилл этому только рад.. Если данные всё-таки нужны, агент сначала читает кодовую базу целевого экрана — не ради интерфейса, а ради предусловий. Например, экран может требовать подтверждённый телефон, активное резюме. Из интерфейса это не видно, поэтому без нужных данных тест падает в неожиданном месте и с невнятной причиной. 

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

7. Самопроверка

В конце агент прогоняет свою работу по чек-листу из двадцати пунктов — тому самому, по которому результат потом будут проверять на ревью.

Заключение

Работа QA меняется. Тестировщик всё меньше просто выполняет готовые процедуры и всё чаще создаёт их сам. Каждый скилл в этой статье — это опыт команды, переведённый в инструкцию: что читать, в каком порядке думать и чего не делать. Раньше такой опыт передавался устно и терялся с уходом людей, а теперь он лежит в репозитории, версионируется и выполняется одинаково хоть в первый, хоть в сотый раз. Хороший скилл, по сути, — хорошо написанное ТЗ для самого себя, и умение его написать становится ключевым навыком QA-инженера.

Есть и практический вывод: агенту нужно доверять, но проверять его. Результат /test-analytics — это диагноз, а не приговор, где вердикт /retest — это повод открыть дифф, а не закрыть тикет.

Полгода назад мой день состоял из десятка мелких переключений и типовых рутинных задач. В совокупности они съедали до половины моего рабочего времени и часто сбивали мой фокус. Сегодня большую часть из этого делает цепочка скиллов, а я занимаюсь тем, ради чего вообще пришёл в тестирование: думаю, как «сломать» фичу, и смотреть на продукт глазами пользователя. 

Искусственный интеллект здесь в первую очередь лишь инструмент, который помогает делать работу быстрее. Но финальное решение и ответственность всё равно остаются за QA.

А как вы в компании используете агентов? Пишите в комментариях, будет интересно почитать!

Автор: adcher

Источник