![](https://habrastorage.org/getpro/habr/upload_files/4d9/ac0/0b6/4d9ac00b679db4adec18e413db613115.png)
Мы выпускаем обновления приложений 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»:
![](https://habrastorage.org/getpro/habr/upload_files/94f/604/580/94f604580f9f903208ce3927d0d09972.png)
В открывшейся странице выбираем «+ Создать»:
![](https://habrastorage.org/getpro/habr/upload_files/379/3dc/0f1/3793dc0f16929f72f7e80b0b976fe35c.png)
Теперь мы перешли в черновик нашего будущего модуля и можем настроить все доступные нам параметры:
![](https://habrastorage.org/getpro/habr/upload_files/b52/94c/bab/b5294cbab3c6db9b5c490ce834a16779.png)
Перейдя во вкладку «Настроить» на левой стороне экрана, я указал все нужные параметры: название модуля, описание его деятельности и прочее.
![](https://habrastorage.org/getpro/habr/upload_files/1f0/79b/bd3/1f079bbd33ac5d38ab4cee1712bfe7f0.png)
Не забудем подключить интерпретатор кода, так как мы будем ожидать уже готовые тест-кейсы от нашего GPT-модуля.
С GPT-модулем мы разобрались, теперь нам нужно определиться, какой тест-кейс мы будем реализовывать. Типичная задача: проверить наличие рассрочки у пользователя на экране чекаута. Для этого нам понадобится корзина хотя бы с одним товаром, а значит, потребуется пройти все этапы заполнения информации о пользователе, адрес доставки, и собственно попасть на сам чекаут, чтобы увидеть там возможность оплаты рассрочкой. Чтобы гарантировать стабильное выполнение UI-теста, нам нужно самостоятельно замокать ответы от некоторых API-ручек. Эту работу пока не можем передать AI, но написание самого тест-кейса можно доверить нашему виртуальному помощнику.
Создадим первый запрос для нашего модуля, в котором попросим его описать нужные нам элементы:
![](https://habrastorage.org/getpro/habr/upload_files/04e/1c1/f71/04e1c1f713e5894d26db48e829963d95.png)
Основываясь на предоставленном нам InstallmentsScreen, попросим наш модуль написать тест-кейс:
![](https://habrastorage.org/getpro/habr/upload_files/de6/c64/923/de6c6492345d4a145088afb9b44d0ab9.png)
В конечном итоге все, что мы увидим в Xcode, — это:
![](https://habrastorage.org/getpro/habr/upload_files/ff9/a67/e66/ff9a67e66b02540c77b2a8327852b9f6.png)
![](https://habrastorage.org/getpro/habr/upload_files/9a2/d80/b68/9a2d80b6845de3e094f7355728bd558a.png)
Ничего кроме ошибок и комментариев по возможному улучшению теста мы не увидим. Самое время перейти к выводам.
Насколько полезен собственный 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 более точный начальный контекст, и он уже будет предлагать элементы на основе нашего комментария:
![](https://habrastorage.org/getpro/habr/upload_files/e64/e1e/ce2/e64e1ece23cab2715ce206fbf3242ae5.png)
Благодаря данному подходу Copilot подскажет все остальные идентификаторы для наших элементов. Когда мы начнем создавать сами элементы, AI-инструмент автоматически будет присваивать нужные идентификаторы:
![](https://habrastorage.org/getpro/habr/upload_files/c2e/bd7/de8/c2ebd7de84b888cfd8aa90b1cdee79ed.png)
Таким образом, вместо написания всего файла вручную мы используем продвинутый автокомплит, который собирает для нас целый swift-файл с нужными нам UI-элементами.
![](https://habrastorage.org/getpro/habr/upload_files/914/da4/5e8/914da45e86f050260c0f3f43337ef952.png)
Самое время приступить к написанию тест-кейса. Сейчас как раз и происходит магия: Copilot использует контекст прошлых тест-кейсов и подхватывает контекст только что созданной нами абстракции, предлагая автоматически собрать скелет нашего кейса:
![](https://habrastorage.org/getpro/habr/upload_files/0f2/675/efd/0f2675efd3f69b0730fa7609c7120d51.png)
Стоит отметить, что, конечно, 100% совпадения с нашими желаниями не будет, но основную работу Copilot сделал за нас. Нам лишь останется поправить вызов нужных мок-запросов и отредактировать выполнение самого теста, подставив нужные элементы и вызвав необходимые методы. Также работа по дебагу останется на наших плечах.
![](https://habrastorage.org/getpro/habr/upload_files/a79/9d6/261/a799d6261105acf41a963b02f60fe73e.png)
Проведя дебаггинг нашего тест-кейса, мы получаем код, написанный по установленным нами правилам и с тем результатом, который мы хотели достичь:
![](https://habrastorage.org/getpro/habr/upload_files/f1f/65c/d31/f1f65cd31b0ad74847901e2a5eb89900.png)
Результат работы тест-кейса:
![](https://habrastorage.org/getpro/habr/upload_files/277/bad/230/277bad230a908988bcc42f7f779ad4d2.gif)
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 и добавляем полученный ключ:
![](https://habrastorage.org/getpro/habr/upload_files/bbf/807/f5d/bbf807f5dd373f03ac7e9aa270e53347.png)
![](https://habrastorage.org/getpro/habr/upload_files/6b0/fe5/967/6b0fe59678f858b5924ba3775f920de7.png)
После этого в Copilot for Xcode будет доступен чат с GPT, который мы сможем открыть в Xcode и задавать интересующие нас вопросы, не переключаясь в окно браузера.
![](https://habrastorage.org/getpro/habr/upload_files/470/1cd/211/4701cd2112a2abfb63ce57f89e6503a7.png)
Итоги сражения между GPT и Copilot
На основе моего опыта взаимодействия с GPT-4 и Copilot могу уверенно сказать: Copilot значительно удобнее и лучше помогает писать UI-тесты для iOS.
В целом, UI-тесты — это довольно специфическая история. Очень много работы приходится выполнять вручную, и эта работа по большей части не связана с кодом. Нужно проработать тест-кейс: понять, какие экраны будут задействованы, какие запросы на этих экранах нужно замокать, на какие поля в замоканных запросах мы будем опираться, как корректно создать и добавить наши фейковые json-ответы. Только когда все эти манипуляции будут выполнены, мы сможем обратиться за помощью к AI-инструментам для написания кода.
GPT-4 и Copilot могут взять на себя выполнение большого количества полезных работ, служа продвинутым автокомплитом (Copilot) и продвинутым инструментом поиска ответа на вопрос (GPT). Итоговое решение остается за программистом: как использовать данные инструменты, как их скомбинировать, чтобы достичь максимального положительного эффекта, и как лишить себя рутинных задач, отдав это на аутсорс AI.
Мое мнение: чем раньше вы откроете свое сердце AI-инструментам, тем быстрее вы почувствуете их потенциал в облегчении вашей работы.
Комментарии (3)
Bardakan
06.06.2024 10:24Вопрос, ответа на который я не увидел в статье - ChatGPT и copilot фактически скачивают себе ваши исходники. Ваш работодатель не против этого?
Или у вас есть решение вопроса приватности и неразглашения?
MountainGoat
Лайфхак: прежде чем писать код при включённом автодополнении, есть смысл написать развёрнутый комментарий о том, что этот код делает, и вставить в проект файлы с документацией вроде используемых протоколов. Он это всё реально использует с пользой. А комментарии потом ещё самому пригодятся.