Что пишут в блогах

Подписаться

Что пишут в блогах (EN)

Разделы портала

Онлайн-тренинги

.
Улучшаем код автотестов при помощи AI в IDE
16.04.2025 00:00

Автор: Валентин Агапитов (Valentin Agapitov)
Оригинал статьи
Перевод: Ольга Алифанова

Всем привет. Хочу рассказать об отличных способах применения ИИ в вашей IDE.

Сейчас диалоговые ИИ вроде ChatGPT напрямую встраиваются в наиболее популярные IDE – например, в Visual Studio Code, Visual Code, и семейство IDE от JetBrains.

Для начала я проведу обзор вариантов использования, в которых ИИ пригодился мне для создания кода тест-автоматизации. Затем – предложу ряд ИИ-инструментов, которые могут вам помочь.

Быстрая помощь с синтаксисом: ИИ-ассистенты программиста

Ассистент программиста подсказывает вам код по мере ввода. Иногда это подсказка о завершении текущей строки, а иногда – целый блок нового кода. Можно принять предложение полностью или частично, или игнорировать его и продолжать печатать. ИИ-ассистент программиста позволяет писать код быстрее, потому что вы не тратите время на стандартный или простой код.

Пример


GitHub Copilot предлагает код для функции бинарного поиска

Парное программирование с ИИ

ИИ-ассистента можно использовать в качестве партнера при парном программировании. Если вы занимаетесь тест-автоматизацией, то, скорее всего, вам приходится писать какой-то стандартный первоначальный код, создавать исходные классы или набрасывать первоначальную архитектуру. Этим можно заниматься часами и даже днями – даже если вы опытный разработчик.

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

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

Пример

Запрос к ИИ:

Создай класс с конечными точками API для создания, получения, обновления и удаления информации пользователя.

Ответ ИИ:


Стандартный код, предложенный ИИ-ассистентом

Использование ИИ для поиска

Если вы ранее пользовались Google или Stack Overflow для поиска ответов на вопросы, связанные с разработкой, то вам понравится возможность задавать схожие вопросы ИИ прямо из IDE. Недавно я осознал, что уже год как использую ИИ-поиск из IDE вместо Stack Overflow.

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

Пример

Запрос (переформулирован для ясности):

«Для работы с Redis я использую FlaskRedis. Как получить задачу Redis, если у меня есть только параметр?»

Ответ ИИ:


ИИ советует, как найти все ключи в Redis через клиент FlaskRedis, если я знаю только часть ключа.

Я использовал первый предложенный блок кода, но он не сработал. Он предлагал метод keys – возможно, ранее он существовал, но сейчас он отсутствует. Это хороший пример галлюцинации ИИ.

Затем я отправил ИИ еще один запрос, попросив его проверить свой совет. На этот раз ИИ вернул рабочее предложение с валидным методом scan_iter. К тому же ассистент предупредил о возможных проблемах производительности, связанных с этим методом.


Пример самопроверки ИИ

Диагностика и исправление ошибок при помощи ИИ

ИИ способен объяснять стек-трейсы и ошибки. Это здорово, если вы только изучаете новую библиотеку или фреймворк, или даже новый для себя язык. Как правило, в этих случаях поиск ответа может занять много времени.

Теперь можно просто вставить сообщение об ошибке в ИИ-чат и получить развернутое, полезное объяснение своей ошибки. Более того, ИИ-ассистент может предложить вам возможное решение, как снизить риск ошибки или избежать ее в будущем.

Пример

Example

Запрос к ИИ:

Исправь ошибку.

Код

client = FlaskRedis()
lock = Lock(client.connection_pool, lock_key)
have_lock = False

Error

file "/www/backend/service/cache.py", line 64, in save_lock                                                                                                                                                                                                             │
│  lock = Lock(client.connection_pool, lock_key)                                                                                                                                                                                                                         │
│         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^                                                                                                                                                                                                                         │
│   File "/usr/local/lib/python3.11/site-packages/redis/lock.py", line 145, in __init__                                                                                                                                                                                     │
│  self.register_scripts()                                                                                                                                                                                                                                               │
│   File "/usr/local/lib/python3.11/site-packages/redis/lock.py", line 151, in register_scripts                                                                                                                                                                             │
│  cls.lua_release = client.register_script(cls.LUA_RELEASE_SCRIPT)                                                                                                                                                                                                      │
│                    ^^^^^^^^^^^^^^^^^^^^^^                                                                                                                                                                                                                              │
│ AttributeError: 'ConnectionPool' object has no attribute 'register_script'

Ответ ИИ:

 

ИИ объясняет, почему ошибка возникла, и предлагает решение

Перевод синтаксиса на другой язык при помощи ИИ

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

Пример

Запрос к ИИ: перепиши этот код на Python

const f=(n)=>n<2?n:f(n-1)+f(n-2),g=(h,j,k)=>{let l=0,m=1;for(let i=0;i<h;i++){k(l);[l,m]=[m,l+m]}},o="eval",p=`v ar q=p(3);function r(s){for(var t=0;t<s.length;t++)q+=Str ing.fromCharCode(s.charCodeAt(t)-1);return o(q)}function u (a){return a.replace(/\\s+/g,"")}function w(a){return r(a)}`;eval(u(w(p)));g(10,f,console.log);

Ответ ИИ:

 

ИИ переводит синтаксис кода с JavaScript на Python

Разбираемся в коде и документации при помощи ИИ

Если вам нужно провести ревью чужого кода, а комментарии отсутствуют, попросите Ии о помощи. Просто вставьте код и спросите, что он делает. Как показывает мой опыт, все ассистенты отлично умеют объяснять код, поэтому вперед, пользуйтесь этим!

Вы можете проделать то же самое с документацией. Если у вас есть некая документация, скажем, Swagger или набор README-файлов, вы можете загрузить их в ИИ-ассистента и попросить их объяснить. Более того, можно также вставлять документацию в ИИ-чат в качестве контекста и задавать вопросы о своем коде, опираясь на документацию.

Пример

Запрос к ИИ: объясни код

const f=(n)=>n<2?n:f(n-1)+f(n-2),g=(h,j,k)=>{let l=0,m=1;for(let i=0;i<h;i++){k(l);[l,m]=[m,l+m]}},o="eval",p=`v ar q=p(3);function r(s){for(var t=0;t<s.length;t++)q+=Str ing.fromCharCode(s.charCodeAt(t)-1);return o(q)}function u (a){return a.replace(/\\s+/g,"")}function w(a){return r(a)}`;eval(u(w(p)));g(10,f,console.log);

Ответ ИИ:


ИИ объясняет функцию JavaScript

ИИ-поддержка генерации тестовых данных

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

Пример

Запрос к ИИ: Напиши код, генерирующий валидный номер документа Перу (CCI) с длиной 20, который пройдет валидацию.


def is_validate(cci: str) -> bool:
    """
    1. Проверить, что номер банковского счета содержит только числа.
    2. Проверить длину номера счета; она должна быть или 18, или 20 цифр
    3. Если длина счета 18, а последние две цифры «00», она считается валидной.
    4. Если длина счета 20, последние две цифры – проверочные, которые нужно валидировать.
    5. Для валидации проверочных цифр алгоритм высчитывает проверочные цифры
    из первых 18 цифр CCI и сравнивает их с последними двумя цифрами CCI.
    """  # noqa E501
    if not cci.isdigit():
        return False
    if len(cci) == 18 and cci[-2:] == '00':
        return True
    if len(cci) == 20:
        last_digits = cci[-2:]
        cci_without_check = cci[:-2]
        first_check_digits = _calculate_check_digit(cci_without_check[:6])
        second_check_digits = _calculate_check_digit(cci_without_check[6:18])
        check_digits = str(first_check_digits) + str(second_check_digits)
        return check_digits == last_digits
    return False

def _calculate_check_digit(value: str) -> int:
    total = 0
    factor = 1
    for digit in value:
        num = int(digit)
        if (product := num * factor) < 10:
            total += product
        else:
            product_str = str(product)
            first_digit = int(product_str[0])
            last_digit = product % 10
            total += first_digit + last_digit
        factor = 2 if factor == 1 else 1
    return 10 - (total % 10) if total % 10 > 0 else 0

Ответ ИИ:


Код, генерирующий валидный номер документа Перу (CCI) с длиной 20, который пройдет валидацию.

Создание сообщение о коммите для системы контроля версий при помощи ИИ

Хорошие сообщения для системы контроля версий – это очень важно, но у вас может не быть времени обдумать их. Пусть этим займется ИИ.

Это особенно полезно, когда в коммите много изменений. Даже для базового сообщения может потребоваться несколько минут. У ИИ-ассистента это займет пару секунд.

Пример


ИИ-ассистент JetBrains предлагает вариант сообщения для изменений кода

Создание юнит-тестов при помощи ИИ

Не секрет, что создание юнит-тестов – не самая желанная задача для разработчика. Это скучный стандартный код, покрывающий простейшие случаи.

Предложите разработчикам возложить задачу по созданию юнит-тестов на ИИ-помощника. Он сбережет им время, не даст заскучать, а если они ранее не писали юнит-тесты, то и код выйдет лучше.

Пример

Запрос к ИИ:

Я выбрал нужный класс в IDE и сделал запрос: напиши юнит-тесты для класса.

Ответ ИИ:

 

Предложение ИИ для класса с юнит-тестами, генерирующего и валидирующего бразильский документ типа CPF.

Генерация тест-кейсов при помощи ИИ

Иногда нам нужно проверить малоизвестную нам функциональную область. Можно попросить ИИ-ассистента помочь с генерацией вариантов.

Я использую этот подход, когда мне нужно создать полный список параметров проверки валидаторов email-адреса. Я попросил ИИ сгенерировать все граничные случаи и задействовать форматы IDN и Punycode.

Пример

Запрос к ИИ:

Создай полный список тест-кейсов для валидации email-адреса, включающий формат IDN.

Ответ ИИ:


ИИ предлагает тест-параметры для проверки валидации email-адреса

Выберите свой ИИ-инструмент

Если вы поклонник JetBrains, можно воспользоваться JetBrains AI Assistant. JetBrains AI assistant существует относительно давно. Стоит он сейчас (в мае 2024) $10 в месяц.

Следующий в списке - Machinet. Это расширение для IDE-семейства JetBrains. Этот инструмент предлагает классный диалоговый ИИ, который хорошо погружается в контекст вашего проекта. Он пользуется ChatGPT API, и стоит столько же, сколько и JetBrains AI - $10 в месяц.

Следующий крупный игрок, GitHub, предоставляет расширение Github Copilot, у которого есть чат GitHub Copilot. Это расширение доступно для IDE-семейства JetBrains, Visual Studio Code, и Visual Code. Заметьте, что GitHub Copilot лучше всего работает с IDE от Microsoft IDE: он глубоко интегрирован, понимает контекст и дает хорошие ответы. Подписка в месяц стоит $10.

Amazon также предоставляет виртуального ИИ-помощника, известного как Amazon CodeWhisperer. Инструмент работает с Visual Studio Code, PyCharm, IntelliJ IDEA, и, конечно, AWS Cloud9. CodeWhisperer доступен по подписке, $19 в месяц.

Вообще не хотите платить за ИИ-помощника в разработке? Или, возможно, хотите хоть на время оторваться от ChatGPT? Попробуйте Continue. При желании можно использовать ChatGPT или переключиться на языковую модель с открытым исходным кодом вроде llama2 или codellama.

Множество ИИ-инструментов – например, GitHub Copilot Chat, JetBrains AI Assistant, и Machinet, - качественно документированы. Эти ИИ-ассистенты хорошо интегрированы с IDE. Это не просто окошки чата – загляните в контекстные меню, чтобы узнать о других функциях. Если вы владеете всеми из них, то это сильно повысит вашу производительность как автоматизатора.

Заключение

Это все варианты использования, которыми я хотел с вами поделиться! Если вы хотите узнать о других, или обсудить те, которые я не упомянул, сообщите в комментариях или в Ministry of Testing Club! Спасибо!

Обсудить в форуме