Почему я делаю ставку на LLM для UI тестирования

Подпишитесь на наш ТЕЛЕГРАМ КАНАЛ ПО АВТОМАТИЗАЦИИ ТЕСТИРОВАНИЯ

Перевод статьи «Why I’m Betting on LLMs for UI Testing».

Сейчас в мире GenAI есть два лагеря: «Всецело преданные» и «Скептики». Одни видят в GenAI решение всех мировых проблем, другие категорически отказываются ей доверять и придерживаются традиционных подходов. Я же занимаю прагматичную позицию где-то посередине. Мне нравится использовать GenAI (ежедневно), но я также стараюсь понимать её ограничения и сохранять реализм. Чем чаще я её применяю, тем больше воодушевляюсь её будущим.

Как и с любой новой технологией, я смотрю вперёд, ведь многие текущие ограничения со временем исчезнут. Так что стоит «Играть на опережение».

Мы много говорим о том, как GenAI генерирует код, но почти не обсуждаем, как она создаёт и выполняет тесты. А ведь во втором она, на мой взгляд, куда лучше, чем в первом.

Я экспериментировал с использованием GenAI для тестирования пользовательских интерфейсов. О генерации юнит тестов с помощью GenAI написано много, а вот про интеграционное и end-to-end тестирование почти ничего. Я ожидал, что LLM справятся с этим хорошо.

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

Мой первый опыт UI тестирования был в 1997 году в Microsoft, где я тестировал Office 2000. Тогда я сразу заметил две вещи:

  1. Фреймворки для управления UI были неудобными
  2. Тесты были хрупкими

За последние 30 лет в этой сфере мало что изменилось. Сейчас, руководя тестированием Amazon Store, я часто об этом задумываюсь.

LLM можно «скормить» разные данные для генерации тестов:

  • Спецификации, дизайн документы, продакшен код
  • Существующие тесты
  • Информацию о покрытии кода (чтобы тестировать непроверенные пути)
  • Операционные проблемы (чтобы указать на потенциальные уязвимости)

Главный вопрос: в каком формате должны быть автосгенерированные интеграционные тесты?

Путь №1: Генерация тестов в виде кода

LLM создаёт тесты (например, на Selenium, Appium), которые затем выполняются как обычно.

Плюсы:

  • Код можно проверить
  • После генерации тесты становятся детерминированными (вы точно знаете, что выполняется)
  • Людям так привычнее

Минусы:

  • Человеку проще писать тесты на естественном языке, чем разбираться в Selenium/Appium
  • Тот, кто проверяет код, должен знать конкретный фреймворк
  • Тестовый код нужно поддерживать (апгрейды, изменения в продакшен коде — всё это ваша головная боль)

Путь №2: Генерация тестов на естественном языке + выполнение другим LLM

Плюсы:

  • Любой может прочитать и понять тест
  • Нет привязки к фреймворкам — не нужно поддерживать код
  • LLM могут адаптироваться к изменениям в UI (например, если пропал элемент, LLM может найти альтернативный путь)

Минусы:

  • Неопределённость (LLM может пойти «не туда»)

Чтобы проверить это я написал простой тест и дал его LLM на выполнение. Важно смотреть не только на действия, но и на рассуждения модели (они приведены в «бабблах»).

Шаг 1: Ввод книга «Harry Potter» в поиск.

Шаг 2: Клик на кнопку «Search».

Шаг 3: Проверка, что нужная книга есть в выдаче.

Шаг 4: Выбор книги (ирония: LLM выбрала самый дешёвый вариант, чтобы «сэкономить мне деньги»).

Шаг 5: Попытка добавить в корзину, но кнопка «Add to cart» была ниже (не видна на экране). LLM нажала на «Add Prime» (ошибочно, но логично).

Шаг 6: Самостоятельно поняла ошибку, догадалась проскроллить вниз.

Шаг 7: Нашла «Add to Cart» — Это уже успех!

Шаг 8: Проверила добавление в корзину четырьмя разными способами (лучше, чем сделал бы человек!).

Проверка №1: В корзине отображается правильная сумма
Проверка №2: Сообщение-подтверждение «Товар добавлен в корзину»
Проверка #3: На иконке корзины отображается каунтер «1 товар»
Проверка#4: Книга «Гарри Поттер» видна в предпросмотре корзины

Этот простой тест демонстрирует мощь LLM в области тестирования пользовательских интерфейсов.

Проблема — это непредсказуемость. Как гарантировать, что LLM будет следовать правильному пути при навигации по вашему приложению во время тестирования? В моём небольшом примере, когда бот нажал кнопку «Add Prime», это стало намёком на то, что при навигации по интерфейсу бот действительно может сбиться с пути.

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

Для решения этой проблемы мы с коллегами рассматриваем введение «лимита шагов выполнения» для каждого теста. В моём примере тест успешно выполнялся за 8 шагов. Если же бот превышает установленный лимит (например, 20 шагов), это сигнализирует о вероятном отклонении от корректного сценария. Такой подход позволяет контролировать выполнение тестов, автоматически прерывая процессы, которые вышли за разумные временные рамки. Это поднимает важный вопрос: по мере увеличения зависимости от LLM в тестировании, нам необходимо чётко определять «запрещённые действия»: какие операции бот не должен выполнять ни при каких обстоятельствах.

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

Также у нас есть уникальная возможность для объективного сравнения двух подходов к тестированию. В нашем распоряжении находятся сотни тысяч legacy тестов, разработанных на таких фреймворках, как Appium и Selenium. Эти тесты можно автоматически преобразовать в их естественно-языковые аналоги. Затем имеет смысл организовать параллельный запуск обоих вариантов тестов, как традиционных, так и новых. В процессе такого эксперимента мы сможем тщательно сравнить полученные метрики и результаты. Подобное исследование предоставит нам верифицируемые данные, которые подтвердят или опровергнут возможность полного перехода на тестирование с использованием естественного языка.

Заменит ли это людей тестировщиков? Мне не нравится слово «заменить», но это определенно изменит характер их работы. В некоторых организациях целые армии ручных тестировщиков выполняют одни и те же повторяющиеся задачи, чтобы подтвердить готовность к каждому релизу. Иногда это происходит потому, что автоматизация тестов слишком дорога; иногда потому что продукт меняется слишком быстро, чтобы вообще успеть написать автоматизированные тесты, а иногда из-за отсутствия дальновидности и нежелания инвестировать. Но любая ситуация, когда релиз зависит от человека, не масштабируема и неустойчива. К тому же, она нестабильна… люди печально известны своей непредсказуемостью и тоже совершают ошибки.

Я хочу, чтобы GenAI взяла на себя эти повторяющиеся тесты, а тестировщики смогли сосредоточиться на применении своей интуиции и накопленного опыта в том, как продукты могут ломаться, чтобы исследовать систему более свободно и творчески.

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

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

LLM тестирование открывает принципиально новые возможности, недоступные традиционным методам. Исследователи Amazon продемонстрировали революционный подход: они создали тестовых агентов с разными пользовательскими профилями. Один и тот же тест может интерпретироваться по-разному в зависимости от заданной «персоны», что позволяет выявлять уникальные кейсы ошибок.

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

Для меня прогресс в UI тестировании на основе LLM — это не вопрос «если», а вопрос «когда».

Свою карьеру в тестировании я начал в Microsoft в 1997 году. Помню, как устанавливал сырую debug сборку Office 2000: при первом запуске Word пять минут грохотал жесткий диск, после чего выдавал сообщение о критической ошибке. На следующий день новая сборка хотя бы запустилась, но через три минуты работы неизбежно зависала.

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

Я одновременно воодушевлен и напуган. Но думаю, пора погружаться.

🔥 Какой была ваша первая зарплата в QA и как вы искали первую работу? 

Мега обсуждение в нашем телеграм-канале о поиске первой работы. Обмен опытом и мнения.

Читать в телеграм

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *