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

۱. مقدمه

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

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

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

۲. پیش‌نیازها

  • یک پروژه گوگل کلود با قابلیت پرداخت صورتحساب
  • یک مرورگر وب

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

فعال کردن API جمینی

  • برای فعال کردن API به بازار Gemini بروید. همچنین می‌توانید از gcloud برای فعال کردن API استفاده کنید:
gcloud services enable cloudaicompanion.googleapis.com --project PROJECT_ID
  • به صفحه Gemini مراجعه کنید و روی «شروع چت» کلیک کنید.
  • مهم: برای شروع کار با Gemini و فعال کردن Gemini در Cloud Shell IDE، به ترتیب مراحل ۱ و ۲ را در این codelab دنبال کنید.

فعال کردن API توابع ابری

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

فعال کردن پوسته ابری

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

6757b2fb50ddcc2d.png

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

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

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

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

e5a5e95d543db556.png

افزونه روبی را اضافه کنید

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

a6fd4e37b3d847d2.png

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

LLM ها غیر قطعی هستند. بنابراین، در حالی که شما این دستورات را امتحان می‌کنید، پاسخی که دریافت می‌کنید ممکن است با آنچه در تصاویر پیوست شده در codelab آمده است متفاوت باشد.

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

  • در سمت چپ صفحه، آیکون 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.
....

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

۴. راه‌اندازی پروژه

حالا بیایید با ایجاد یک برنامه ساده Sinatra شروع کنیم.

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

d1d920b074cd7c79.png

  • بیایید پوشه‌ای را که تازه ایجاد کرده‌ایم باز کنیم. در سمت چپ منو، روی آیکون کلیک کنید 1d080370a3ccad53.png ، روی فایل -> باز کردن پوشه کلیک کنید.
  • بیایید یک فایل Ruby جدید در این پوشه ریشه ایجاد کنیم که به عنوان نقطه شروع برنامه عمل خواهد کرد، می‌توانید آن را هر نامی که می‌خواهید بگذارید. ما در این codelab آن را app.rb می‌نامیم. 7beab8d21c59eee7.png
  • بیایید یک Gemfile هم به پوشه ریشه اضافه کنیم. خوب است که از Gemini در مورد Gemfile هم سوال کنیم.
  • همچنین یک فایل app_test.rb برای نوشتن موارد تست خود ایجاد خواهیم کرد.

۵. پیاده‌سازی مبتنی بر Gemini

حالا بیایید با ارائه توضیحاتی در مورد کاری که می‌خواهیم انجام دهیم به 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.

بنابراین، بیایید ادامه دهیم و تست را اجرا کنیم. در تب Explorer روی app_test.rb کلیک راست کرده و روی "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 " مواجه خواهید شد. بیایید از Gemini بپرسیم که چگونه آن را برطرف کنیم.

۶. توسعه تست مبتنی بر تست تکراری با 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 در آن تعریف شده است، وارد کنیم. گاهی اوقات ممکن است ۲-۳ بار تکرار درخواست‌ها طول بکشد تا پاسخ درست را دریافت کنید، اما وقتی که به آن مسلط شوید، بهتر خواهد شد. لطفاً توجه داشته باشید که ممکن است در پاسخ Gemini به جای require "./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 در پوشه پروژه اجرا کنید:

ruby app_test.rb

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

۷. برنامه را روی توابع ابری مستقر کنید

حالا بیایید از 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 را ایجاد می‌کند. پس از اجرای دستور، به تب explorer بروید، باید بتوانید فایل Gemfile.lock را ببینید.

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

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 "

۸. چارچوب توابع برای روبی

بیایید از 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 gem را در برنامه خود نداریم. بیایید این خط را به فایل Gemfile خود اضافه کنیم:

gem "functions_framework"

حالا bundle install در ترمینال اجرا کنید. ممکن است با خطایی با عنوان "No explicit global resource in 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 به 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

۹. تست سرتاسری

URL را باز کنید و پارامترهای کوئری a و b را مطابق شکل زیر ارسال کنید:

https://[APP-URL]/?a=2&b=3

شما باید بتوانید پاسخ را به صورت "Result: 5" ببینید. یک ماشین حساب عملیات زیادی انجام می‌دهد. می‌توانید این برنامه را برای انجام این عملیات نیز توسعه دهید و از Gemini در این زمینه کمک بگیرید.

۱۰. نتیجه‌گیری

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

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

از کدنویسی با Gemini لذت ببرید!