Введение в тестирование с помощью Gemini Code Assist

1. Введение

В этой лабораторной работе вы будете использовать Gemini Code Assist, инструмент для совместной работы на основе искусственного интеллекта в Google Cloud, чтобы добавить тесты в существующее веб-приложение на Python, а также найти и исправить ошибки в этом приложении, выявленные тестами. Затем вы будете использовать Code Assist для создания тестов для новой функциональности и генерации кода, который пройдет эти тесты и расширит возможности приложения.

Что вы будете делать...

  • Вы будете использовать Cloud Shell Editor для загрузки кода существующего веб-приложения.
  • В редакторе Cloud Shell вы будете использовать чат Gemini Code Assist для задавания общих вопросов о Google Cloud.
  • Вы будете использовать встроенную функцию помощи в написании кода Gemini Code Assist в редакторе Cloud Shell для генерации тестов для приложения, запуска тестов, поиска и исправления ошибок, а затем для расширения функциональности приложения.

Что вы узнаете...

  • Как использовать Gemini Code Assist для решения различных задач разработчиков, таких как генерация тестов и генерация кода.
  • Как использовать Gemini Code Assist для изучения Google Cloud.

Что вам понадобится...

  • Веб-браузер Chrome
  • Аккаунт Gmail
  • Облачный проект с включенной функцией выставления счетов.
  • Функция Gemini Code Assist включена для вашего облачного проекта.

Этот практический урок предназначен для разработчиков всех уровней, включая начинающих. Хотя пример приложения написан на языке Python, вам не обязательно быть знакомым с программированием на Python, чтобы понять, что происходит. Мы сосредоточимся на ознакомлении разработчиков с возможностями Gemini Code Assist.

2. Настройка

Для выполнения этой лабораторной работы у вас уже должен быть облачный проект с включенной оплатой. Теперь мы включим API Gemini в нашем проекте Google Cloud. Следуйте приведенным ниже инструкциям:

  1. Перейдите по ссылке https://console.cloud.google.com и убедитесь, что вы выбрали проект Google Cloud, с которым планируете работать в рамках этой лабораторной работы. Щелкните значок Gemini в правом верхнем углу.

GeminiBanner.png

  1. Окно консоли Gemini for Cloud откроется в правой части окна. Нажмите кнопку «Включить» , если она отображается ниже. Если вы не видите кнопку «Включить» , а вместо этого видите интерфейс чата, значит, вы уже включили Gemini for Cloud для проекта и можете сразу перейти к следующему шагу.

GeminiApiEnable.png

  1. После включения вы можете протестировать Gemini, задав ему один или два запроса. Показаны несколько примеров запросов, но вы можете попробовать что-то вроде «Что такое Cloud Run?».

GeminiChatWindow.png

Code Assist ответит на ваш вопрос. Вы можете нажать на кнопку. f68286b2b2ea5c0a.png Значок в правом верхнем углу закрывает окно чата Code Assist.

Включите Gemini в редакторе Cloud Shell.

Gemini Code Assist доступен и работает аналогично в нескольких популярных IDE. В этом практическом задании вы будете использовать Google Cloud Shell Editor , который полностью работает в вашем веб-браузере. Вам необходимо включить и настроить Gemini в Cloud Shell Editor, шаги для этого описаны ниже:

  1. Запустите Cloud Shell, используя значок, показанный ниже. Запуск экземпляра Cloud Shell может занять одну-две минуты.

72dc3df7b007fcde.png

  1. Нажмите кнопку «Редактор» или «Открыть редактор» (в зависимости от ситуации) и дождитесь появления редактора Cloud Shell. Если вы видите кнопку «Попробовать новый редактор» , нажмите на нее.

CloudShellEditor.png

  1. Нажмите на кнопку « Cloud Code — Войти» в нижней строке состояния, как показано на рисунке. Авторизуйте плагин в соответствии с инструкциями. Если в строке состояния отображается «Cloud Code — нет проекта» , выберите этот пункт, а затем выберите конкретный проект Google Cloud из списка проектов, с которыми вы планируете работать.

CloudCodeSignIn.png

  1. Если вы не видите значок Gemini в строке состояния в правом нижнем углу, вам необходимо включить его в Cloud Code. Прежде чем это сделать, убедитесь, что Gemini (ранее известный как Duet AI для разработчиков) включен в IDE, перейдя в раздел «Расширения Cloud Code» → «Настройки» и введя текст Duet AI: Enable, как показано ниже. Убедитесь, что флажок установлен. Перезагрузите IDE. Это включит Gemini в Cloud Code, и в вашей IDE появится строка состояния Gemini.

EnableDuetAiSetting.png

  1. Нажмите на кнопку Gemini в правом нижнем углу, как показано на рисунке, и выберите нужный проект Google Cloud, для которого мы включили API Cloud AI Companion .

GeminiSelectGoogleCloudProject.png

  1. После выбора проекта Google Cloud убедитесь, что он отображается в сообщении о состоянии Cloud Code в строке состояния, а также что Gemini включен справа в строке состояния, как показано ниже:

GeminiEnabledStatusBar.png

Gemini Code Assist готов к использованию!

3. Скачайте и изучите приложение.

В окне терминала выполните команду для клонирования репозитория с исходным кодом, а затем перейдите в новую директорию (если окно терминала больше не открыто, нажмите кнопку «Терминал» или «Открыть терминал» , чтобы восстановить его):

git clone https://github.com/GoogleCloudPlatform/testing-with-duet-ai-codelab.git
cd testing-with-duet-ai-codelab

Откройте файл main.py в редакторе, затем откройте окно чата Gemini , щелкнув значок чата Gemini в левой части редактора. Это окно чата Gemini находится внутри IDE и содержит код, доступный для обсуждения. Введите запрос «Объясните это» и просмотрите ответ:

GeminiChatExplainThis.png

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

4. Запуск локально

При необходимости перейдите в каталог репозитория с помощью cd ~/testing-with-duet-ai-codelab и введите команду python3 main.py в окне терминала:

3bf558e9cea15375.png

Чтобы открыть главную страницу приложения в новой вкладке браузера, нажмите на ссылку http://127.0.0.1:8080:

fb06f382a4c03e4c.png

Приложение работает «локально». На самом деле, редактор Cloud Shell здесь немного поколдовал. Приложение работает в Cloud Shell, а не на вашем компьютере. Когда вы щелкнули по ссылке, открылась вкладка не с фактическим локальным адресом http://127.0.0.1:8080, а с прокси-сервером, настроенным Cloud Shell специально для этой цели. Эффект тот же, как если бы вы действительно запускали его локально.

Попробуйте. Введите 25 и нажмите «Конвертировать»!

e1b9d5832f6d0058.png

Верно, 25 — это XXV в римских цифрах! На этом вы должны закончить.

Может, стоит проверить ещё несколько чисел? 25 подошло, а как насчёт 24?

37982e385e17baac.png

Возможно, мы немного поторопились, решив, что всё в порядке. Правильно ли перевести 24 в XXIIII? Не должно ли быть XXIV?

Можно утверждать, что XXIIII — это правильно, но это не совсем то, чего обычно ожидают. Однако, поскольку это не совсем ошибка (заметьте, что на многих часах цифра 4 отображается как римская цифра IIII), оставим этот вопрос для будущих улучшений.

А как насчет отрицательных чисел? Ноль? Эти числа невозможно представить римскими цифрами. В ответ пользователю ничего не отображается, что указывает на ошибку, требующую исправления.

Тестирование помогает находить и устранять ошибки, а Gemini Code Assist может помочь нам писать и использовать тесты.

5. Добавление тестов

Вернитесь в окно чата Gemini и задайте свой вопрос.

How can I test the number_to_roman function?

Внимательно прочтите ответ, в котором следует обсудить модуль unittest и модуль pytest .

Возможно, вам захочется, чтобы Gemini Code Assist написал эти тесты за вас. Откройте файл calendar.py , где находится сам код преобразования, в редакторе, вернитесь в окно чата Gemini и снова задайте вопрос.

How can I test the number_to_roman function?

Теперь ответ стал более конкретным и даже включает модуль модульных тестов, который можно скопировать или внедрить в новый файл:

import unittest
import calendar

class NumberToRomanTest(unittest.TestCase):

    def test_convert_1(self):
        self.assertEqual(calendar.number_to_roman(1), "I")

    def test_convert_4(self):
        self.assertEqual(calendar.number_to_roman(4), "IV")

    def test_convert_9(self):
        self.assertEqual(calendar.number_to_roman(9), "IX")

    def test_convert_40(self):
        self.assertEqual(calendar.number_to_roman(40), "XL")

    def test_convert_90(self):
        self.assertEqual(calendar.number_to_roman(90), "XC")

    def test_convert_400(self):
        self.assertEqual(calendar.number_to_roman(400), "CD")

    def test_convert_900(self):
        self.assertEqual(calendar.number_to_roman(900), "CM")

    def test_convert_1990(self):
        self.assertEqual(calendar.number_to_roman(1990), "MCMXC")

    def test_convert_2023(self):
        self.assertEqual(calendar.number_to_roman(2023), "MMXXIII")

Возможно, вы увидите код, отличающийся от приведенного выше примера. Базовые модели Gemini Code Assist периодически обновляются, поэтому ответы не всегда будут одинаковыми. Если вы видите другой набор кода, вы можете выбрать, продолжить ли работу с примерами, показанными в этом практическом задании, скопировав приведенный здесь код, или попробовать альтернативный ответ, который предлагает Gemini Code Assist. Если у вас есть время, вы можете попробовать оба варианта. Gemini Code Assist — это помощник в программировании, который вы можете использовать по своему усмотрению.

Чтобы создать новый файл с кодом модульных тестов, либо щелкните стрелку с двумя точками в правом верхнем углу окна Gemini Chat, либо используйте IDE для создания нового файла и вставьте в него код, показанный в этой лабораторной работе. Нажмите CTRL-S или CMD-S в этом окне, чтобы сохранить файл, и назовите сохраненный файл calendar-unittest.py.

Вернитесь в терминал и нажмите CTRL-C, чтобы остановить веб-сервер, который вы оставили запущенным ранее, и получите приглашение командной строки. Введите команду.

python3 calendar-unittest.py

для запуска новых тестов.

Результата нет. Это не то, что ожидалось. Всё прошло без сбоев? Вам бы хотелось это точно знать. Посмотрите ответ от Gemini Code Assist, который включал тестовый код. Ниже кода была дополнительная информация о том, как запустить тестовый случай:

run-unittest.png

Попробуйте выполнить рекомендуемую команду:

python -m unittest discover

Проблема может возникнуть, если на вашем компьютере команда python3 не назначена команде python . В этом случае выполните следующую команду:

python3 -m unittest discover

Команда выполняется, но возвращает Ran 0 tests in 0.000s . В модуле содержится несколько тестов. Что происходит?

Это последнее слово в команде, discover . Откуда оно взялось? По-видимому, Gemini Code Assist ожидал, что тестовый код будет сохранен в файле с именем discover или discover.py , но не указал, что именно нужно сделать. Поскольку вы фактически сохранили файл в calendar-unittest.py , попробуйте выполнить команду:

python3 -m unittest calendar-unittest

Теперь вы видите множество результатов, начиная примерно с такого:

$ python3 -m unittest calendar-unittest
.F.FFFFFF
======================================================================
FAIL: test_convert_1990 (calendar-unittest.NumberToRomanTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/charles_engelke/testing-with-duet-ai-codelab/calendar-unittest.py", line 28, in test_convert_1990
    self.assertEqual(calendar.number_to_roman(1990), "MCMXC")
AssertionError: 'MDCCCCLXXXX' != 'MCMXC'
- MDCCCCLXXXX
+ MCMXC

В первой строке точка ставится за каждый пройденный тест, а буква F — за каждый не пройденный. Большинство тестов не проходят! Затем приводится список не пройденных тестов по отдельности, с указанием ожидаемого и фактического результата. Не совсем понятно, в каком порядке запускались тесты. Порядок был алфавитным по названию теста, а не по порядку, в котором тесты указаны в файле. Таким образом, сначала запускался test_convert_1 , затем test_convert_1990 , затем test_convert_2023 и так далее. Прошли только тесты 1 и 2023 .

Когда вы впервые попробовали этот код, вы заметили, что он преобразовал 24 в XXIIII , что не совсем неправильно, но не соответствует распространенной форме, где IIII преобразуется в IV . Все неудачные тесты были для аналогичных случаев. Когда эта проблема была впервые обнаружена, лаборатория заявила: «Поскольку это не совсем ошибка (обратите внимание, что многие часы показывают 4 как римскую цифру IIII ), оставьте этот вопрос для будущего улучшения».

Вы можете изменить тестовые примеры так, чтобы они ожидали и принимали ответы, которые код считает «в принципе не неправильными », или же смириться с тем, что пришло время для «будущего улучшения». Поэтому ваш следующий шаг — исправить код с помощью Gemini Code Assist, чтобы он давал более приемлемые ответы, ожидаемые тестами.

6. Улучшение кода

Напомним, что ответы типа XXIIII для 24 , вместо более распространённого XXIV , были сочтены «не совсем неправильными» и отложены до будущего улучшения. Это будущее настало. Эти «не совсем неправильные» ответы всё ещё раздражают.

Первое правило для повторяющихся цифр в римских цифрах: если подряд встречаются четыре одинаковые цифры, их следует заменить одной из них, а затем следующей по старшинству цифрой. Так, XXIIII следует заменить на XXIV . Аналогично, XXXX следует заменить на XL , а CCCC — на CD .

Обратитесь в Gemini Code Assist, чтобы узнать, как изменить значение переменной roman таким образом непосредственно перед тем, как она будет возвращена функцией number_to_roman:

If the final value of roman has IIII in it, that should be replaced by IV. Similarly XXXX should be replaced by XL, and CCCC should become CD. How can I make those changes?

Предлагается добавить в конце небольшой фрагмент кода:

6437c3fa2c5fabd1.png

Скопируйте/вставьте или введите эти строки в редакторе, а затем посмотрите, что произойдет:

dcefa568cab82fb7.png

В Gemini Code Assist добавлены дополнительные строки для обработки случаев, которые могут возникнуть после выполнения первого набора замен. Например, число 19 будет преобразовано в XVIIII, затем в XVIV и, наконец, в правильное XIX.

Если Gemini Code Assist предложил полезные варианты, нажмите Tab, чтобы принять рекомендации, сохраните файл и снова запустите веб-сервер. В противном случае добавьте строки, показанные в приведенном здесь примере, вручную и сохраните файл. Попробуйте выполнить сложную конвертацию: 1999:

a206999587fdc9.png

Совершенно верно!

Повторите тесты. Все они пройдены успешно!

Веб-приложение, похоже, готово к запуску в производство.

7. Развертывание в облаке.

Cloud Run запустит для вас контейнеризированное приложение в интернете. Для приложений, написанных с использованием распространенных фреймворков, таких как Flash, команда gcloud run deploy даже создаст этот контейнер перед его развертыванием. Выполните команду:

gcloud run deploy

В терминале. Когда вас спросят о местоположении исходного кода, нажмите Enter, чтобы принять предложенное местоположение. Аналогично, когда вас спросят о названии сервиса, нажмите Enter, чтобы принять предложенное местоположение.

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

gcloud config set core/project <project-id>

где Замените на идентификатор вашего проекта, который может совпадать с его именем. Затем повторно запустите команду gcloud run deploy .

  • В результате выполнения команды появится сообщение о том, что для работы некоторых API-интерфейсов требуется их наличие, но они ещё не включены. Введите y, чтобы включить их.
  • При выборе региона выберите тот, который вам удобен. Безопасным вариантом будет ввод номера, соответствующего региону us-central1 .
  • При появлении запроса введите Y для продолжения.
  • Вам потребуется разрешить неаутентифицированные вызовы этой службы Cloud Run. Используемый Cloud Run вариант аутентификации подходит для программ, обращающихся к этой службе. Поскольку это веб-сайт, аутентификация не потребуется.

Google Cloud создаст контейнер, развернет его, направит к нему трафик, установит политики доступа, а затем покажет вам ссылку на главную страницу:

94ba7d8d63a44afd.png

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

a2e51666dfd33a9f.png

Введите число и нажмите Enter, и вуаля!

5021535ac991a95c.png

Что!?!

На вашем компьютере всё заработало! Почему же процесс не завершается?

Узнайте. Обратитесь в Gemini Code Assist.

Why am I getting an internal server error on cloud run?

4b24321251d6eddf.png

По всей видимости, Gemini Code Assist может прочитать файл журнала, в котором содержится примерно такая же информация. Давайте спросим у Gemini Code Assist, как вы можете самостоятельно просмотреть журналы:

92d1855be73ef1d.png

Сделайте это. Найдите строки с красными восклицательными знаками, указывающими на ошибку, как показано ниже:

9bed4f9ed82de21c.png

Далее следует множество подробных строк описания стека вызовов, ведущих сюда, но затем происходит следующее:

47fc93be845f4e3f.png

Если вы посмотрите на свой файл calendar.py , вы увидите там функцию number_to_roman ! И вы знаете, что она правильная, потому что она работала на вашем компьютере. Что может быть иначе в Cloud Run?

Ответ непрост. В Python3 есть стандартный модуль под названием calendar , точно такой же, как и файл calendar.py, в котором определена функция number_to_roman . На вашей локальной машине, когда Python искал модуль calendar , он сначала искал его в каталоге вашего приложения. По-видимому, Python в Cloud Run сначала искал стандартные модули, импортировал их и не нашел функцию number_to_roman .

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

Исправьте эту проблему. Вам нужно изменить имя вашего локального модуля календаря на что-то, что не является стандартным именем модуля. Переименуйте файл calendar.py в my_calendar.py , затем измените строки import calendar в файлах main.py и calendar-unittest.py на import my_calendar . Наконец, измените строку

roman = calendar.number_to_roman(number)

к

roman = my_calendar.number_to_roman(number)

Попробуйте запустить программу локально, выполните тесты, а затем повторно разверните её:

gcloud run deploy

И теперь это работает:

ed288801c6825eb1.png

Вы можете поделиться этой ссылкой, и каждый, кому нужен инструмент для преобразования римских цифр, сможет им воспользоваться.

8. Дополнительно: Сделайте так, чтобы выглядело лучше.

Ваше приложение работает исправно и доступно любому пользователю в интернете. Но выглядит оно немного простовато. Прежде чем рассказывать о нём всем, почему бы не попросить Gemini Code Assist улучшить его внешний вид?

Откройте файл templates/index.html . В окне чата Gemini задайте вопрос:

Make this index.html file use material design.

В результате в текущий файл вносятся дополнения, что приводит к результату, подобному следующему:

<!DOCTYPE html>
<html>
<head>
    <title>Roman Numerals</title>
    <link rel="stylesheet" href="https://code.getmdl.io/1.3.0/material.indigo-pink.min.css">   
    <script defer src="https://code.getmdl.io/1.3.0/material.min.js"></script>     
</head>
<body>
    <h1 class="mdl-typography--title">Roman Numerals</h1>
    <form action="/convert" method="post">
        <div class="mdl-textfield mdl-js-textfield">
            <input class="mdl-textfield__input" type="text" id="number" name="number" required />
            <label class="mdl-textfield__label" for="number">Enter a number:</label>
          </div>
          <button class="mdl-button mdl-js-button mdl-button--raised mdl-button--colored">
            Convert!
          </button>
    </form>
</body>
</html>

Воспользуйтесь значком, чтобы скопировать предложенный код и вставить его поверх существующего содержимого файла index.html . В терминале запустите python3 main.py и щелкните по ссылке, чтобы открыть окно предварительного просмотра. Теперь страница стала немного менее простой:

295643ec03fcaafc.png

При желании вы можете повторить это с файлом convert.html .

Gemini Code Assist неплохо разбирается в CSS, и вы можете использовать его для оформления страниц приложения различными способами. Это только начало.

Поскольку вы хотите поделиться этим приложением, не забудьте повторно развернуть его в Cloud Run:

gcloud run deploy

Вы можете передать URL-адрес людям, которым необходимо преобразовать цифры в римские.

9. Поздравляем!

Поздравляем! Вы успешно использовали Gemini Code Assist для добавления тестов в приложение, исправления ошибок и расширения функциональности.

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

Справочные документы...