Мы выпускаем обновления приложений 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-инструментам, тем быстрее вы почувствуете их потенциал в облегчении вашей работы.

Комментарии (3)


  1. MountainGoat
    06.06.2024 10:24
    +2

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


  1. Bardakan
    06.06.2024 10:24

    Вопрос, ответа на который я не увидел в статье - ChatGPT и copilot фактически скачивают себе ваши исходники. Ваш работодатель не против этого?

    Или у вас есть решение вопроса приватности и неразглашения?


  1. PesKova
    06.06.2024 10:24
    +2

    Большое спасибо автору за интересную и познавательную статью!