Codelab: Gemini untuk mempercepat pengembangan yang didorong oleh pengujian

1. Pengantar

Codelab ini memperkenalkan prinsip-prinsip Pengembangan Berdasarkan Pengujian ( TDD), di mana Anda menulis pengujian sebelum menerapkan kode. Kita akan membuat aplikasi kalkulator sederhana menggunakan Ruby yang menunjukkan pendekatan ini.

Anda juga akan mempelajari cara menggunakan Gemini sebagai asisten coding Anda. Gemini akan membantu mempercepat siklus TDD dengan membuat kasus pengujian, menyarankan penerapan kode, dan bahkan memberikan penjelasan kode.

Terakhir, Anda akan melihat cara men-deploy aplikasi kalkulator ke Cloud Function, platform serverless terkelola sepenuhnya dari Google, sehingga aplikasi Anda dapat diakses.

2. Prasyarat

  • Project Google Cloud dengan Penagihan diaktifkan
  • Browser web

Buat project Anda

Mengaktifkan Gemini API

  • Buka Marketplace Gemini untuk mengaktifkan API. Anda juga dapat menggunakan gcloud untuk mengaktifkan API:
gcloud services enable cloudaicompanion.googleapis.com --project PROJECT_ID

Aktifkan Cloud Functions API

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

Mengaktifkan Cloud Shell

  • Anda akan menggunakan Cloud Shell, lingkungan command line yang berjalan di Konsol Google Cloud yang telah dilengkapi dengan bahasa yang diperlukan. Dari Cloud Console, klik Activate Cloud Shell di pojok kanan atas:

6757b2fb50ddcc2d.png

  • Setelah terhubung ke Cloud Shell, Anda akan melihat bahwa Anda sudah diautentikasi dan project sudah ditetapkan ke project ID Anda. Jalankan perintah berikut di Cloud Shell untuk mengonfirmasi bahwa Anda telah diautentikasi:
gcloud auth list
  • Jalankan perintah berikut di Cloud Shell untuk mengonfirmasi bahwa perintah gcloud mengetahui project Anda:
gcloud config list project
  • Jika project Anda belum ditetapkan, gunakan perintah berikut untuk menetapkannya:
gcloud config set project <YOUR_PROJECT_ID>

Baca dokumentasi untuk mempelajari perintah gcloud dan penggunaannya.

Buka Editor

  • Untuk codelab ini, kita akan menggunakan editor Cloud bawaan. Di jendela Cloud Shell, klik tombol Open editor di pojok kanan atas. Tindakan ini akan membuka Editor VSCode untuk Anda.

e5a5e95d543db556.png

Menambahkan Ekstensi Ruby

  • Di menu samping kiri, klik ikon ekstensi 999939b067e1d0dc.png, tulis vscode ruby di kotak penelusuran, lalu instal ekstensi VSCode Ruby.

a6fd4e37b3d847d2.png

3. Pemanasan Gemini

LLM bersifat non-deterministik. Jadi, saat Anda mencoba perintah ini, respons yang Anda terima mungkin terlihat berbeda dengan yang ada di screenshot yang dilampirkan dalam codelab.

Pertama, mari kita tanyakan kepada Gemini apa itu TDD. Untuk mulai berbicara dengan Gemini di Cloud Shell Editor yang sama dengan kita, ikuti langkah-langkah berikut:

  • Di sisi kiri halaman, cari ikon Gemini 25fdcae4447d063c.png. Tindakan ini akan membuka jendela chat untuk Anda di sisi kiri.
  • Anda dapat mulai mengetik di kotak teks yang bertuliskan Enter a prompt here

5e09b0fb6a1b44dd.png

Perintah:

What is Test Driven Development?

Respons:

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

Bagian ini memberikan pengantar singkat tentang TDD dan manfaatnya.

Sekarang, mari kita tanya Gemini apa itu Ruby:

Perintah:

What is Ruby?

Respons:

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

Bagian ini menjelaskan apa itu Ruby dan manfaat menggunakan Ruby sebagai bahasa.

4. Penyiapan Project

Sekarang, mari kita mulai dengan membuat aplikasi Sinatra sederhana.

  • Mari buat folder kosong. Anda dapat memberinya nama apa pun. Kita akan menyebutnya gemini-tdd untuk codelab ini. Di editor cloud di sisi kiri pada tab Explorer, buat folder di bagian /home/<YOUR-USERNAME>/

d1d920b074cd7c79.png

  • Mari kita buka folder yang baru saja kita buat. Di menu paling kiri, klik ikon 1d080370a3ccad53.png, klik File -> Open Folder.
  • Mari buat file Ruby baru di folder root ini yang akan bertindak sebagai titik awal aplikasi. Anda dapat menamainya sesuai keinginan. Kita akan menyebutnya app.rb dalam codelab ini. 7beab8d21c59eee7.png
  • Mari kita tambahkan juga Gemfile di folder root. Sebaiknya tanyakan juga kepada Gemini tentang Gemfile.
  • Kita juga akan membuat file app_test.rb untuk menulis kasus pengujian.

5. Implementasi yang Didukung Gemini

Sekarang, mari kita mulai dengan memberikan beberapa konteks kepada Gemini tentang apa yang ingin kita lakukan dan memintanya untuk membuat kasus pengujian untuk hal yang sama. Salin perintah berikut di perintah chat Gemini.

Perintah:

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.

Respons:

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

Bagian ini memberi Anda contoh kasus pengujian untuk aplikasi Kalkulator, yaitu untuk menambahkan dua angka. Selain itu, dependensi minitest/autorun yang diperlukan untuk pengujian juga diimpor. Mari salin konten ke app_test.rb. Sekarang, mari kita coba jalankan pengujian ini; karena kita belum menulis kode apa pun, pengujian ini pasti akan gagal.

Mari kita tanya Gemini cara menjalankan pengujian ini.

Perintah:

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

Respons:

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.

Jadi, mari kita jalankan pengujian. Klik kanan app_test.rb di tab Explorer, lalu klik "Open in Integrated Terminal"

66b4bb9598c1feca.png

Pastikan Anda berada di folder yang sama dengan file app_test.rb, jika tidak, gunakan perintah cd untuk masuk ke sana. Di terminal, jalankan perintah yang ditampilkan oleh Gemini:

ruby app_test.rb

Anda akan mengalami error berikut:

NameError: uninitialized constant Calculator

Mari kita tanya Gemini cara memperbaikinya langsung dari editor. Klik ikon chat di panel navigasi editor Cloud Shell dan ajukan perintah di bawah:

Perintah:

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

Respons:

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 memberi tahu kita bahwa kita tidak memiliki class bernama Calculator dan kita perlu membuatnya. Kita juga telah diberi kode untuk membuat class Calculator. Mari kita gunakan kode ini. Buka app.rb dari tab Explorer dan salin kode yang diberikan oleh Gemini di dalamnya. Saat mengubah konten di app.rb, Anda mungkin mendapatkan beberapa saran dari Gemini sebagai pelengkapan otomatis; Anda harus menekan tab jika ingin menerimanya atau Esc jika tidak.

Sekarang, jalankan pengujian lagi. Ketik perintah berikut di terminal terintegrasi Anda:

ruby app_test.rb

Namun, Anda akan tetap mengalami error "NameError: uninitialized constant Calculator" yang sama. Mari kita tanya Gemini cara memperbaikinya.

6. TDD Iteratif dengan Gemini

Perintah:

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

Respons:

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

Respons yang diberikan mungkin sama atau tidak sama dengan di atas. Jadi, mari kita beri tahu Gemini secara eksplisit bahwa kita telah menentukan class Calculator di app.rb .

Perintah:

Calculator class is defined in app.rb already.

Respons:

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"

Kita mendapatkan respons dari Gemini untuk mengimpor app.rb tempat kita menentukan class Calculator. Terkadang perlu 2-3 iterasi perintah untuk mendapatkan respons yang tepat, tetapi seiring waktu, Anda akan terbiasa dan hasilnya akan lebih baik. Perhatikan bahwa Anda mungkin juga melihat require "./app" sebagai respons dari Gemini. Mari kita tambahkan ini ke app.rb di app_test.rb dan jalankan pengujian yang sama lagi.

Pastikan pada tahap ini app_test.rb Anda terlihat seperti ini:

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

Jalankan perintah di bawah ini dari Terminal Cloud Shell dalam folder project:

ruby app_test.rb

Jika semuanya berjalan lancar, pengujian akan berhasil. Jadi, kami mengembangkan aplikasi Ruby yang sangat sederhana menggunakan pendekatan TDD dan kami meminta bantuan Gemini. Respons perintah tidak akan selalu sama dan hal ini merupakan sifat model LLM. Anda mungkin mendapatkan lebih banyak operasi Kalkulator dari Gemini, tetapi secara keseluruhan, proses yang baru saja kita lakukan akan berfungsi.

7. Men-deploy aplikasi ke Cloud Functions

Sekarang, mari minta Gemini untuk men-deploy ini ke Cloud Function:

Perintah:

Let's deploy this app to Cloud Functions

Respons:

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 menjelaskan cara men-deploy-nya secara manual menggunakan UI Cloud Functions. Tapi saya tidak ingin melakukan itu. Mari minta Gemini untuk memberi kita perintah gcloud yang dapat saya jalankan langsung dari terminal terintegrasi.

Perintah:

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

Respons:

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

Mari kita jalankan perintah gcloud yang diberikan oleh Gemini di terminal.

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

Anda akan mengalami error berikut:

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

Mari kita minta bantuan Gemini untuk memperbaiki error tersebut.

Perintah:

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

Respons:

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

Mari jalankan bundle install di terminal yang akan membuat Gemfile.lock . Setelah menjalankan perintah, periksa tab explorer, Anda akan dapat melihat Gemfile.lock .

Mari kita coba men-deploy ke Cloud Functions lagi. Jalankan perintah deploy yang sama di terminal:

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

Anda akan mengalami error berikut:

"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. Functions Framework untuk Ruby

Mari kita tanyakan error tersebut kepada Gemini:

Perintah:

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

Respons:

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

Jadi, pada dasarnya, kita kehilangan gem functions_framework di aplikasi. Mari kita tambahkan baris ini di Gemfile:

gem "functions_framework"

Sekarang jalankan bundle install di terminal. Anda mungkin atau mungkin tidak mengalami error yang menyatakan "No explicit global resource in Gemfile" . Jika Anda mengalami masalah ini, pastikan untuk menyertakan hal berikut sebagai baris pertama Gemfile Anda:

source "https://rubygems.org"

Kemudian, jalankan bundle install dari terminal lagi. Sekarang, jalankan perintah deploy lagi:

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

Anda akan mengalami error berikut sekarang:

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

Untuk mengatasinya, coba fitur Generate Code Gemini. Mari buka app.rb dari tab Explorer, tempat kita sudah memiliki kode aplikasi Kalkulator. Di app.rb, pada baris pertama, mulai ketik FunctionsFramework , lalu ketik ".". Anda akan melihat beberapa saran dalam teks berwarna abu-abu :

9e17476a4a586433.png

Tekan tab untuk menerima saran. Setelah diterima, Anda akan melihat lebih banyak saran seperti yang ditunjukkan di bawah:

f3c35d1539789acc.png

Tekan tab untuk menerima saran lebih lanjut. Jadi, app.rb Anda akan terlihat seperti ini:

( Ganti nama fungsi dari add menjadi 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

Kita baru saja membuat titik entri untuk aplikasi Cloud Functions dan juga mempelajari cara menggunakan saran kode Gemini di editor. Sekarang, coba deploy aplikasi lagi.

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

Jika semuanya berjalan lancar, deployment akan berhasil dan Anda akan dapat melihat URL tempat aplikasi Anda dihosting. Oke, mari kita ubah app.rb sedikit untuk menampilkan hasil penjumlahan. File app.rb akhir Anda akan terlihat seperti ini:

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. Pengujian End-to-End

Buka URL dan teruskan parameter kueri a dan b seperti yang ditunjukkan di bawah:

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

Anda akan dapat melihat respons sebagai : "Result: 5". Ada banyak operasi yang dilakukan Kalkulator. Anda dapat memperluas aplikasi ini untuk melakukan hal tersebut dan meminta bantuan Gemini.

10. Kesimpulan

Kita telah melihat cara mengembangkan aplikasi Ruby hari ini menggunakan pendekatan TDD dengan bantuan Gemini. Seperti yang Anda perhatikan, Gemini dapat memberikan hasil yang berbeda, tetapi pasti dapat membantu mempercepat proses pengembangan dalam bahasa yang mungkin tidak terlalu Anda kuasai, dan tetap menampilkan fungsi atau cuplikan untuk mempercepat proses pembelajaran Anda.

Setiap developer ( terlepas dari pengalamannya) dapat meminta bantuan dari Gemini untuk proses pengembangan mereka. Jika tidak untuk pengembangan, Anda dapat menggunakan Gemini untuk menjelaskan kode yang ada, Anda dapat memintanya untuk membuat pengujian untuk kode yang ada yang setidaknya merupakan pekerjaan yang paling membosankan bagi saya 🙂

Selamat membuat kode dengan Gemini!