1. Введение
В этой лаборатории кода представлены принципы разработки через тестирование (TDD), при которой вы пишете тесты перед реализацией кода. Мы создадим простое приложение-калькулятор с использованием Ruby, демонстрирующее этот подход.
Вы также узнаете, как использовать Gemini в качестве помощника по программированию. Gemini поможет ускорить цикл TDD, создавая тестовые примеры, предлагая реализации кода и даже предоставляя пояснения к коду.
Наконец, вы увидите, как развернуть приложение-калькулятор на Cloud Function, полностью управляемой бессерверной платформе Google, сделав ваше приложение доступным.
2. Предварительные условия
- Проект Google Cloud с включенной оплатой
- Веб-браузер
Создайте свой проект
- В Google Cloud Console на странице выбора проекта выберите или создайте проект Google Cloud.
- Убедитесь, что в вашем облачном проекте включена оплата. Узнайте, как проверить, включена ли оплата в проекте .
Включите API Gemini
- Перейдите на Gemini Marketplace , чтобы включить API. Вы также можете использовать gcloud для включения API:
gcloud services enable cloudaicompanion.googleapis.com --project PROJECT_ID
- Посетите страницу Близнецов и нажмите «Начать общение».
- Важно! Выполните шаги 1 и 2 в этой лаборатории кода , чтобы начать работу с Gemini и включить Gemini в Cloud Shell IDE соответственно.
Включите API облачных функций
- В Google Cloud Console на странице выбора проекта выберите или создайте проект Google Cloud.
- Перейдите на страницу API облачных функций , чтобы включить API. Вы также можете использовать gcloud для включения API:
gcloud services enable cloudfunctions.googleapis.com --project PROJECT_ID
Активировать Cloud Shell
- Вы будете использовать Cloud Shell , среду командной строки, работающую в Google Cloud Console, которая поставляется с предустановленными необходимыми языками. В Cloud Console нажмите «Активировать Cloud Shell» в правом верхнем углу:
- После подключения к Cloud Shell вы увидите, что вы уже прошли аутентификацию и что для проекта установлен идентификатор вашего проекта. Выполните следующую команду в Cloud Shell, чтобы подтвердить, что вы прошли аутентификацию:
gcloud auth list
- Выполните следующую команду в Cloud Shell, чтобы убедиться, что команда gcloud знает о вашем проекте:
gcloud config list project
- Если ваш проект не установлен, используйте следующую команду, чтобы установить его:
gcloud config set project <YOUR_PROJECT_ID>
Обратитесь к документации по командам и использованию gcloud.
Открыть редактор
- Для этой лаборатории кода мы будем использовать встроенный редактор Cloud. В окне облачной оболочки нажмите кнопку «Открыть редактор» в правом верхнем углу. Это откроет для вас редактор VSCode.
Добавить расширение Ruby
- В меню слева щелкните значок расширений. , в строке поиска напишите
vscode ruby
и установите расширение VSCode Ruby.
3. Разминка для Близнецов
LLM недетерминированы. Таким образом, пока вы пробуете эти запросы, полученный ответ может отличаться от тех, что показаны на снимках экрана, прикрепленных к лаборатории кода.
Давайте сначала спросим Gemini, что такое TDD. Чтобы начать общение с Gemini в том же редакторе Cloud Shell, где мы находимся, выполните следующие действия:
- В левой части страницы найдите значок Близнецов. , откроется окно чата слева.
- Вы можете начать вводить текст в текстовом поле с надписью
Enter a prompt here
Быстрый:
What is Test Driven Development?
Ответ:
Test-driven development (TDD) is a software development methodology that requires developers to write automated tests before writing any production code. This helps ensure the code is correct and meets the requirement. ....
Он дает вам краткое представление о TDD и его преимуществах.
Давайте теперь спросим Близнецов, что такое Ruby:
Быстрый:
What is Ruby?
Ответ:
Ruby is a general-purpose, interpreted, object-oriented programming language. It is designed to be easy to read and write. Ruby is dynamically typed, meaning that the type of a variable is not declared and can change during execution. ....
В нем объясняется, что такое Ruby и каковы преимущества использования Ruby в качестве языка.
4. Настройка проекта
Давайте теперь начнем с создания простого приложения Sinatra.
- Давайте создадим пустую папку. Вы можете назвать его как хотите. Для этой лаборатории мы назовем его
gemini-tdd
. В облачном редакторе слева на вкладке «Проводник» создайте папку/home/<YOUR-USERNAME>/
- Давайте откроем только что созданную папку. В крайнем левом меню нажмите на иконку , нажмите Файл -> Открыть папку.
- Давайте создадим новый файл Ruby в этой корневой папке, который будет служить отправной точкой для приложения. Вы можете назвать его как хотите. В этой лаборатории кода мы назовем его
app.rb
- Давайте также добавим
Gemfile
в корневую папку. Будет неплохо также спросить Gemini оGemfile
. - Мы также создадим файл
app_test.rb
для записи наших тестовых примеров.
5. Реализация на основе Близнецов
Теперь давайте начнем с того, что предоставим Gemini некоторый контекст того, что мы пытаемся сделать, и попросим его сгенерировать тестовые примеры для того же самого. Скопируйте следующую подсказку в приглашение чата Gemini.
Быстрый:
Answer as a software engineer with Ruby expertise. We want to build a Ruby calculator application with a test driven development approach. Let's start by writing some tests for the calculator app using minitest gem.
Ответ:
Here is a simple test for a calculator app that adds two numbers:
require "minitest/autorun"
describe "Calculator" do
it "should add two numbers" do
calculator = Calculator.new
assert_equal 5, calculator.add(2, 3)
end
end
This test uses the assert_equal method to verify that the result of the add method is correct. .....
Он дает вам пример тестового примера для приложения «Калькулятор», то есть для сложения двух чисел. Он также импортировал необходимый minitest/autorun
зависимостей для тестов. Давайте скопируем содержимое в app_test.rb
. Давайте попробуем запустить этот тест сейчас; поскольку у нас нет написанного кода, он наверняка потерпит неудачу.
Давайте спросим Близнецов, как провести этот тест.
Быстрый:
How do we run the tests written in app_test.rb using ruby command?
Ответ:
To run the tests written in app_test.rb using the ruby command, you can use the following steps: 1.Make sure that you are in the same directory as the app_test.rb file. 2.Open a terminal window. 3.Type the following command:
ruby app_test.rb
This will run all of the tests in the app_test.rb file and report the results.
Итак, давайте продолжим и проведем тест. Щелкните правой кнопкой мыши app_test.rb
на вкладке «Проводник» и выберите «Открыть во встроенном терминале».
Убедитесь, что вы находитесь в той же папке, что и файл app_test.rb, в противном случае используйте команду cd , чтобы попасть туда. В терминале запустите команду, возвращенную Gemini:
ruby app_test.rb
Вы столкнетесь со следующей ошибкой:
NameError: uninitialized constant Calculator
Давайте спросим Gemini, как это исправить прямо из редактора. Нажмите значок чата на панели навигации редактора Cloud Shell и задайте следующий запрос:
Быстрый:
NameError: uninitialized constant Calculator. Give me Calculator class code.
Ответ:
The error you are getting is because you have not defined the Calculator class. You need to define the Calculator class before you can use it in your tests. Here is the code for the Calculator class:
Class Calculator
def add(a, b)
a + b
end
end
Once you have defined the Calculator class, you can run the tests again and they will pass. .....
Gemini сообщает нам, что у нас нет класса под названием Calculator
и что нам нужно его создать. Он также предоставил нам код для создания класса Calculator
. Давайте продолжим и воспользуемся этим кодом. Откройте app.rb
на вкладке «Проводник» и скопируйте в него код, предоставленный Gemini. Пока вы изменяете содержимое файла app.rb, вы можете получить некоторые предложения от Gemini в виде автозаполнения; вам нужно нажать tab
если вы хотите принять это, или Esc
, если нет.
Теперь давайте проведем тест еще раз. Введите следующую команду во встроенном терминале:
ruby app_test.rb
Но вы все равно столкнетесь с той же ошибкой « NameError: uninitialized constant Calculator
». Давайте спросим Близнецов, как это исправить.
6. Итеративный TDD с Gemini
Быстрый:
I am still getting this error: "NameError: uninitialized constant Calculator".
Ответ:
The error you are getting is because you have not defined the Calculator class. You need to define the Calculator class before you can use it in your tests. Here is the code for the Calculator class:
class Calculator
def add(a, b)
a + b
end
def subtract(a, b)
a - b
end
def multiply(a, b)
a * b
end
def divide(a, b)
a / b
end
end
....
Это дало нам некоторый ответ, который может быть таким же, как указано выше, а может и не совпадать. Итак, давайте явно сообщим Gemini, что у нас есть класс Calculator, определенный в app.rb.
Быстрый:
Calculator class is defined in app.rb already.
Ответ:
I see that the Calculator class is defined in the app.rb file. However, you are getting the NameError error because you are trying to use the Calculator class in the app_test.rb file without requiring the app.rb file. To fix this, you need to add the following line to the top of the app_test.rb file:
require_relative "app"
Мы получили ответ от Gemini с просьбой импортировать файл app.rb, в котором у нас определен класс Calculator. Иногда для получения правильного ответа может потребоваться 2–3 итерации подсказок, но когда вы освоитесь, все станет лучше. Обратите внимание, что вместо этого вы также можете увидеть «./app» в ответ от Gemini. Давайте добавим это в app.rb в app_test.rb и снова запустим тот же тест.
Убедитесь, что на данный момент ваш app_test.rb выглядит так:
require "minitest/autorun"
require "./app"
describe "Calculator" do
it "should add two numbers" do
calculator = Calculator.new
assert_equal 5, calculator.add(2, 3)
end
end
Запустите приведенную ниже команду из терминала Cloud Shell в папке проекта:
ruby app_test.rb
Если все пойдет хорошо, тест должен пройти. Итак, мы разработали очень простое приложение на Ruby, используя подход TDD, и воспользовались помощью Gemini. Быстрые ответы не будут все время одинаковыми, и это характерно для моделей LLM. Вы можете получить больше операций с калькулятором от Gemini, но в целом тот же процесс, которому мы только что следовали, должен работать.
7. Разверните приложение в Cloud Functions.
Давайте теперь попросим Gemini развернуть это в Cloud Function:
Быстрый:
Let's deploy this app to Cloud Functions
Ответ:
To deploy your app to Cloud Functions, you can use the following steps: 1.Create a new Cloud Functions project. 2.Create a new Cloud Function. 3.Set the trigger for the Cloud Function to be an HTTP request. 4.Set the entry point for the Cloud Function to be the app method in the app.rb file. 5.Deploy the Cloud Function. Once you have deployed the Cloud Function, you can test it by sending an HTTP request to the function's URL. ....
Gemini объясняет, как развернуть его вручную с помощью пользовательского интерфейса Cloud Functions. Но я не хочу этого делать. Давайте попросим Gemini дать нам команду gcloud
, которую я могу запустить прямо из встроенного терминала.
Быстрый:
How do I deploy this app to Cloud Functions gen2 using the gcloud command?
Ответ:
... Here are the specific commands you can use to deploy your app to Cloud Functions using the gcloud command: gcloud functions deploy calculator --runtime ruby32 --trigger-http --entry-point app This command will create a new Cloud Function called calculator that is triggered by an HTTP request and uses the app method in the app.rb file as the entry point. Once the Cloud Function is deployed, you can test it by sending an HTTP request to the function's URL. For example, you can use the following command to send a request to the function: curl -X POST -H "Content-Type: application/json" -d '{"a": 2, "b": 3}' https://REGION-PROJECT_ID.cloudfunctions.net/calculator
Давайте выполним команду gcloud, данную Gemini, в терминале.
gcloud functions deploy calculator --runtime ruby32 --trigger-http --entry-point app
Вы столкнетесь со следующей ошибкой:
« ERROR: (gcloud.functions.deploy) OperationError: code=3, message=Build failed: Could not find Gemfile.lock file in your app. Please make sure your bundle is up to date before deploying.; Error ID: 7916f05c
»
Давайте воспользуемся помощью Gemini, чтобы исправить ошибку.
Быстрый:
ERROR: (gcloud.functions.deploy) OperationError: code=3, message=Build failed: Could not find Gemfile.lock file in your app. Please make sure your bundle is up to date before deploying.; Error ID: 7916f05c
Ответ:
It looks like you're trying to deploy a function to Cloud Functions, but you don't have a Gemfile.lock file in your app. To fix this, run the following command in your app directory:
bundle install
This will create a Gemfile.lock file that lists all of the gems that your app uses. ...
Давайте запустим bundle install
в терминале, который создаст Gemfile.lock
. После запуска команды проверьте вкладку проводника, вы сможете увидеть Gemfile.lock
.
Давайте попробуем снова выполнить развертывание в Cloud Functions. Выполните ту же команду развертывания в терминале:
gcloud functions deploy calculator --runtime ruby32 --trigger-http --entry-point app
Вы столкнетесь с еще одной следующей ошибкой:
" ERROR: (gcloud.functions.deploy) OperationError: code=3, message=Build failed: unable to execute functions-framework-ruby; please ensure a recent version of the functions_framework gem is in your Gemfile; Error ID: 89ae7dda
"
8. Фреймворк функций для Ruby
Давайте спросим Близнецов об ошибке:
Быстрый:
ERROR: (gcloud.functions.deploy) OperationError: code=3, message=Build failed: unable to execute functions-framework-ruby; please ensure a recent version of the functions_framework gem is in your Gemfile; Error ID: 89ae7dda
Ответ:
It looks like you're trying to deploy a function to Cloud Functions, but the build is failing because the functions_framework gem is not in your Gemfile. To fix this, add the following line to your Gemfile: gem "functions_framework" Then, run the following command to install the gem: bundle install Once the gem is installed, you can try deploying your function again. ....
По сути, в нашем приложении отсутствует драгоценный камень Functions_framework. Давайте добавим эту строку в наш Gemfile:
gem "functions_framework"
Теперь запустите bundle install
в терминале. Вы можете столкнуться или не столкнуться с ошибкой «Нет явного глобального ресурса в Gemfile». Если вы столкнулись с этим, убедитесь, что в первой строке вашего Gemfile есть следующее:
source "https://rubygems.org"
Затем снова запустите bundle install
из терминала. Теперь давайте снова запустим команду развертывания:
gcloud functions deploy calculator --runtime ruby32 --trigger-http --entry-point app --project PROJECT_ID
Теперь вы столкнетесь со следующей ошибкой:
« ERROR: (gcloud.functions.deploy) OperationError: code=3, message=Build failed: failed to verify function target "app" in source "app.rb": Undefined function: "app"; Error ID: e12ab0f9
«
Чтобы решить эту проблему, давайте попробуем функцию Generate Code
в Gemini. Давайте откроем app.rb на вкладке «Проводник», где у нас уже есть код приложения «Калькулятор». В app.rb в первой строке начните вводить FunctionsFramework
, а затем введите « .
». Вы увидите некоторые предложения серым текстом:
Нажмите Tab, чтобы принять предложение. Как только оно будет принято, вы увидите больше предложений, как показано ниже:
Нажмите Tab, чтобы принять дальнейшие предложения. Итак, ваш app.rb должен выглядеть так:
(Переименуйте имя функции из « Добавить в приложение »)
require "functions_framework"
FunctionsFramework.http "app" do |request|
a = request.params["a"].to_i
b = request.params["b"].to_i
Calculator.new.add(a, b)
end
class Calculator
def add(a, b)
a + b
end
end
Мы только что создали точку входа для приложения Cloud Functions, а также научились использовать предложения кода Gemini в редакторе. Теперь давайте попробуем развернуть приложение еще раз.
gcloud functions deploy calculator --runtime ruby32 --trigger-http --entry-point app --project PROJECT_ID
И если все пойдет хорошо, развертывание должно пройти, и вы сможете увидеть URL-адрес, по которому размещено ваше приложение. Отлично, давайте немного изменим app.rb, чтобы вернуть результат сложения. Ваш окончательный файл app.rb должен выглядеть так:
require "functions_framework"
FunctionsFramework.http "app" do |request|
a = request.params["a"].to_i
b = request.params["b"].to_i
calculator = Calculator.new
add = calculator.add(a, b)
"Result: #{add}"
end
class Calculator
def add(a, b)
a + b
end
end
9. Сквозное тестирование
Откройте URL-адрес и передайте параметры запроса a
и b
, как показано ниже:
https://[APP-URL]/?a=2&b=3
Вы должны увидеть ответ: "Result: 5"
. Калькулятор выполняет множество операций. Вы также можете расширить это приложение для выполнения этих задач и воспользоваться в этом помощью Gemini.
10. Заключение
Сегодня мы увидели, как разработать приложение Ruby, используя подход TDD с помощью Gemini. Как вы заметили, Gemini может дать вам разные результаты, но он определенно может помочь ускорить процесс разработки на языке, с которым вы, возможно, не совсем знакомы, и при этом показывать вам функции или фрагменты кода, чтобы ускорить процесс обучения.
Любой разработчик (независимо от опыта) может воспользоваться помощью Gemini в процессе разработки. Если не для разработки, вы можете использовать Gemini для объяснения существующего кода, вы можете попросить его сгенерировать тесты для существующего кода, что, по крайней мере, для меня является самой скучной работой 🙂
Удачного кодирования с Gemini!