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

1. Введение

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

Что ты сделаешь...

  • Вы будете использовать редактор Cloud Shell для загрузки кода существующего веб-приложения.
  • Вы будете использовать чат Gemini Code Assist в редакторе Cloud Shell, чтобы задавать общие вопросы о 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. Настройка

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

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

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 , который полностью работает в вашем веб-браузере. Вам необходимо включить и настроить Gemini в редакторе Cloud Shell. Шаги приведены ниже:

  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, перейдя в «Расширение облачного кода» → «Настройки» , а затем введите текст Duet AI: Включить, как показано ниже. Убедитесь, что флажок установлен. Вам следует перезагрузить вашу IDE. Это активирует Gemini в Cloud Code, и строка состояния Gemini появится в вашей IDE.

EnableDuetAiSetting.png

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

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 Chat находится в IDE, и код в 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

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

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

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

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

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

Вернитесь в окно чата Gemini и спросите

How can I test the number_to_roman function?

Прочтите ответ, который должен включать обсуждение модулей unittest и pytest .

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

How can I test the number_to_roman function?

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

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, как таким образом изменить значение римской переменной непосредственно перед тем, как она будет возвращена функцией 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 будет преобразовано в XVIII, затем в XVIV и, наконец, в правильный XIX.

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

a206999587fdc9.png

Правильно!

Повторите тесты сейчас. Они все проходят!

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

7. Развертывание в Cloud Run

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

Что!?!

Это сработало на вашей машине! Почему это не закончено?

Выяснить. Спросите помощника по коду Близнецов,

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 включен стандартный модуль под названием «календарь» , точно так же, как файл «календарь.py», в котором определена функция «number_to_roman» . На вашем локальном компьютере, когда Python искал модуль под названием «календарь» , он сначала просматривал каталог вашего приложения. Судя по всему, 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

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

8. Необязательно: сделайте его красивее

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

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

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

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

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