Lớp học lập trình: Gemini giúp tăng tốc độ phát triển dựa trên thử nghiệm

1. Giới thiệu

Lớp học lập trình này giới thiệu các nguyên tắc của Phát triển hướng kiểm thử ( TDD), trong đó bạn viết các bài kiểm thử trước khi triển khai mã. Chúng ta sẽ tạo một ứng dụng máy tính đơn giản bằng Ruby để minh hoạ phương pháp này.

Bạn cũng sẽ tìm hiểu cách sử dụng Gemini làm trợ lý lập trình. Gemini sẽ giúp đẩy nhanh chu kỳ TDD bằng cách tạo các trường hợp kiểm thử, đề xuất việc triển khai mã và thậm chí giải thích mã.

Cuối cùng, bạn sẽ thấy cách triển khai ứng dụng máy tính vào Cloud Functions, nền tảng hoàn toàn không máy chủ do Google quản lý, giúp ứng dụng của bạn có thể truy cập được.

2. Điều kiện tiên quyết

  • Một Dự án trên Google Cloud đã bật tính năng Thanh toán
  • Trình duyệt web

Tạo dự án

Bật Gemini API

  • Chuyển đến Gemini Marketplace để bật API. Bạn cũng có thể dùng gcloud để bật API:
gcloud services enable cloudaicompanion.googleapis.com --project PROJECT_ID

Bật Cloud Functions API

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

Kích hoạt Cloud Shell

  • Bạn sẽ sử dụng Cloud Shell, một môi trường dòng lệnh chạy trong Google Cloud Console và được cài sẵn các ngôn ngữ cần thiết. Trong Cloud Console, hãy nhấp vào Kích hoạt Cloud Shell ở góc trên cùng bên phải:

6757b2fb50ddcc2d.png

  • Sau khi kết nối với Cloud Shell, bạn sẽ thấy rằng mình đã được xác thực và dự án được đặt thành mã dự án của bạn. Chạy lệnh sau trong Cloud Shell để xác nhận rằng bạn đã được xác thực:
gcloud auth list
  • Chạy lệnh sau trong Cloud Shell để xác nhận rằng lệnh gcloud biết về dự án của bạn:
gcloud config list project
  • Nếu bạn chưa đặt dự án, hãy dùng lệnh sau để đặt:
gcloud config set project <YOUR_PROJECT_ID>

Tham khảo tài liệu để biết các lệnh và cách sử dụng gcloud.

Mở trình chỉnh sửa

  • Trong lớp học lập trình này, chúng ta sẽ sử dụng trình chỉnh sửa Cloud tích hợp. Trong cửa sổ Cloud Shell, hãy nhấp vào nút Open editor (Mở trình chỉnh sửa) ở góc trên cùng bên phải. Thao tác này sẽ mở Trình chỉnh sửa VSCode cho bạn.

e5a5e95d543db556.png

Thêm tiện ích Ruby

  • Trên trình đơn bên trái, hãy nhấp vào biểu tượng phần mở rộng 999939b067e1d0dc.png, viết vscode ruby vào thanh tìm kiếm rồi cài đặt phần mở rộng VSCode Ruby.

a6fd4e37b3d847d2.png

3. Gemini Warm-Up

LLM không xác định. Vì vậy, trong khi bạn thử các câu lệnh này, câu trả lời mà bạn nhận được có thể khác với câu trả lời trong ảnh chụp màn hình được đính kèm trong lớp học lập trình.

Trước tiên, hãy hỏi Gemini TDD là gì. Để bắt đầu trò chuyện với Gemini trong cùng một Cloud Shell Editor mà chúng ta đang sử dụng, hãy làm theo các bước sau:

  • Ở phía bên trái của trang, hãy tìm biểu tượng Gemini 25fdcae4447d063c.png. Biểu tượng này sẽ mở cửa sổ trò chuyện cho bạn ở phía bên trái.
  • Bạn có thể bắt đầu nhập vào hộp văn bản có nội dung Enter a prompt here

5e09b0fb6a1b44dd.png

Câu lệnh:

What is Test Driven Development?

Phản hồi:

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

Nội dung này giới thiệu ngắn gọn về TDD và lợi ích của TDD.

Bây giờ, hãy hỏi Gemini xem Ruby là gì:

Câu lệnh:

What is Ruby?

Phản hồi:

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

Bài viết này giải thích Ruby là gì và những lợi ích khi sử dụng Ruby làm ngôn ngữ.

4. Thiết lập dự án

Bây giờ, hãy bắt đầu bằng cách tạo một ứng dụng Sinatra đơn giản.

  • Hãy tạo một thư mục trống. Bạn có thể đặt tên cho nhóm theo ý muốn. Chúng ta sẽ gọi nó là gemini-tdd cho lớp học lập trình này. Trong trình chỉnh sửa trên đám mây ở bên trái, trong thẻ Trình khám phá, hãy tạo thư mục trong /home/<YOUR-USERNAME>/

d1d920b074cd7c79.png

  • Hãy mở thư mục mà chúng ta vừa tạo. Trên trình đơn bên trái, hãy nhấp vào biểu tượng 1d080370a3ccad53.png, nhấp vào Tệp -> Mở thư mục.
  • Hãy tạo một tệp Ruby mới trong thư mục gốc này. Tệp này sẽ đóng vai trò là điểm xuất phát cho ứng dụng. Bạn có thể đặt tên cho tệp này tuỳ ý. Chúng ta sẽ gọi nó là app.rb trong lớp học lập trình này. 7beab8d21c59eee7.png
  • Hãy thêm một Gemfile vào thư mục gốc. Bạn cũng nên hỏi Gemini về Gemfile.
  • Chúng ta cũng sẽ tạo một tệp app_test.rb để ghi các trường hợp kiểm thử.

5. Triển khai dựa trên Gemini

Bây giờ, hãy bắt đầu bằng cách cung cấp cho Gemini một số thông tin về việc chúng ta đang cố gắng làm gì và yêu cầu Gemini tạo các trường hợp kiểm thử cho thông tin đó. Sao chép câu lệnh sau vào cuộc trò chuyện với Gemini.

Câu lệnh:

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.

Phản hồi:

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

Nó cung cấp cho bạn một trường hợp kiểm thử mẫu cho ứng dụng Máy tính, tức là để cộng hai số. Thao tác này cũng nhập phần phụ thuộc bắt buộc minitest/autorun cho các kiểm thử. Hãy sao chép nội dung vào app_test.rb. Hãy thử chạy kiểm thử này ngay bây giờ; vì chúng ta chưa viết mã nào nên chắc chắn kiểm thử sẽ thất bại.

Hãy hỏi Gemini cách chạy thử nghiệm này.

Câu lệnh:

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

Phản hồi:

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.

Vậy hãy tiến hành chạy kiểm thử. Nhấp chuột phải vào app_test.rb trong thẻ Explorer (Trình khám phá) rồi nhấp vào "Open in Integrated Terminal" (Mở trong thiết bị đầu cuối tích hợp)

66b4bb9598c1feca.png

Đảm bảo bạn đang ở cùng thư mục với tệp app_test.rb. Nếu không, hãy dùng lệnh cd để chuyển đến thư mục đó. Trong dòng lệnh, hãy chạy lệnh do Gemini trả về:

ruby app_test.rb

Bạn sẽ gặp phải lỗi sau:

NameError: uninitialized constant Calculator

Hãy hỏi Gemini cách khắc phục ngay trong trình chỉnh sửa. Nhấp vào biểu tượng trò chuyện trong ngăn điều hướng của trình chỉnh sửa Cloud Shell và đặt câu hỏi sau:

Câu lệnh:

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

Phản hồi:

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 cho biết chúng ta không có lớp nào có tên là Calculator và chúng ta cần tạo một lớp. Công cụ này cũng cung cấp cho chúng ta mã để tạo lớp Calculator. Hãy tiếp tục và sử dụng mã này. Mở app.rb trong thẻ Explorer (Trình khám phá) rồi sao chép mã do Gemini cung cấp vào đó. Trong khi sửa đổi nội dung trong app.rb, bạn có thể nhận được một số đề xuất từ Gemini dưới dạng tính năng tự động hoàn thành; bạn cần nhấn tab nếu muốn chấp nhận hoặc Esc nếu không.

Bây giờ, hãy chạy lại quy trình kiểm thử. Nhập lệnh sau vào cửa sổ dòng lệnh tích hợp:

ruby app_test.rb

Tuy nhiên, bạn vẫn sẽ gặp phải lỗi "NameError: uninitialized constant Calculator" tương tự. Hãy hỏi Gemini cách khắc phục lỗi này.

6. TDD lặp lại với Gemini

Câu lệnh:

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

Phản hồi:

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

Nó đưa ra một số phản hồi, có thể giống hoặc không giống như ở trên. Vì vậy, hãy nói rõ với Gemini rằng chúng ta đã xác định lớp Calculator trong app.rb .

Câu lệnh:

Calculator class is defined in app.rb already.

Phản hồi:

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"

Chúng ta nhận được câu trả lời từ Gemini để nhập app.rb, nơi chúng ta đã xác định lớp Calculator. Đôi khi, bạn có thể phải đưa ra câu lệnh 2-3 lần mới nhận được câu trả lời phù hợp, nhưng khi bạn đã quen, kết quả sẽ tốt hơn. Xin lưu ý rằng bạn cũng có thể thấy require "./app" trong câu trả lời của Gemini. Hãy thêm đoạn mã này vào app.rb trong app_test.rb và chạy lại cùng một kiểm thử.

Vui lòng đảm bảo rằng tại thời điểm này, app_test.rb của bạn có dạng như sau:

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

Chạy lệnh bên dưới từ Cloud Shell Terminal trong thư mục dự án:

ruby app_test.rb

Nếu mọi thứ diễn ra suôn sẻ, thì kiểm thử sẽ đạt. Vì vậy, chúng tôi đã phát triển một ứng dụng Ruby rất đơn giản bằng cách sử dụng phương pháp TDD và nhờ Gemini trợ giúp. Câu trả lời cho câu lệnh không phải lúc nào cũng giống nhau và đó là bản chất của các mô hình LLM. Bạn có thể nhận được nhiều thao tác hơn của Máy tính từ Gemini, nhưng nhìn chung, quy trình mà chúng ta vừa thực hiện sẽ vẫn hoạt động.

7. Triển khai ứng dụng lên Cloud Functions

Bây giờ, hãy yêu cầu Gemini triển khai hàm này vào Cloud Functions:

Câu lệnh:

Let's deploy this app to Cloud Functions

Phản hồi:

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 giải thích cách triển khai theo cách thủ công bằng cách sử dụng giao diện người dùng Cloud Functions. Nhưng tôi không muốn làm điều đó. Hãy yêu cầu Gemini cung cấp cho chúng ta lệnh gcloud mà tôi có thể chạy ngay từ thiết bị đầu cuối tích hợp.

Câu lệnh:

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

Phản hồi:

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

Hãy thực thi lệnh gcloud do Gemini cung cấp trong dòng lệnh.

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

Bạn sẽ gặp phải lỗi sau:

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

Hãy nhờ Gemini trợ giúp để khắc phục lỗi này.

Câu lệnh:

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

Phản hồi:

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

Hãy chạy bundle install trong thiết bị đầu cuối để tạo Gemfile.lock . Sau khi chạy lệnh, hãy kiểm tra thẻ trình khám phá, bạn sẽ thấy Gemfile.lock .

Hãy thử triển khai lại vào Cloud Functions. Thực thi cùng một lệnh triển khai trong thiết bị đầu cuối:

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

Bạn sẽ gặp phải một lỗi khác như sau:

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

Hãy hỏi Gemini về lỗi này:

Câu lệnh:

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

Phản hồi:

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

Về cơ bản, chúng ta đang thiếu gem functions_framework trong ứng dụng. Hãy thêm dòng này vào Gemfile:

gem "functions_framework"

Bây giờ, hãy chạy bundle install trong dòng lệnh. Bạn có thể gặp hoặc không gặp lỗi "No explicit global resource in Gemfile" (Không có tài nguyên chung rõ ràng trong Gemfile). Nếu gặp phải trường hợp này, hãy đảm bảo rằng bạn có dòng sau đây làm dòng đầu tiên trong Gemfile:

source "https://rubygems.org"

Sau đó, hãy chạy lại bundle install từ thiết bị đầu cuối. Bây giờ, hãy chạy lại lệnh triển khai:

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

Bây giờ, bạn sẽ gặp phải lỗi sau:

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

Để giải quyết vấn đề này, hãy thử tính năng Generate Code của Gemini. Hãy mở app.rb trong thẻ Explorer (Trình khám phá), nơi chúng ta đã có mã của ứng dụng Calculator (Máy tính). Trong app.rb, ở dòng đầu tiên, hãy bắt đầu nhập FunctionsFramework , rồi nhập ".". Bạn sẽ thấy một số đề xuất bằng văn bản màu xám :

9e17476a4a586433.png

Nhấn phím tab để chấp nhận nội dung đề xuất. Sau khi chấp nhận, bạn sẽ thấy nhiều đề xuất hơn như hình dưới đây:

f3c35d1539789acc.png

Nhấn phím Tab để chấp nhận các đề xuất khác. Vì vậy, app.rb của bạn sẽ có dạng như sau:

( Đổi tên hàm từ add thành 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

Chúng ta vừa tạo điểm truy cập cho ứng dụng Cloud Functions và cũng đã tìm hiểu cách sử dụng tính năng đề xuất mã của Gemini trong trình chỉnh sửa. Bây giờ, hãy thử triển khai lại ứng dụng.

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

Và nếu mọi thứ diễn ra suôn sẻ, quá trình triển khai sẽ diễn ra và bạn sẽ thấy URL nơi ứng dụng của mình được lưu trữ. Tuyệt vời, hãy sửa đổi app.rb một chút để trả về kết quả cộng. Tệp app.rb cuối cùng của bạn sẽ có dạng như sau:

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. Kiểm thử toàn diện

Mở URL và truyền các tham số truy vấn ab như minh hoạ bên dưới:

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

Bạn sẽ thấy phản hồi như sau : "Result: 5". Máy tính có thể thực hiện nhiều thao tác. Bạn có thể mở rộng ứng dụng này để thực hiện những việc đó và nhờ Gemini trợ giúp.

10. Kết luận

Hôm nay, chúng ta đã thấy cách phát triển một ứng dụng Ruby bằng phương pháp TDD với sự trợ giúp của Gemini. Như bạn nhận thấy, Gemini có thể đưa ra nhiều kết quả khác nhau nhưng chắc chắn có thể giúp đẩy nhanh quá trình phát triển bằng một ngôn ngữ mà bạn có thể không quen thuộc nhất, đồng thời vẫn cho bạn thấy các hàm hoặc đoạn mã để đẩy nhanh quá trình học tập.

Mọi nhà phát triển ( bất kể kinh nghiệm) đều có thể nhờ Gemini trợ giúp trong quá trình phát triển. Nếu không phải để phát triển, bạn có thể dùng Gemini để giải thích mã hiện có, bạn có thể yêu cầu Gemini tạo các bài kiểm thử cho mã hiện có. Đây là công việc nhàm chán nhất đối với tôi 🙂

Chúc bạn lập trình vui vẻ với Gemini!