Codelab: Gemini برای تسریع توسعه آزمایش محور

1. مقدمه

این نرم افزار کد، اصول توسعه تست محور (TDD) را معرفی می کند، که در آن شما قبل از اجرای کد، تست هایی را می نویسید. ما با استفاده از Ruby که این رویکرد را به نمایش می گذارد، یک برنامه ماشین حساب ساده می سازیم.

همچنین یاد خواهید گرفت که چگونه از Gemini به عنوان دستیار برنامه نویسی خود استفاده کنید. Gemini با ایجاد موارد آزمایشی، پیشنهاد اجرای کد و حتی ارائه توضیحاتی در مورد کد، به تسریع چرخه TDD کمک می کند.

در نهایت، خواهید دید که چگونه برنامه ماشین حساب را در Cloud Function، پلتفرم بدون سرور کاملاً مدیریت شده Google، مستقر کنید و برنامه خود را در دسترس قرار دهید.

2. پیش نیازها

  • یک پروژه Google Cloud با فعال کردن صورت‌حساب
  • یک مرورگر وب

پروژه خود را ایجاد کنید

Gemini API را فعال کنید

  • برای فعال کردن API به Gemini Marketplace بروید. همچنین می توانید از gcloud برای فعال کردن API استفاده کنید:
gcloud services enable cloudaicompanion.googleapis.com --project PROJECT_ID

Cloud Functions API را فعال کنید

  • در Google Cloud Console ، در صفحه انتخاب پروژه، یک پروژه Google Cloud را انتخاب یا ایجاد کنید.
  • برای فعال کردن API به صفحه Cloud Functions API بروید. همچنین می توانید از gcloud برای فعال کردن API استفاده کنید:
gcloud services enable cloudfunctions.googleapis.com --project PROJECT_ID

Cloud Shell را فعال کنید

  • شما از Cloud Shell استفاده خواهید کرد، یک محیط خط فرمان در حال اجرا در Google Cloud Console که از قبل با زبان های مورد نیاز نصب شده است. از Cloud Console، روی Activate Cloud Shell در گوشه سمت راست بالا کلیک کنید:

6757b2fb50ddcc2d.png

  • پس از اتصال به Cloud Shell، باید ببینید که قبلاً احراز هویت شده اید و پروژه به ID پروژه شما تنظیم شده است. برای تأیید احراز هویت، دستور زیر را در Cloud Shell اجرا کنید:
gcloud auth list
  • دستور زیر را در Cloud Shell اجرا کنید تا تأیید کنید که دستور gcloud از پروژه شما اطلاع دارد:
gcloud config list project
  • اگر پروژه شما تنظیم نشده است، از دستور زیر برای تنظیم آن استفاده کنید:
gcloud config set project <YOUR_PROJECT_ID>

برای دستورات و استفاده از gcloud به اسناد مراجعه کنید.

ویرایشگر را باز کنید

  • برای این کد لبه، ما از ویرایشگر Cloud داخلی استفاده خواهیم کرد. در پنجره پوسته ابری، روی دکمه Open editor در گوشه سمت راست بالا کلیک کنید. با این کار یک ویرایشگر VSCode برای شما باز می شود.

e5a5e95d543db556.png

اضافه کردن Ruby Extension

  • در منوی سمت چپ، روی نماد افزونه‌ها کلیک کنید 999939b067e1d0dc.png ، vscode ruby در نوار جستجو بنویسید و پسوند VSCode Ruby را نصب کنید.

a6fd4e37b3d847d2.png

3. گرم کردن جوزا

LLM ها غیر قطعی هستند. بنابراین، در حالی که این دستورات را امتحان می‌کنید، ممکن است پاسخی که دریافت می‌کنید متفاوت از پاسخ‌های موجود در اسکرین‌شات‌های پیوست شده در Codelab به نظر برسد.

بیایید ابتدا از Gemini بپرسیم TDD چیست؟ برای شروع مکالمه با Gemini در همان Cloud Shell Editor که در آن هستیم، این مراحل را دنبال کنید:

  • در سمت چپ صفحه، نماد Gemini را پیدا کنید 25fdcae4447d063c.png ، با این کار پنجره چت در سمت چپ برای شما باز می شود.
  • می‌توانید شروع به تایپ کردن در جعبه متنی کنید که عبارت Enter a prompt here

5e09b0fb6a1b44dd.png

اعلان:

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 و مزایای آن می دهد.

حالا بیایید از جمینی بپرسیم روبی چیست:

اعلان:

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.
....

این توضیح می دهد که روبی چیست و مزایای استفاده از روبی به عنوان یک زبان چیست.

4. راه اندازی پروژه

بیایید اکنون با ایجاد یک برنامه ساده سیناترا شروع کنیم.

  • بیایید یک پوشه خالی ایجاد کنیم. هر چی بخوای میتونی اسمشو بذاری ما آن را gemini-tdd برای این Codelab می نامیم. در ویرایشگر ابری در سمت چپ زیر تب Explorer، پوشه ای را در زیر /home/<YOUR-USERNAME>/ ایجاد کنید.

d1d920b074cd7c79.png

  • بیایید پوشه ای را که ایجاد کردیم باز کنیم. در سمت چپ ترین منو، روی نماد کلیک کنید 1d080370a3ccad53.png ، روی File -> Open Folder کلیک کنید.
  • بیایید یک فایل Ruby جدید در این پوشه ریشه ایجاد کنیم که به عنوان نقطه شروع برای برنامه عمل می کند، می توانید نام آن را هر چه می خواهید بگذارید. ما آن را app.rb در این codelab می نامیم. 7beab8d21c59eee7.png
  • بیایید یک 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 کپی کنیم. بیایید سعی کنیم و این تست را در حال حاضر اجرا کنیم. از آنجایی که هیچ کدی نوشته نشده است، مطمئناً از کار خواهد افتاد.

بیایید از Gemini بپرسیم که چگونه این تست را اجرا کنیم.

اعلان:

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 در تب Explorer راست کلیک کرده و روی "Open in Integrated Terminal" کلیک کنید.

66b4bb9598c1feca.png

مطمئن شوید که در همان پوشه فایل 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 از تب Explorer باز کنید و کد داده شده توسط Gemini را در آن کپی کنید. در حالی که در حال تغییر محتوا در app.rb هستید، ممکن است برخی از پیشنهادات را از Gemini به عنوان تکمیل خودکار دریافت کنید. اگر می‌خواهید آن را بپذیرید باید tab یا اگر نه Esc را فشار دهید.

حالا بیایید دوباره تست را اجرا کنیم. دستور زیر را در ترمینال یکپارچه خود تایپ کنید:

ruby app_test.rb

اما همچنان با همان خطای " NameError: uninitialized constant Calculator " مواجه خواهید شد. بیایید از جوزا بپرسیم چگونه آن را برطرف کنیم.

6. TDD تکراری با جمینی

اعلان:

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 تکرار از دستورات برای دریافت پاسخ مناسب طول بکشد، اما زمانی که آن را دریافت کنید، بهتر می شود. لطفاً توجه داشته باشید که ممکن است به جای آن، در پاسخ از Gemini ، «./app» را ببینید. بیایید این را به 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 Terminal در پوشه پروژه اجرا کنید:

ruby app_test.rb

اگر همه چیز خوب پیش برود، آزمون باید قبول شود. بنابراین، ما یک برنامه روبی بسیار ساده با استفاده از رویکرد 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 UI توضیح می دهد. اما من نمی خواهم این کار را انجام دهم. بیایید از 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 را ببینید.

بیایید سعی کنیم دوباره به توابع ابری مستقر شویم. همان دستور deploy را در ترمینال اجرا کنید:

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. چارچوب توابع برای روبی

بیایید از Gemini در مورد خطا بپرسیم:

اعلان:

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 دوباره از ترمینال اجرا کنید. حالا بیایید دوباره دستور deploy را اجرا کنیم:

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 را از تب Explorer باز کنیم، جایی که قبلاً کد برنامه Calculator را داریم. در app.rb، در خط اول، شروع به تایپ FunctionsFramework کنید و سپس « . » را تایپ کنید. چند پیشنهاد را در متن خاکستری خواهید دید:

9e17476a4a586433.png

برای پذیرش پیشنهاد، tab را فشار دهید. پس از پذیرفته شدن، پیشنهادهای بیشتری مانند شکل زیر خواهید دید:

f3c35d1539789acc.png

برای پذیرش پیشنهادات بیشتر، tab را فشار دهید. بنابراین، app.rb شما باید به شکل زیر باشد:

(نام تابع را از add to app تغییر نام دهید)

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. نتیجه گیری

ما دیدیم که چگونه امروز با استفاده از رویکرد TDD با کمک Gemini یک برنامه روبی توسعه دهیم. همانطور که متوجه شدید، Gemini ممکن است نتایج متفاوتی به شما بدهد، اما قطعا می‌تواند به تسریع روند توسعه در زبانی که ممکن است بیشتر با آن آشنا نباشید کمک کند، و همچنان عملکردها یا قطعاتی را برای سرعت بخشیدن به منحنی یادگیری به شما نشان می‌دهد.

هر توسعه دهنده (صرف نظر از تجربه) می تواند از Gemini برای روند توسعه خود کمک بگیرد. اگر برای توسعه نیست، می توانید از Gemini برای توضیح کدهای موجود استفاده کنید، می توانید از آن بخواهید که برای کد موجود تست هایی ایجاد کند که حداقل برای من خسته کننده ترین کار است.

کد نویسی با Gemini مبارک!