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

1. Giriş

Bu codelab'de, kodu uygulamadan önce test yazdığınız Test Driven Development (TDD) (TDD) ilkeleri açıklanmaktadır. Bu yaklaşımı gösteren Ruby'yi kullanarak basit bir hesap makinesi uygulaması geliştireceğiz.

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

Son olarak, hesap makinesi uygulamasını Google'ın tümüyle yönetilen, sunucusuz platformu olan Cloud Function'a dağıtarak uygulamanızı erişilebilir hale getirmeyi öğreneceksiniz.

2. Ön koşullar

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

Projenizi oluşturun

Gemini API'yi etkinleştirme

  • API'yi etkinleştirmek için Gemini Marketplace'e gidin. gcloud'u API'yi etkinleştirmek için de 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

  • Google Cloud Console'da çalışan ve gerekli dillerin yüklü olduğu önceden yüklenmiş 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 zaten doğrulandığını ve projenin proje kimliğinize ayarlandığını göreceksiniz. Kimliğinizin doğrulandığını onaylamak için Cloud Shell'de aşağıdaki komutu çalıştırın:
gcloud auth list
  • gcloud komutunun projenizi bildiğini onaylamak için Cloud Shell'de aşağıdaki komutu çalıştırın:
gcloud config list project
  • Projeniz ayarlanmadıysa 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üzenleyiciyi kullanacağız. Cloud Shell penceresinde, sağ üst köşedeki Düzenleyiciyi aç düğmesini tıklayın. Bu işlem sonucunda sizin için bir VSCode Düzenleyici açılır.

e5a5e95d543db556.png

Ruby Uzantısını Ekle

  • Sol taraftaki 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 ısınma

LLM'ler deterministik değildir. Bu nedenle, bu istemleri denerken aldığınız yanıt, codelab'de ekli ekran görüntülerindekilerden farklı görünebilir.

Önce Gemini'a TDD'nin ne olduğunu soralım. Bulunduğunuz Cloud Shell Düzenleyici'de Gemini ile sohbete başlamak için aşağıdaki adımları uygulayın:

  • Sayfanın sol tarafında Gemini simgesini 25fdcae4447d063c.png bulun. Bu işlem, 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.
....

TDD'ye ve avantajlarına dair kısa bir tanıtım sunar.

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

Bu rehberde, Ruby'nin ne olduğu ve Ruby'yi dil olarak kullanmanın avantajları açıklanmaktadır.

4. Proje Ayarları

Basit bir Sinatra uygulaması oluşturarak başlayalım.

  • Boş bir klasör oluşturalım. Onu istediğiniz gibi adlandırabilirsiniz. Bu codelab'de gemini-tdd olarak adlandıracağız. Sol taraftaki Gezgin sekmesinin altında bulunan bulut düzenleyicide, /home/<YOUR-USERNAME>/ altında klasör oluşturun

d1d920b074cd7c79.png

  • Yeni oluşturduğumuz klasörü açalım. En soldaki menüden 1d080370a3ccad53.png simgesini, ardından Dosya ->'ı tıklayın. Klasörü Açın.
  • Bu kök klasörde, uygulama için başlangıç noktası görevi görecek yeni bir Ruby dosyası oluşturalım. Dosyayı istediğiniz gibi adlandırabilirsiniz. Bu codelab'de app.rb olarak adlandıracağız. 7beab8d21c59eee7.png
  • Ayrıca kök klasöre bir Gemfile ekleyelim. Gemini'a Gemfile hakkında soru da sorabilirsiniz.
  • Ayrıca, test durumlarımızı yazmak için bir app_test.rb dosyası oluşturacağız.

5. Gemini Odaklı Uygulama

Şimdi, Gemini'a ne yapmaya çalıştığımız konusunda biraz bilgi vererek ondan da bunun için test senaryoları oluşturmasını isteyerek başlayalım. Gemini sohbet istemindeki 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ı toplama işlemi) sağlar. Ayrıca, testler için zorunlu olan minitest/autorun bağımlılığını da içe aktarmıştır. İçeriği app_test.rb hedefine kopyalayalım. Şimdi bu testi çalıştırmayı deneyelim; elimizde herhangi bir kod yazılmadığı için, kesinlikle başarısız olacaktır.

Gemini'a bu testin nasıl yapılacağını 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.

Şimdi devam edelim ve testi yapalım. Gezgin sekmesinde app_test.rb öğesini sağ tıklayın ve "Entegre Terminal'de Aç"ı tıklayın.

66b4bb9598c1feca.png

app_test.rb dosyasıyla aynı klasörde olduğunuzdan emin olun. Aksi takdirde bu klasöre gitmek için cd komutunu kullanın. Terminalde Gemini tarafından döndürülen komutu çalıştırın:

ruby app_test.rb

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

NameError: uninitialized constant Calculator

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

İ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 adında bir sınıfınız olmadığını ve bir sınıf oluşturmamız gerektiğini söylüyor. Ayrıca, Calculator sınıfını oluşturmak için gereken kodu da sağladı. Şimdi bu kodu kullanalım. Gezgin sekmesinden app.rb uygulamasını açın ve Gemini'ın verdiği kodu kopyalayın. app.rb'deki içeriği değiştirirken Gemini'dan otomatik tamamlama önerileri alabilirsiniz. teklifi kabul etmek istiyorsanız tab, kabul etmiyorsanız Esc tuşuna basmanız gerekir.

Şimdi testi tekrar yapalım. Entegre terminalinize aşağıdaki komutu yazın:

ruby app_test.rb

Ancak aynı "NameError: uninitialized constant Calculator" hatasıyla karşılaşırsınız. Gemini'a bu sorunun nasıl düzeltileceğini 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
....

Bize biraz yanıt verildi ancak yukarıdakiyle aynı olabilir veya olmayabilir. Gemini'a Hesap Makinesi sınıfının app.rb tarafından 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"

Gemini'dan, Hesap Makinesi sınıfının tanımlandığı app.rb'yi içe aktarmamız için yanıtı aldık. Bazen doğru yanıtı almak için istemleri 2-3 kez tekrarlamanız gerekebilir, ancak kavradıkça daha iyi hale gelecektir. Gemini'ın yanıtında "./app" ifadesini zorunlu kıl seçeneğini de görebilirsiniz. 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 Terminal'den aşağıdaki komutu çalıştırın:

ruby app_test.rb

Her şey yolunda giderse test başarılı olacaktır. Biz de 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 ve bu, LLM modellerinin yapısı gereğidir. Gemini'da Hesap Makinesi'ni daha fazla işlem yapabilirsiniz, ancak az önce izlediğimiz süreç genel olarak işe yarayacaktır.

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

Şimdi Gemini'dan bunu Cloud Functions işlevine 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 bu hizmetin manuel olarak nasıl dağıtılacağını açıklıyor. Ama bunu yapmak istemiyorum. Gemini'dan bize entegre terminalden ç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

Terminalde Gemini'ın verdiği gcloud komutunu çalıştıralım.

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

Şu hatayla karşılaşacaksı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 Gemfile.lock oluşturacak bundle install çalıştıralım . Komutu çalıştırdıktan sonra gezgin sekmesini kontrol edin. Gemfile.lock görünür.

Cloud Functions'a dağıtımı 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 başka bir hatayla karşılaşırsınız:

"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 İşlevler Çerçevesi

Gemini'a hatayı soralım:

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

Temelde uygulamamızda Functions_framework gem'i eksik. Devam edelim ve şu satırı Gemfile'ımıza ekleyelim:

gem "functions_framework"

Şimdi terminalde bundle install komutunu çalıştırın. "Gemfile'da açık bir genel kaynak yok" hatasını veren bir hata mesajı görebilir veya almayabilirsiniz , Bu sorunla karşılaşırsanız Gem dosyanızın ilk satırında aşağıdakilerin bulunduğundan 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

Bu aşamada aşağıdaki hatayla karşılaşacaksı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. Hesap Makinesi uygulama kodunun bulunduğu Gezgin sekmesinden app.rb'yi açalım. app.rb'nin ilk satırına FunctionsFramework yazıp "." yazın. Gri renkte bazı öneriler görürsünüz :

9e17476a4a586433.png

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

f3c35d1539789acc.png

Diğer önerileri kabul etmek için sekme tuşuna basın. App.rb'niz aşağıdaki gibi görünmelidir:

( add olan işlev adını app olarak yeniden adlandırın)

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

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

Her şey yolunda giderse dağıtım gerçekleşebilir ve uygulamanızın barındırıldığı URL'yi görebilirsiniz. Harika, ekleme 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 a ve b sorgu parametrelerini aşağıda gösterildiği gibi iletin:

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

Yanıtı şu şekilde görebilirsiniz : "Result: 5". Hesap Makinesi'nin yaptığı birçok işlem vardır. Siz de bu uygulamaları gerçekleştirecek şekilde bu uygulamanın kapsamını genişletebilir ve bu konuda Gemini'dan yardım alabilirsiniz.

10. Sonuç

Bugün Gemini'ın yardımıyla TDD yaklaşımını kullanarak nasıl bir Ruby uygulaması geliştireceğimizi gördük. Fark ettiğiniz gibi Gemini, size farklı sonuçlar verebilir ancak hiç bilmediğiniz bir dilde geliştirme sürecini hızlandırmaya kesinlikle yardımcı olabilir ve öğrenme eğrinizi hızlandıracak işlevler veya snippet'ler göstermeye devam eder.

Herhangi bir geliştirici ( deneyimi ne olursa olsun) geliştirme sürecinde Gemini'dan yardım alabilir. Geliştirmek istemiyorsanız mevcut kodu açıklamak için Gemini'ı kullanabilir, mevcut kod için testler oluşturmasını isteyebilirsiniz. Bu, en azından benim için en sıkıcı olan iştir 🙂

Gemini ile keyifli kodlamalar!