Codelab: Gemini untuk mempercepat pengembangan yang didorong oleh pengujian

1. Pengantar

Codelab ini memperkenalkan prinsip Pengembangan Berdasarkan Pengujian ( TDD), tempat Anda menulis pengujian sebelum menerapkan kode. Kita akan membangun aplikasi kalkulator sederhana menggunakan Ruby yang menampilkan pendekatan ini.

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

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

2. Prasyarat

  • Project Google Cloud dengan Penagihan diaktifkan
  • {i>Browser<i} internet

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 dan 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. Langkah ini akan membuka Editor VSCode untuk Anda.

e5a5e95d543db556.png

Menambahkan Ekstensi Ruby

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

a6fd4e37b3d847d2.png

3. Pemanasan Gemini

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

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

  • Di sebelah kiri halaman, cari ikon Gemini 25fdcae4447d063c.pngS, dan jendela percakapan di sebelah kiri akan terbuka.
  • Anda dapat mulai mengetik di kotak teks yang bertuliskan Enter a prompt here

5e09b0fb6a1b44dd.pngS

Lirik:

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

Ini memberi Anda pengantar singkat tentang TDD dan manfaatnya.

Sekarang mari kita tanyakan kepada Gemini apa itu Ruby:

Lirik:

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

Ini menjelaskan apa itu Ruby dan apa manfaat menggunakan Ruby sebagai bahasa.

4. Penyiapan Project

Sekarang mari kita mulai dengan membuat aplikasi Sinatra sederhana.

  • Mari kita buat folder kosong. Anda bisa menamainya sesuai keinginan. Kita akan menyebutnya gemini-tdd untuk codelab ini. Di editor cloud di sisi kiri pada tab Penjelajah, buat folder di bagian /home/<YOUR-USERNAME>/

d1d920b074cd7c79.png

  • Mari kita buka {i>folder<i} yang baru saja kita buat. Di menu paling kiri, klik ikon 1d080370a3ccad53.pngS, klik File -> Buka Folder.
  • Mari kita buat file Ruby baru di folder {i>root<i} ini yang akan bertindak sebagai titik awal untuk aplikasi, Anda dapat menamainya apa pun yang Anda inginkan. Kita akan menyebutnya app.rb di codelab ini. 7beab8d21c59eee7.pngS
  • Mari tambahkan juga Gemfile di folder root. Sebaiknya Anda juga bertanya kepada Gemini tentang Gemfile.
  • Kita juga akan membuat file app_test.rb untuk menulis kasus pengujian.

5. Penerapan Berbasis Gemini

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

Lirik:

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

Aplikasi ini memberi Anda contoh kasus pengujian untuk aplikasi Kalkulator, yaitu untuk menambahkan dua angka. Library ini juga mengimpor dependensi minitest/autorun yang diperlukan untuk pengujian. Mari salin konten ke app_test.rb. Mari kita coba dan jalankan pengujian ini sekarang; karena kita tidak memiliki kode apa pun, itu akan gagal.

Mari kita tanyakan kepada Gemini cara menjalankan pengujian ini.

Lirik:

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.

Mari kita lanjutkan dan jalankan pengujian. Klik kanan app_test.rb di tab Explorer dan klik "Open in Integrated Terminal"

66b4bb9598c1feca.pngS

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

ruby app_test.rb

Anda akan mengalami error berikut:

NameError: uninitialized constant Calculator

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

Lirik:

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 bahwa kita tidak memiliki class yang disebut Calculator dan kita perlu membuatnya. Kode ini juga telah memberi kita kode untuk membuat class Calculator. Mari kita lanjutkan dan gunakan kode ini. Buka app.rb dari tab Penjelajah dan salin kode yang diberikan Gemini di dalamnya. Saat Anda memodifikasi 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, mari kita jalankan pengujian lagi. Ketik perintah berikut di terminal terintegrasi:

ruby app_test.rb

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

6. TDD iteratif dengan Gemini

Lirik:

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

Tanggapan tersebut memberi kami beberapa respons, mungkin sama atau tidak sama dengan yang di atas. Jadi, beri tahu Gemini secara eksplisit bahwa kita memiliki class Calculator yang ditentukan di app.rb .

Lirik:

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"

Kami mendapatkan respons dari Gemini untuk mengimpor app.rb tempat class Calculator sudah ditentukan. Kadang-kadang mungkin diperlukan 2-3 iterasi perintah untuk mendapatkan respons yang tepat, tetapi saat Anda memahaminya, responsnya akan menjadi lebih baik. Perlu diketahui bahwa Anda mungkin juga melihat pesan memerlukan "./app" sebagai respons dari Gemini. Mari kita tambahkan ini ke app.rb di app_test.rb dan jalankan kembali pengujian yang sama.

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 dari Terminal Cloud Shell dalam folder project:

ruby app_test.rb

Jika semuanya berjalan dengan baik, pengujian tersebut akan lulus. Jadi, kami mengembangkan aplikasi Ruby yang sangat sederhana menggunakan pendekatan TDD, dan kami meminta bantuan dari Gemini. Respons perintah tidak akan selalu sama, dan itu seperti yang biasa terjadi pada model LLM. Anda mungkin mendapatkan lebih banyak operasi Kalkulator dari Gemini, tetapi secara keseluruhan proses yang sama seperti yang baru saja kita lakukan, seharusnya akan berfungsi.

7. Men-deploy aplikasi ke Cloud Functions

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

Lirik:

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 aku tidak mau melakukan itu. Mari kita minta Gemini untuk memberi kita perintah gcloud yang dapat saya jalankan langsung dari terminal yang terintegrasi.

Lirik:

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 minta bantuan dari Gemini untuk memperbaiki error tersebut.

Lirik:

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 kita 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 lainnya:

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

Mari kita tanyakan error tersebut pada Gemini:

Lirik:

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 intinya, kita kehilangan permata functions_framework di aplikasi kita. Mari kita lanjutkan dan tambahkan baris berikut di Gemfile kita:

gem "functions_framework"

Sekarang jalankan bundle install di terminal. Anda mungkin mengalami atau tidak menemukan pesan error "Tidak ada resource global eksplisit dalam Gemfile" kami. Jika Anda mengalaminya, pastikan memiliki baris berikut sebagai baris pertama Gemfile Anda:

source "https://rubygems.org"

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

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

Sekarang Anda akan mengalami error berikut:

"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 mengatasi hal ini, mari coba fitur Generate Code di Gemini. Mari kita buka app.rb dari tab Explorer, tempat kita sudah memiliki kode aplikasi Calculator. Di app.rb, di baris pertama, mulai ketik FunctionsFramework , lalu ketik ".". Anda akan melihat beberapa saran dalam teks abu-abu :

9e17476a4a586433.png

Tekan tab untuk menerima saran. Setelah disetujui, Anda akan melihat saran lainnya seperti yang ditampilkan di bawah ini:

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, mari coba men-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. Keren, mari kita ubah sedikit app.rb untuk menampilkan hasil penambahan. App.rb final 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 Menyeluruh

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

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 melakukannya juga dan meminta bantuan Gemini untuk itu.

10. Kesimpulan

Saat ini, kita melihat cara mengembangkan aplikasi Ruby menggunakan pendekatan TDD dengan bantuan Gemini. Seperti yang Anda perhatikan, Gemini mungkin memberikan hasil yang berbeda, tetapi Gemini dapat membantu mempercepat proses pengembangan dalam bahasa yang mungkin tidak Anda pahami, dan tetap menampilkan fungsi atau cuplikan untuk mempercepat proses pengembangan.

Semua developer ( apa pun pengalamannya) dapat meminta bantuan Gemini untuk proses pengembangannya. Jika bukan untuk pengembangan, Anda bisa menggunakan Gemini untuk menjelaskan kode yang sudah ada, Anda bisa memintanya membuat pengujian untuk kode yang ada yang setidaknya paling membosankan bagi saya 🙂

Selamat membuat kode dengan Gemini!