Codelab: Test odaklı geliştirmeyi hızlandıracak Gemini

1. Giriş

Bu codelab'de, kodu uygulamadan önce test yazdığınız Test Odaklı Geliştirme ( TDD) ilkeleri tanıtılmaktadır. Bu yaklaşımı gösteren Ruby ile basit bir hesap makinesi uygulaması oluşturacağız.

Ayrıca, Gemini'ı kodlama asistanınız olarak nasıl kullanacağınızı da öğreneceksiniz. Gemini, test senaryoları oluşturarak, kod uygulamaları önererek ve hatta kod açıklamaları sağlayarak TDD döngüsünü hızlandırmaya yardımcı olur.

Son olarak, hesap makinesi uygulamasını Google'ın tümüyle yönetilen sunucusuz platformu Cloud Functions'a nasıl dağıtacağınızı ve uygulamanızı nasıl erişilebilir hale getireceğinizi öğreneceksiniz.

2. Ön koşullar

  • Faturalandırmanın etkin olduğu bir Google Cloud projesi
  • Web tarayıcısı

Projenizi oluşturma

Gemini API'yi etkinleştirme

  • API'yi etkinleştirmek için Gemini Marketplace'e gidin. API'yi etkinleştirmek için gcloud'u da kullanabilirsiniz:
gcloud services enable cloudaicompanion.googleapis.com --project PROJECT_ID

Cloud Functions API'yi etkinleştir

gcloud services enable cloudfunctions.googleapis.com --project PROJECT_ID

Cloud Shell'i etkinleştirme

  • Gerekli dillerin yüklü olduğu Google Cloud Console'da çalışan bir komut satırı ortamı olan Cloud Shell'i kullanacaksınız. Cloud Console'da sağ üst köşedeki Cloud Shell'i etkinleştir'i tıklayın:

6757b2fb50ddcc2d.png

  • Cloud Shell'e bağlandıktan sonra kimliğinizin doğrulandığını ve projenin, proje kimliğinize ayarlandığını görürsünüz. Kimliğinizin doğrulandığını onaylamak için Cloud Shell'de şu komutu çalıştırın:
gcloud auth list
  • gcloud komutunun projeniz hakkında bilgi sahibi olduğunu onaylamak için Cloud Shell'de aşağıdaki komutu çalıştırın:
gcloud config list project
  • Projeniz ayarlanmamışsa ayarlamak için aşağıdaki komutu kullanın:
gcloud config set project <YOUR_PROJECT_ID>

gcloud komutları ve kullanımı için belgelere bakın.

Düzenleyiciyi Aç

  • Bu codelab'de yerleşik Cloud Düzenleyici'yi kullanacağız. Cloud Shell penceresinde, sağ üst köşedeki Düzenleyiciyi aç düğmesini tıklayın. Bu işlemle VSCode düzenleyicisi açılır.

e5a5e95d543db556.png

Ruby uzantısını ekleme

  • Sol yan menüde uzantılar simgesini 999939b067e1d0dc.png tıklayın, arama çubuğuna vscode ruby yazın ve VSCode Ruby uzantısını yükleyin.

a6fd4e37b3d847d2.png

3. Gemini'a Giriş

LLM'ler deterministik değildir. Bu nedenle, bu istemleri denerken aldığınız yanıtlar, codelab'e eklenen ekran görüntülerindeki yanıtlardan farklı görünebilir.

Öncelikle Gemini'a TDD'nin ne olduğunu soralım. Gemini ile aynı Cloud Shell Editor'da sohbet etmeye başlamak için aşağıdaki adımları uygulayın:

  • Sayfanın sol tarafında Gemini simgesini 25fdcae4447d063c.png bulun. Bu simge, sol tarafta sohbet penceresini açar.
  • Enter a prompt here yazan metin kutusuna yazmaya başlayabilirsiniz.

5e09b0fb6a1b44dd.png

İstem:

What is Test Driven Development?

Yanıt:

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

Bu dokümanda, TDD ve avantajları hakkında kısa bir giriş yapılıyor.

Şimdi Gemini'a Ruby'nin ne olduğunu soralım:

İstem:

What is Ruby?

Yanıt:

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'nin ne olduğu ve dil olarak Ruby kullanmanın avantajları açıklanır.

4. Proje Ayarları

Şimdi basit bir Sinatra uygulaması oluşturarak başlayalım.

  • Boş bir klasör oluşturalım. İstediğiniz adı verebilirsiniz. Bu codelab'de gemini-tdd olarak adlandıracağız. Sol taraftaki bulut düzenleyicide, Gezgin sekmesinin altında /home/<YOUR-USERNAME>/ bölümünde klasör oluşturun.

d1d920b074cd7c79.png

  • Yeni oluşturduğumuz klasörü açalım. En soldaki menüde 1d080370a3ccad53.png simgesini, ardından Dosya -> Klasörü Aç'ı tıklayın.
  • Bu kök klasörde, uygulama için başlangıç noktası olarak kullanılacak yeni bir Ruby dosyası oluşturalım. Bu dosyaya istediğiniz adı verebilirsiniz. Bu codelab'de app.rb olarak adlandıracağız. 7beab8d21c59eee7.png
  • Kök klasöre de bir Gemfile ekleyelim. Gemini'a Gemfile hakkında da soru sormanız iyi olur.
  • Test senaryolarımızı yazmak için app_test.rb dosyası da oluşturacağız.

5. Gemini Destekli Uygulama

Şimdi de Gemini'a ne yapmaya çalıştığımızla ilgili biraz bağlam bilgisi vererek ve aynı konuda test senaryoları oluşturmasını isteyerek başlayalım. Gemini ile etkileşim istemine aşağıdaki istemi kopyalayın.

İstem:

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.

Yanıt:

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

Hesap Makinesi uygulaması için örnek bir test durumu (ör. iki sayıyı toplama) gösterilir. Ayrıca, testler için gerekli bağımlılığı minitest/autorun da içe aktardı. İçeriği app_test.rb adresine kopyalayalım. Şimdi bu testi çalıştırmayı deneyelim. Herhangi bir kod yazmadığımız için test kesinlikle başarısız olacaktır.

Gemini'a bu testi nasıl çalıştıracağımızı soralım.

İstem:

How do we run the tests written in app_test.rb using ruby command?

Yanıt:

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.

O zaman testi çalıştıralım. Gezgin sekmesinde app_test.rb simgesini sağ tıklayın ve "Open in Integrated Terminal"ı (Entegre Terminalde Aç) tıklayın.

66b4bb9598c1feca.png

app_test.rb dosyasıyla aynı klasörde olduğunuzdan emin olun. Değilseniz cd komutunu kullanarak bu klasöre gidin. Terminalde Gemini'ın döndürdüğü komutu çalıştırın:

ruby app_test.rb

Aşağıdaki hatayla karşılaşırsınız:

NameError: uninitialized constant Calculator

Gemini'a doğrudan düzenleyiciden nasıl düzeltebileceğimizi soralım. Cloud Shell düzenleyicisinin gezinme bölmesindeki sohbet simgesini tıklayın ve aşağıdaki istemi girin:

İstem:

NameError: uninitialized constant Calculator. Give me Calculator class code.

Yanıt:

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 adlı bir sınıfımızın olmadığını ve oluşturmamız gerektiğini söylüyor. Ayrıca Calculator sınıfını oluşturmak için gereken kodu da verdi. Bu kodu kullanalım. Gezgin sekmesinden app.rb bağlantısını açın ve Gemini'ın verdiği kodu kopyalayın. app.rb dosyasındaki içeriği değiştirirken Gemini'dan otomatik tamamlama olarak bazı öneriler alabilirsiniz. Öneriyi kabul etmek istiyorsanız tab, kabul etmek istemiyorsanız Esc tuşuna basmanız gerekir.

Şimdi testi tekrar çalıştıralım. Entegre terminalinize aşağıdaki komutu yazın:

ruby app_test.rb

Ancak yine de aynı "NameError: uninitialized constant Calculator" hatasıyla karşılaşırsınız. Bu hatayı nasıl düzeltebileceğimizi Gemini'a soralım.

6. Gemini ile yinelemeli TDD

İstem:

I am still getting this error: "NameError: uninitialized constant Calculator".

Yanıt:

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

Yukarıdakiyle aynı veya farklı bir yanıt verdi. Bu nedenle, Gemini'a app.rb dosyasında Hesap Makinesi sınıfının tanımlandığını açıkça söyleyelim .

İstem:

Calculator class is defined in app.rb already.

Yanıt:

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"

Hesap makinesi sınıfının tanımlandığı app.rb dosyasını içe aktarmak için Gemini'dan yanıt aldık. Doğru yanıtı almak için bazen 2-3 istem girmeniz gerekebilir ancak bu konuda ustalaştıkça daha iyi sonuçlar alırsınız. Gemini'dan gelen yanıtta require "./app" ifadesini de görebileceğinizi lütfen unutmayın. Bunu app_test.rb dosyasındaki app.rb dosyasına ekleyip aynı testi tekrar çalıştıralım.

Lütfen bu noktada app_test.rb dosyanızın aşağıdaki gibi göründüğünden emin olun:

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

Proje klasöründeki Cloud Shell terminalinden aşağıdaki komutu çalıştırın:

ruby app_test.rb

Her şey yolunda giderse test başarılı olur. Bu nedenle, TDD yaklaşımını kullanarak çok basit bir Ruby uygulaması geliştirdik ve Gemini'dan yardım aldık. İstem yanıtları her zaman aynı olmayacaktır. Bu durum, LLM modellerinin doğası gereğidir. Gemini'dan Hesap Makinesi ile ilgili daha fazla işlem alabilirsiniz ancak genel olarak az önce uyguladığımız aynı işlem işe yarayacaktır.

7. Uygulamayı Cloud Functions'a dağıtma

Şimdi Gemini'dan bunu Cloud Functions'a dağıtmasını isteyelim:

İstem:

Let's deploy this app to Cloud Functions

Yanıt:

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 kullanıcı arayüzünü kullanarak manuel olarak nasıl dağıtılacağını açıklar. Ancak bunu yapmak istemiyorum. Gemini'dan, entegre terminalden doğrudan çalıştırabileceğim gcloud komutunu vermesini isteyelim.

İstem:

How do I deploy this app to Cloud Functions gen2 using the gcloud command?

Yanıt:

...
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'ın terminalde verdiği gcloud komutunu çalıştıralım.

gcloud functions deploy calculator --runtime ruby32 --trigger-http --entry-point app

Aşağıdaki hatayla karşılaşırsınız:

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

Hatayı düzeltmek için Gemini'dan yardım alalım.

İstem:

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

Yanıt:

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

Terminalde bundle install komutunu çalıştırarak Gemfile.lock dosyasını oluşturalım . Komutu çalıştırdıktan sonra Explorer sekmesini kontrol edin. Gemfile.lock simgesini görmeniz gerekir.

Cloud Functions'a dağıtmayı tekrar deneyelim. Terminalde aynı dağıtım komutunu çalıştırın:

gcloud functions deploy calculator --runtime ruby32 --trigger-http --entry-point app

Aşağıdaki hatayla da karşılaşabilirsiniz:

"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 için Functions Framework

Gemini'a hatayla ilgili sorun:

İstem:

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

Yanıt:

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

Yani uygulamamızda functions_framework gem'i eksik. Gemfile'ımıza şu satırı ekleyelim:

gem "functions_framework"

Şimdi terminalde bundle install komutunu çalıştırın. "Gemfile'da açıkça belirtilmiş küresel kaynak yok" şeklinde bir hata mesajıyla karşılaşabilirsiniz veya karşılaşmayabilirsiniz. Bu durumla karşılaşırsanız Gemfile'ınızın ilk satırında aşağıdakilerin yer aldığından emin olun:

source "https://rubygems.org"

Ardından, terminalden bundle install komutunu tekrar çalıştırın. Şimdi dağıtım komutunu tekrar çalıştıralım:

gcloud functions deploy calculator --runtime ruby32 --trigger-http --entry-point app --project PROJECT_ID

Şimdi aşağıdaki hatayla karşılaşırsınız:

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

Bu sorunu çözmek için Gemini'ın Generate Code özelliğini deneyelim. Zaten Hesap Makinesi uygulaması kodunun bulunduğu Explorer sekmesinden app.rb dosyasını açalım. app.rb dosyasının ilk satırında FunctionsFramework yazmaya başlayın, ardından "." yazın. Gri metinle bazı öneriler gösterilir :

9e17476a4a586433.png

Öneriyi kabul etmek için Sekme tuşuna basın. Bu kabul edildikten sonra, aşağıda gösterildiği gibi daha fazla öneri görürsünüz:

f3c35d1539789acc.png

Diğer önerileri kabul etmek için Sekme tuşuna basın. Bu nedenle, app.rb dosyanız aşağıdaki gibi görünmelidir:

(İşlev adını add olarak değiştirin.)

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 uygulaması için giriş noktasını oluşturduk ve Gemini'ın kod önerisi özelliğini düzenleyicide nasıl kullanacağımızı öğrendik. Şimdi uygulamayı tekrar dağıtmayı deneyelim.

gcloud functions deploy calculator --runtime ruby32 --trigger-http --entry-point app --project PROJECT_ID

Her şey yolunda giderse dağıtım tamamlanır ve uygulamanızın barındırıldığı URL'yi görebilirsiniz. Harika, toplama sonucunu döndürmek için app.rb dosyasını biraz değiştirelim. Son app.rb dosyanız şu şekilde görünmelidir:

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. Uçtan Uca Test

URL'yi açın ve sorgu parametrelerini a ve b aşağıdaki gibi iletin:

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

Yanıtı "Result: 5" olarak görmeniz gerekir. Hesap makinesiyle yapılabilecek birçok işlem vardır. Bu uygulamayı, bu işlemleri de yapacak şekilde genişletebilir ve Gemini'dan yardım alabilirsiniz.

10. Sonuç

Bugün, Gemini'ın yardımıyla TDD yaklaşımını kullanarak Ruby uygulaması geliştirmenin nasıl yapılacağını gördük. Fark ettiğiniz gibi Gemini size farklı sonuçlar verebilir ancak en iyi bildiğiniz dil olmayabilir ancak kesinlikle geliştirme sürecini hızlandırmanıza yardımcı olabilir ve yine de öğrenme sürecinizi hızlandırmak için işlevler veya snippet'ler gösterebilir.

Tüm geliştiriciler ( deneyime bakılmaksızın) geliştirme süreçlerinde Gemini'dan yardım alabilir. Geliştirme için olmasa da Gemini'ı mevcut kodu açıklamak için kullanabilirsiniz. Ayrıca, mevcut kod için test oluşturmasını isteyebilirsiniz. Bu, en azından benim için en sıkıcı işlerden biridir 🙂

Gemini ile keyifli kodlamalar!