1. مقدمه
این نرم افزار کد، اصول توسعه تست محور (TDD) را معرفی می کند، که در آن شما قبل از اجرای کد، تست هایی را می نویسید. ما با استفاده از Ruby که این رویکرد را به نمایش می گذارد، یک برنامه ماشین حساب ساده می سازیم.
همچنین یاد خواهید گرفت که چگونه از Gemini به عنوان دستیار برنامه نویسی خود استفاده کنید. Gemini با ایجاد موارد آزمایشی، پیشنهاد اجرای کد و حتی ارائه توضیحاتی در مورد کد، به تسریع چرخه TDD کمک می کند.
در نهایت، خواهید دید که چگونه برنامه ماشین حساب را در Cloud Function، پلتفرم بدون سرور کاملاً مدیریت شده Google، مستقر کنید و برنامه خود را در دسترس قرار دهید.
2. پیش نیازها
- یک پروژه Google Cloud با فعال کردن صورتحساب
- یک مرورگر وب
پروژه خود را ایجاد کنید
- در Google Cloud Console ، در صفحه انتخاب پروژه، یک پروژه Google Cloud را انتخاب یا ایجاد کنید.
- مطمئن شوید که صورتحساب در پروژه Cloud شما فعال است. با نحوه بررسی فعال بودن صورتحساب در پروژه آشنا شوید.
Gemini API را فعال کنید
- برای فعال کردن API به Gemini Marketplace بروید. همچنین می توانید از gcloud برای فعال کردن API استفاده کنید:
gcloud services enable cloudaicompanion.googleapis.com --project PROJECT_ID
- از صفحه جمینی دیدن کنید و روی «شروع چت» کلیک کنید.
- مهم: مراحل 1 و 2 را در این کد لبه دنبال کنید تا Gemini را شروع کنید و Gemini را در Cloud Shell IDE فعال کنید.
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 در گوشه سمت راست بالا کلیک کنید:
- پس از اتصال به 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 برای شما باز می شود.
اضافه کردن Ruby Extension
- در منوی سمت چپ، روی نماد افزونهها کلیک کنید ،
vscode ruby
در نوار جستجو بنویسید و پسوند VSCode Ruby را نصب کنید.
3. گرم کردن جوزا
LLM ها غیر قطعی هستند. بنابراین، در حالی که این دستورات را امتحان میکنید، ممکن است پاسخی که دریافت میکنید متفاوت از پاسخهای موجود در اسکرینشاتهای پیوست شده در Codelab به نظر برسد.
بیایید ابتدا از Gemini بپرسیم TDD چیست؟ برای شروع مکالمه با Gemini در همان Cloud Shell Editor که در آن هستیم، این مراحل را دنبال کنید:
- در سمت چپ صفحه، نماد Gemini را پیدا کنید ، با این کار پنجره چت در سمت چپ برای شما باز می شود.
- میتوانید شروع به تایپ کردن در جعبه متنی کنید که عبارت
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 و مزایای آن می دهد.
حالا بیایید از جمینی بپرسیم روبی چیست:
اعلان:
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>/
ایجاد کنید.
- بیایید پوشه ای را که ایجاد کردیم باز کنیم. در سمت چپ ترین منو، روی نماد کلیک کنید ، روی File -> Open Folder کلیک کنید.
- بیایید یک فایل Ruby جدید در این پوشه ریشه ایجاد کنیم که به عنوان نقطه شروع برای برنامه عمل می کند، می توانید نام آن را هر چه می خواهید بگذارید. ما آن را
app.rb
در این codelab می نامیم. - بیایید یک
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" کلیک کنید.
مطمئن شوید که در همان پوشه فایل 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
کنید و سپس « .
» را تایپ کنید. چند پیشنهاد را در متن خاکستری خواهید دید:
برای پذیرش پیشنهاد، tab را فشار دهید. پس از پذیرفته شدن، پیشنهادهای بیشتری مانند شکل زیر خواهید دید:
برای پذیرش پیشنهادات بیشتر، 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 مبارک!