Обновить
-4
Дарья@Ariless

QA Automation Engineer

4
Подписчики
Отправить сообщение

Запускала похожий генератор по OpenAPI спеку, смотрела на вывод.

Два паттерна повторялись: хардкодные ID без setup (offerId = 1) - в CI такой тест видит 404; и ассерции на errorCode без значения - модель нашла поле, но заполнить не смогла, потому что конкретные коды в спеке не были прописаны как enum.

Был ещё один неочевидный: авторизация через браузер в API-only тесте, потому что генератор не знал о существующей request-фикстуре в проекте.

Итого файл использую как чеклист кейсов и черновик структуры а не как готовый тест.

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

У меня в проекте это автоматизировано через git diff - скрипт смотрит изменённые файлы, находит связанные модули и возвращает список тестов для первоочередного запуска. Indirect dependencies ловит не все, но основную ручную работу убирает. Это меняет сам разговор с командой перед релизом: вместо "что нам кажется рискованным" появляется конкретный список с обоснованием.

+90.2% у orchestrator-worker это интересная метрика, но она не говорит, в каком слое происходит сбой: декомпозиция у оркестратора, выполнение у воркера или синтез.

Из опыта тестирования AI-эндпоинтов: агент может выдавать правильный финальный ответ по неправильной траектории - spurious correctness. End-to-end метрика это не поймает.

Нужен отдельный coverage для каждого структурного блока.

Confirmation flow защищает от выполнения, но не от отравления вывода. Если цель инъекции - не “выполни команду”, а “дай неверную гипотезу”, то пользователь получит мисдиагноз и будет искать проблему не там. Система при этом работает корректно с точки зрения безопасности - никакого деструктивного действия не произошло.

Это сложнее поймать в тестах именно потому, что нет явного сбоя, есть просто неправильный ответ.

Находка с initdb вместо pg_ctl reload - это Tool-Function hallucination: модель выбирает инструмент из правильной смысловой зоны, но с другим контрактом безопасности.

Тестировала AI-эндпоинт symptom checker - похожий паттерн. Golden dataset даёт чистый прогон, провалы появляются на граничных входах: неполные данные, конфликтующие симптомы. Метрики зелёные, поведение неожиданное.

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

Хороший вопрос, я для себя сейчас выделяю несколько сигналов, которые важнее, чем просто pass/fail.

Количество реально запущенных тестов
Не “зелёный CI”, а соответствие ожидаемому набору. Любое отклонение (меньше или больше) - это уже сигнал о системе, а не о тестах.

Тренд времени выполнения
Важно не абсолютное время, а изменение. Если пайплайн постепенно замедляется без изменений в тестах, то это почти всегда деградация инфраструктуры или данных.

Flaky rate
Сколько тестов за последние запуски дают нестабильный результат. Флаки редко про “плохой тест”, а чаще про скрытое состояние или неявные зависимости между тестами.

Contract drift
Если есть API-схемы или контракты, то важно отслеживать расхождение между ожиданиями тестов и фактическим поведением системы, а не только отдельные ассёрты.

И главное - всё это обычно не сложно добавить технически. Сложнее заранее сформировать привычку это измерять, пока система ещё “выглядит зелёной”.

Когда просишь агента написать тест, самое важное - не “что проверить”, а контекст вокруг теста: fixtures, shared state, порядок выполнения. Без этого получаешь тест, который зелёный в изоляции и падает в CI - не потому что агент написал плохо, а потому что он не знал, как устроено окружение.

С debugging через логи то же самое. В Playwright перешла от пошагового дебага к описанию symptom chain: что тест ожидал, что получил, в каком порядке шли другие тесты. Агент находит паттерн быстрее, чем ручной дебаг.

Статья упоминает важную цифру — AI-код содержит в 1.7 раза больше проблем на pull request, чем человеческий.

С точки зрения QA это создаёт интересную ловушку: если команда использует AI и для написания кода, и для написания тестов - оба артефакта генерируются в одном контексте, с одними и теми же слепыми пятнами. Тест проверяет то, что агент предполагал написать, а не то, что система должна делать.

На практике это проявляется тихо: тесты зелёные, CI доволен, но coverage покрывает предположения агента, а не реальное поведение. Классический silent failure. Лечится не количеством тестов, а разделением контекста: тест-сценарии пишутся до кода и независимо от него.

Тезис про "валидацию внутри агентного цикла" интересный, но там есть скрытая проблема: агент валидирует собственный вывод с теми же слепыми зонами, с которыми он его генерировал. Если валидация переезжает внутрь агентного цикла, возникает вопрос: кто валидирует саму валидацию?

Агент-ревьюер может проверить тесты и код, но не весь контур исполнения - как CI запускает проверки, как устроена изоляция, какие состояния разделяются между прогонами.

Был практический кейс: после миграции JS → TS CI выглядел зелёным, тесты проходили, но Playwright подхватывал оба расширения и запускал один и тот же набор тестов дважды. С точки зрения "внутреннего агента" всё корректно - тесты зелёные.

Статья хорошо описывает переход к "continuous compute", но не поднимает слой observability этого контура. А без него агентный цикл может завершаться успешно и именно это будет проблемой.

Time pressure is real, and I'm not arguing every flaky test deserves immediate investigation.

The distinction I'd make: "we know this is environment noise, accepting the risk" vs "unclear root cause, we'll look later." The first is a conscious tradeoff. The second is where the signal quietly disappears.

The BrowserStack case fit the second pattern exactly - it looked like infrastructure noise, which is precisely why it was close to being filed and forgotten. The config problem only surfaced because I kept digging instead of labeling it flaky-infrastructure and moving on.

В QA-автоматизации та же история: в некоторых проектах код теста уже считается конфиденциальным, потому что раскрывает структуру системы. Отдельная история когда тест работает с реальными данными из staging.

Из того что вижу в своей работе: облачные инструменты хорошо заходят там где нет чувствительных данных — генерация шаблонов, разбор логов, объяснение поведения. Как только начинается "смотри, вот наш API контракт", начинаются вопросы к безопасности.

Пока on-prem не догонит по качеству — это будет работать только для части команд.

Статья хорошо описывает разработческую перспективу. Со стороны QA automation есть нюанс про ограниченный контекст, который в статье упомянут вскользь.

Агент может предложить изменения в тестах, которые локально зелёные, но конфликтуют с CI-конфигурацией, потому что файл конфига не попал в его контекст. У меня был конкретный кейс: при миграции JS→TS агент не увидел, что Playwright подхватывает оба расширения. CI продолжал работать без ошибок и просто гонял каждый тест дважды.

Это не баг агента — это именно та «ошибка предположений об инфраструктуре», про которую в статье написано. Просто в тестовом окружении она проявляется специфически.

Согласна, CI не виноват, он проверяет ровно то, что ему сказали проверять. Это и есть суть проблемы.

Про npx playwright test --list | wc -l — это рабочий вариант, и да, он бы поймал. Но есть нюанс: чтобы добавить такую проверку, нужно сначала знать, что считать тесты вообще стоит. До инцидента это не казалось очевидным, CI зелёный, тесты проходят, зачем считать?

Именно об этом статья: не о том, что CI плохой инструмент, а о том, что мы неосознанно приравниваем "тесты прошли" к "система работает корректно". И это предположение не проверяем пока что-то не идёт не так.

Упрощаешь ли ты? Технически нет, добавить счётчик несложно. Но engineering-проблема не в сложности реализации, а в том, что никто не думает добавлять проверку на то, что считает очевидным.

Интересная архитектура, особенно иерархия приоритетов при RCA. Вопрос про edge case: что происходит, когда root cause не вписывается ни в одну категорию иерархии?

Иерархия "тест → фреймворк → приложение" покрывает большинство случаев, но есть отдельный класс проблем - shared state между тестами. Код теста чистый, фреймворк работает корректно, приложение тоже. Проблема в порядке выполнения и взаимодействии между тестами, а не внутри одного теста.

Это особенно актуально для Android UI: если несколько тестов работают с одним и тем же UI-состоянием или данными без полной изоляции - RCA агент может искать причину не в том слое.

Если агент неверно классифицирует причину, fix будет уверенным, но неправильным. Как обрабатываете случаи, когда ни одна категория не подходит?

Разграничение точное - сетевой запрос подтверждает что операция завершилась, но не то что пользователь получил визуальную обратную связь. Это разные требования.

Буфер с накоплением событий - логичное решение для нескольких toast подряд. В Playwright делаю похоже: page.route() с счётчиком вызовов для stateful сценариев, где важен порядок событий, а не только факт появления.

Риск-оценка особенно неочевидна когда баг технически “работает правильно”.

Был случай: endpoint возвращал 422 INVALID_STATUS неавторизованному пользователю вместо 403 FORBIDDEN. Формально — корректный статус, логика не сломана. Но 422 раскрывал что запись существует и находится в конкретном статусе. Неавторизованный пользователь получал информацию о чужих данных через error code.

По критерию “видимость проблемы после выпуска” — незаметно. По критерию “влияние на личную информацию” — блокирующий.

Именно такие баги сложнее всего аргументировать на go/no-go: симптом выглядит косметически, а риск — в том что система говорит больше чем должна.

Паттерн с перехватом toast-уведомлений через "чёрный ящик" — один из самых неочевидных в UI-тестировании.

В Playwright та же проблема решается через page.waitForSelector или перехват через page.route, но race condition никуда не девается: toast появляется и исчезает быстрее, чем тест успевает его поймать. Особенно в CI, где браузер работает медленнее.

Мне помог другой подход — перехватывать не DOM-элемент, а сетевой запрос, который toast отображает.

Если toast показывает результат операции, можно ждать завершения запроса, а не появления элемента. Это убирает зависимость от скорости рендеринга.

Но ваш MutationObserver с буфером звучит надёжнее для случаев, когда toast не связан с конкретным запросом. Как решаете ситуацию, когда несколько toast-уведомлений появляются подряд?

К пункту про CI/CD хочу добавить нюанс, который не очевиден на старте.

Интеграция с CI - это правильно. Но есть ловушка: зелёный CI быстро становится синонимом "всё работает". А это не одно и то же.

Был кейс: после миграции с JavaScript на TypeScript CI продолжал быть зелёным, тесты проходили. Но Playwright начал подхватывать оба расширения (.spec.js и .spec.ts) — каждый тест запускался дважды. CI выполнял двойную работу без единого сигнала об ошибке. Нашли случайно, когда количество тестов внезапно упало вдвое при удалении JS-файлов.

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

Результаты впечатляют, особенно 20% ускорение через адаптивные перезапуски. Но есть вопрос про triage.

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

У меня был кейс: тест падал с SLOT_OVERLAP только при определённом порядке запуска в CI. Перезапуск его "починил" бы - в следующем прогоне порядок другой, тест зелёный. Но проблема никуда не делась: fixtures использовали конфликтующие timestamp'ы, и при росте нагрузки это стало бы стабильным падением.

Как в вашем процессе отличаете "безопасный flaky" (таймаут, медленная среда) от "flaky как сигнал" (shared state, порядок выполнения, скрытая зависимость)? Или перезапуск применяется ко всем нестабильным тестам одинаково?

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность

Специализация

Инженер по автоматизации тестирования, Инженер по ручному тестированию
Старший
Git
Docker
JavaScript
TypeScript