Мы выпускаем обновления приложений Lamoda минимум 4 раза в месяц. С каждым обновлением идут серьезные изменения: новые продукты, внедрение ML-моделей и так далее. Процесс тестирования нового кода давно налажен, но есть нюанс: проверять перед релизом нужно не только новую функциональность, но и базовые возможности приложения, чтобы убедиться, что они работают корректно и ничего не сломалось.
На проверку базового функционала уходит куча времени QA. Поэтому мы создали автоматические UI-тесты. Они автономно проверяют базовые функции и помогают снизить нагрузку на тестировщиков.
Но приложение постоянно растет, а с ним должно расти и тестовое покрытие. Главная сложность здесь — количество тестов, которое приходится писать. Когда у меня появилась задача написать очередную партию тестов, я сразу подумал о том, что мне нужна помощь. Меня зовут Марк, я iOS-разработчик из Lamoda Tech. В этой статье я расскажу, как использовал LLM для написания UI-тестов, и сравню результаты ChatGPT и Copilot.
Как мы начали писать UI-тесты
Передо мной стояла задача максимально автоматизировать процесс создания тестов и сделать его простым, чтобы новые UI-тесты могли писать сами тестировщики.
Внутри команды мы выделили критически важную функциональность, которую пользователи регулярно используют и к которой они уже привыкли. Когда базовый набор инструментов был создан и мы сформировали общую структуру UI-тестов, я задумался о том, что тестировщики также могли бы использовать AI-помощников для повышения эффективности и точности. Осталось только выбрать, что это будут за инструменты и как корректно организовать с ними взаимодействие. В итоге я остановился на двух вариантах: Copilot и GPT.
Первый — это по сути продвинутый автокомплит, а второй — отдельный модуль, способный самостоятельно писать UI-тесты и который в процессе эксперимента я обучил на наших данных. Теперь остаётся проверить оба варианта и выяснить, кто из них способен взять на себя больше рутины и снизить нагрузку на команду.
Создаем собственный GPT-модуль для написания UI-тестов
Для использования GPT в написании UI-тестов нам нужно погрузить его в контекст — показать, как мы пишем эти тесты и какие инструменты используем для этого.
Я буду использовать GPT-4 и создам собственный модуль, который будет предоставлять ответы на основе примеров уже реализованных нами тестов и нашего инструментария. Собственный модуль — специальный компонент, который создается на площадке GPT. Этот компонент будет обучен на наших данных, чтобы генерировать ответы, соответствующие специфике нашего проекта. Это позволит тестировщикам получать рекомендации и решения, непосредственно основанные на нашей кодовой базе.
Переходим в GPT-4. В верхнем левом углу выбираем «Обзор GPT»:
В открывшейся странице выбираем «+ Создать»:
Теперь мы перешли в черновик нашего будущего модуля и можем настроить все доступные нам параметры:
Перейдя во вкладку «Настроить» на левой стороне экрана, я указал все нужные параметры: название модуля, описание его деятельности и прочее.
Не забудем подключить интерпретатор кода, так как мы будем ожидать уже готовые тест-кейсы от нашего GPT-модуля.
С GPT-модулем мы разобрались, теперь нам нужно определиться, какой тест-кейс мы будем реализовывать. Типичная задача: проверить наличие рассрочки у пользователя на экране чекаута. Для этого нам понадобится корзина хотя бы с одним товаром, а значит, потребуется пройти все этапы заполнения информации о пользователе, адрес доставки, и собственно попасть на сам чекаут, чтобы увидеть там возможность оплаты рассрочкой. Чтобы гарантировать стабильное выполнение UI-теста, нам нужно самостоятельно замокать ответы от некоторых API-ручек. Эту работу пока не можем передать AI, но написание самого тест-кейса можно доверить нашему виртуальному помощнику.
Создадим первый запрос для нашего модуля, в котором попросим его описать нужные нам элементы:
Основываясь на предоставленном нам InstallmentsScreen, попросим наш модуль написать тест-кейс:
В конечном итоге все, что мы увидим в Xcode, — это:
Ничего кроме ошибок и комментариев по возможному улучшению теста мы не увидим. Самое время перейти к выводам.
Насколько полезен собственный GPT-модуль для написания UI-тестов
Написание UI-тестов — сложная задача для GPT. Мы не можем передать GPT всю информацию о контексте нашего приложения:
какие экраны нужны,
какие запросы срабатывают при определенных действиях,
какие ответы мы получаем,
на какие поля в ответах этих запросов мы должны ориентироваться,
какой элемент и в какой момент ожидать,
какой у него идентификатор и что следует сделать.
Чтобы описать весь этот контекст, нужно составить полный план теста, сделать все необходимые мок-запросы, понять, какие ответы ожидать, подготовить их и подробно описать для каждого, что нужно сделать, чтобы GPT вернул готовый код. Выходит, что проще написать тест-кейс и выполнить все необходимые манипуляции самостоятельно, чем объяснять это GPT.
Попытка использования GPT для написания UI-тестов показывает ограничения текущих AI-систем. Хотя GPT может быть полезным в качестве ассистента, предоставляющего идеи кода или помогающего в решении проблем, специфика разработки тестов делают его применение ограниченным. Мы самостоятельно должны адаптировать и подготовить контекст для успешного использования такого инструмента, и часто это оказывается более трудоемким, чем написание кода вручную.
Это не означает, что GPT не поможет в решении конкретных проблем. Однако в нашем случае мы ищем инструмент, который поможет QA с минимальными усилиями создать множество автотестов, а GPT пока не способна справится с этой задачей.
Теперь мяч на стороне Copilot
Для того, чтобы использовать Copilot в проекте, для начала потребуется интегрировать его в Xcode. Я буду использовать: CopilotForXcode.
Поскольку Copilot сам настраивает контекст нашей кодовой базы, все, что понадобится, — просто приступить к написанию тест-кейса. Наш подход будет таким же, как и в случае с GPT. Первым делом мы начнем описывать абстракцию, отвечающую за нужные нам UI-элементы, а потом перейдем к написанию тест-кейса.
Copilot анализирует контекст и пытается угадать код, который вы планируете написать. Часто встречал мнение, что писать код не очень комфортно, когда кто-то под руку тебе регулярно дает неточные советы. Рассматривая применение Copilot для написания UI-тестов, я нашел один интересный лайфхак. Так как мы уже знаем идентификаторы тех элементов, которые нам понадобятся (к тому же мы уже описывали их в примере с GPT), мы можем просто разместить данный текст в закомментированном виде в нашем swift-файле. Это даст Copilot более точный начальный контекст, и он уже будет предлагать элементы на основе нашего комментария:
Благодаря данному подходу Copilot подскажет все остальные идентификаторы для наших элементов. Когда мы начнем создавать сами элементы, AI-инструмент автоматически будет присваивать нужные идентификаторы:
Таким образом, вместо написания всего файла вручную мы используем продвинутый автокомплит, который собирает для нас целый swift-файл с нужными нам UI-элементами.
Самое время приступить к написанию тест-кейса. Сейчас как раз и происходит магия: Copilot использует контекст прошлых тест-кейсов и подхватывает контекст только что созданной нами абстракции, предлагая автоматически собрать скелет нашего кейса:
Стоит отметить, что, конечно, 100% совпадения с нашими желаниями не будет, но основную работу Copilot сделал за нас. Нам лишь останется поправить вызов нужных мок-запросов и отредактировать выполнение самого теста, подставив нужные элементы и вызвав необходимые методы. Также работа по дебагу останется на наших плечах.
Проведя дебаггинг нашего тест-кейса, мы получаем код, написанный по установленным нами правилам и с тем результатом, который мы хотели достичь:
Результат работы тест-кейса:
Copilot отлично справляется с созданием скелета UI-теста. Если в вашем проекте уже есть типовые примеры, на основе которых вы хотите создать новые тест-кейсы, Copilot здесь станет вашим незаменимым помощником. Конечно, не все рекомендации Copilot подходят, бывают места, где он ошибается, и вам придется отвлекаться на предоставленные куски кода, чтобы оценить их и понять, насколько они вам подходят. Если подкидывать Copilot нужный контекст и чаще использовать его в своей работе, то с большей долей вероятности его рекомендации станут вам полезными, и вы сможете переложить часть написания типового кода на него.
Не могу не рассказать про крайне полезную фишку Copilot for Xcode. Если у вас есть доступ и к GPT, и к Copilot, то вы можете добавить API-ключ GPT от вашей учетной записи в Copilot for Xcode и на выходе получите крайне интересного зверька: Copilot в виде автокомплита и GPT в виде собеседника в чате Copilot for Xcode. Тем самым вы сможете окружить себя всеми вспомогательными AI-инструментами, которые точно помогут в работе.
Мы переходим на GPT API key и получаем ключик для нашей учетной записи.
Далее открываем Copilot for Xcode и добавляем полученный ключ:
После этого в Copilot for Xcode будет доступен чат с GPT, который мы сможем открыть в Xcode и задавать интересующие нас вопросы, не переключаясь в окно браузера.
Итоги сражения между GPT и Copilot
На основе моего опыта взаимодействия с GPT-4 и Copilot могу уверенно сказать: Copilot значительно удобнее и лучше помогает писать UI-тесты для iOS.
В целом, UI-тесты — это довольно специфическая история. Очень много работы приходится выполнять вручную, и эта работа по большей части не связана с кодом. Нужно проработать тест-кейс: понять, какие экраны будут задействованы, какие запросы на этих экранах нужно замокать, на какие поля в замоканных запросах мы будем опираться, как корректно создать и добавить наши фейковые json-ответы. Только когда все эти манипуляции будут выполнены, мы сможем обратиться за помощью к AI-инструментам для написания кода.
GPT-4 и Copilot могут взять на себя выполнение большого количества полезных работ, служа продвинутым автокомплитом (Copilot) и продвинутым инструментом поиска ответа на вопрос (GPT). Итоговое решение остается за программистом: как использовать данные инструменты, как их скомбинировать, чтобы достичь максимального положительного эффекта, и как лишить себя рутинных задач, отдав это на аутсорс AI.
Мое мнение: чем раньше вы откроете свое сердце AI-инструментам, тем быстрее вы почувствуете их потенциал в облегчении вашей работы.