कोडलैब (कोड बनाना सीखना): Gemini की मदद से टेस्ट आधारित डेवलपमेंट की सुविधा

1. परिचय

यह कोडलैब टेस्ट आधारित डेवलपमेंट के सिद्धांत ( TDD) बताता है, जहां कोड लागू करने से पहले टेस्ट लिखे जाते हैं. हम Ruby की मदद से एक आसान कैलकुलेटर ऐप्लिकेशन बनाएंगे, जिसमें यह तरीका दिखाया जाएगा.

साथ ही, आपको Gemini को कोडिंग असिस्टेंट के तौर पर इस्तेमाल करने के बारे में भी जानकारी मिलेगी. Gemini, टेस्ट केस जनरेट करके, कोड को लागू करने के सुझाव देकर, और कोड के बारे में जानकारी देकर टीडीडी साइकल को तेज़ी से पूरा करने में मदद करेगा.

आखिर में, आपको Calculator ऐप्लिकेशन को Cloud Function पर डिप्लॉय करने का तरीका पता चलेगा. Cloud Function पर, Google पूरी तरह से प्रबंधित सर्वर नहीं है. इससे आपका ऐप्लिकेशन ऐक्सेस किया जा सकेगा.

2. ज़रूरी शर्तें

  • ऐसा Google Cloud प्रोजेक्ट जिसमें बिलिंग की सुविधा चालू हो
  • वेब ब्राउज़र

अपना प्रोजेक्ट बनाएं

Gemini API को चालू करना

  • एपीआई चालू करने के लिए, Gemini Marketplace पर जाएं. एपीआई चालू करने के लिए, gcloud का भी इस्तेमाल किया जा सकता है:
gcloud services enable cloudaicompanion.googleapis.com --project PROJECT_ID
  • Gemini पेज पर जाएँ और "चैट शुरू करें" पर क्लिक करें.
  • अहम जानकारी: Gemini का इस्तेमाल शुरू करने के लिए, इस कोडलैब में दिया गया पहला और दूसरा चरण अपनाएं. इससे आपको Cloud Shell IDE में Gemini की सुविधा को चालू करने में भी मदद मिलेगी.

Cloud Functions एपीआई चालू करें

  • Google Cloud Console में, प्रोजेक्ट सिलेक्टर पेज पर, Google Cloud प्रोजेक्ट चुनें या बनाएं.
  • एपीआई चालू करने के लिए, Cloud Functions एपीआई पेज पर जाएं. एपीआई चालू करने के लिए, gcloud का भी इस्तेमाल किया जा सकता है:
gcloud services enable cloudfunctions.googleapis.com --project PROJECT_ID

Cloud Shell चालू करें

  • आपको Cloud Shell का इस्तेमाल करना होगा. यह Google Cloud Console में चलने वाला एक कमांड-लाइन एनवायरमेंट है. इसमें ज़रूरी भाषाएं पहले से इंस्टॉल होती हैं. Cloud Console में, सबसे ऊपर दाएं कोने में मौजूद 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 के लिए कमांड और इसके इस्तेमाल के बारे में जानने के लिए, दस्तावेज़ देखें.

Editor खोलें

  • इस कोडलैब के लिए, हम पहले से मौजूद क्लाउड एडिटर इस्तेमाल करेंगे. क्लाउड शेल विंडो में, सबसे ऊपर दाएं कोने में मौजूद 'एडिटर खोलें' बटन पर क्लिक करें. इससे आपके लिए एक VSCode एडिटर खुल जाएगा.

e5a5e95d543db556.png

Ruby एक्सटेंशन जोड़ें

  • बाईं ओर दिए गए मेन्यू में, एक्सटेंशन आइकॉन 999939b067e1d0dc.png पर क्लिक करें, खोज बार में vscode ruby लिखें और VSCode Ruby एक्सटेंशन इंस्टॉल करें.

a6fd4e37b3d847d2.png

3. Gemini वॉर्म-अप

एलएलएम तय नहीं किए जा सकते. इसलिए, इन प्रॉम्प्ट को आज़माने के दौरान, आपको मिलने वाला रिस्पॉन्स, कोडलैब में अटैच किए गए स्क्रीनशॉट में दिए गए रिस्पॉन्स से अलग दिख सकता है.

आइए, सबसे पहले 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 और इसके फ़ायदों के बारे में कम शब्दों में जानकारी दी गई है.

आइए, अब Gemini से पूछते हैं कि 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 क्या है और रूबी को भाषा के तौर पर इस्तेमाल करने के क्या फ़ायदे हैं.

4. प्रोजेक्ट सेटअप

आइए, अब एक आसान Ciatra ऐप्लिकेशन बनाकर शुरुआत करते हैं.

  • चलिए, एक खाली फ़ोल्डर बनाते हैं. इसे कोई भी नाम दिया जा सकता है. इस कोडलैब के लिए, हम इसे gemini-tdd कहेंगे. एक्सप्लोरर टैब में, बाईं ओर क्लाउड एडिटर में, /home/<YOUR-USERNAME>/ में फ़ोल्डर बनाएं

d1d920b074cd7c79.png

  • अभी वह फ़ोल्डर खोलें जो हमने बनाया है. सबसे बाईं ओर दिए गए मेन्यू में, 1d080370a3ccad53.png आइकॉन पर क्लिक करें. इसके बाद, फ़ाइल -> पर क्लिक करें फ़ोल्डर खोलें.
  • इस रूट फ़ोल्डर में एक नई Ruby फ़ाइल बनाएं, जो ऐप्लिकेशन के लिए एक शुरुआती बिंदु के रूप में काम करेगी. आप इसे अपने हिसाब से नाम दे सकते हैं. हम इस कोडलैब में इसे app.rb कहेंगे. 7beab8d21c59eee7.png
  • रूट फ़ोल्डर में Gemfile भी जोड़ें. बेहतर होगा कि आप Gemini से Gemfile के बारे में पूछें.
  • हम अपने टेस्ट केस लिखने के लिए, एक app_test.rb फ़ाइल भी बनाएंगे.

5. 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 पर कॉपी करें. आइए, अब इसे टेस्ट करने की कोशिश करते हैं; क्योंकि हमारे पास कोई कोड नहीं लिखा है, इसलिए यह तय नहीं हो पाएगा.

चलिए, 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 पर राइट क्लिक करें. इसके बाद, "इंटिग्रेट किए गए टर्मिनल में खोलें" पर क्लिक करें

66b4bb9598c1feca.png

अगर आप फ़ाइल app_test.rb में नहीं हैं, तो यह पक्का करें कि आप उसी फ़ोल्डर में हों जिसमें फ़ाइल खोलने के लिए, cd निर्देश का इस्तेमाल नहीं किया गया है. टर्मिनल में, Gemini से मिले निर्देश को चलाएं:

ruby app_test.rb

आपको इस गड़बड़ी का सामना करना पड़ेगा:

NameError: uninitialized constant Calculator

अब Gemini को एडिटर से ही इसे ठीक करने का तरीक़ा जानें. क्लाउड शेल एडिटर के नेविगेशन पैनल में चैट आइकॉन पर क्लिक करें और यह प्रॉम्प्ट पूछें:

प्रॉम्प्ट:

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" गड़बड़ी का सामना करना पड़ेगा. चलिए, Gemini से इसे ठीक करने का तरीक़ा जानते हैं.

6. Gemini की सुविधा के साथ बार-बार दोहराई जाने वाली 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 को साफ़ तौर पर बताते हैं कि app.rb में Calculator क्लास तय की गई है .

प्रॉम्प्ट:

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 के जवाब के तौर पर "./app" की ज़रूरत भी हो सकती है. आइए, इसे app_test.rb में app.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 की मदद से, बहुत आसानी से Ruby ऐप्लिकेशन बनाया है और Gemini की मदद ली है. सवाल के जवाब हमेशा एक जैसे नहीं रहते हैं. ऐसा एलएलएम मॉडल पर निर्भर करता है. 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

चलिए, टर्मिनल में Gemini के दिए गए gcloud के लिए निर्देश को एक्ज़ीक्यूट करते हैं.

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 के लिए फ़ंक्शन फ़्रेमवर्क

चलिए, 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.
....

इसलिए, हमारे ऐप्लिकेशन मेंFunction_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"

इस समस्या को हल करने के लिए, Gemini की Generate Code सुविधा का इस्तेमाल करते हैं. आइए, एक्सप्लोरर टैब से app.rb खोलते हैं. इसमें कैलकुलेटर ऐप्लिकेशन कोड पहले से मौजूद है. app.rb में, पहली पंक्ति में, FunctionsFramework टाइप करना शुरू करें , और फिर "." टाइप करें. आपको कुछ सुझाव स्लेटी रंग के टेक्स्ट में दिखेंगे :

9e17476a4a586433.png

सुझाव स्वीकार करने के लिए, Tab दबाएं. इसे स्वीकार करने के बाद, आपको कुछ और सुझाव दिखेंगे, जो नीचे दिए गए हैं:

f3c35d1539789acc.png

अन्य सुझाव स्वीकार करने के लिए, 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

अगर सब कुछ ठीक रहता है, तो डिप्लॉयमेंट पूरा हो जाना चाहिए और आपको वह यूआरएल दिखेगा जहां आपका ऐप्लिकेशन होस्ट किया गया है. बढ़िया, चलिए अतिरिक्त परिणाम वापस लौटाने के लिए 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. शुरू से आखिर तक टेस्टिंग

यूआरएल खोलें और क्वेरी पैरामीटर a और b को पास करें, जैसा कि यहां दिखाया गया है:

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

आपको यह जवाब इस तरह दिखेगा : "Result: 5". कैल्क्यूलेटर कई कार्रवाइयां करता है. इस ऐप्लिकेशन की मदद से अन्य काम भी किए जा सकते हैं और इसके लिए Gemini की मदद ली जा सकती है.

10. नतीजा

आज हमने जाना कि Gemini और TDD की मदद से, Ruby ऐप्लिकेशन कैसे बनाया जाए. आपने देखा कि Gemini से आपको अलग-अलग नतीजे मिल सकते हैं. हालांकि, यह उस भाषा में डेवलपमेंट प्रोसेस को तेज़ी से पूरा करने में मदद कर सकता है जिसके बारे में आपको ज़्यादा पता नहीं है. साथ ही, यह आपको ऐसे फ़ंक्शन या स्निपेट दिखाता है जिनसे आपको सीखने की प्रक्रिया को तेज़ करने में मदद मिलती है.

कोई भी डेवलपर ( भले ही कोई भी अनुभव हो), Gemini को डेवलप करने के लिए उसकी मदद ले सकता है. अगर आपको इसे डेवलप नहीं करना है, तो Gemini का इस्तेमाल मौजूदा कोड के बारे में जानकारी देने के लिए करें. इससे आपको मौजूदा कोड के लिए टेस्ट जनरेट करने के लिए कहा जा सकता है. यह मेरे लिए सबसे उबाऊ काम है 🙂

Gemini के साथ कोडिंग करते रहें!