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 Phát triển dựa trên kiểm thử ( TDD), trong đó bạn viết mã kiểm thử trước khi triển khai mã. Chúng ta sẽ xây dựng một ứng dụng tính toán đơn giản có sử dụng Ruby để thể hiện phương pháp này.
Bạn cũng sẽ học cách sử dụng Gemini làm trợ lý lập trình. Gemini sẽ giúp đẩy nhanh chu trình TDD bằng cách tạo ra các trường hợp kiểm thử, đề xuất cách triển khai mã và thậm chí là đưa ra nội dung giải thích về mã.
Cuối cùng, bạn sẽ tìm hiểu cách triển khai ứng dụng tính toán cho Cloud Function, nền tảng không máy chủ được Google quản lý hoàn toàn, giúp người dùng dễ tiếp cận ứng dụng của bạn.
2. Điều kiện tiên quyết
- Một dự án trên Google Cloud có bật tính năng Thanh toán
- Trình duyệt web
Tạo dự án
- Trong Google Cloud Console, trên trang bộ chọn dự án, hãy chọn hoặc tạo một dự án trên Google Cloud.
- Đảm bảo rằng bạn đã bật tính năng thanh toán cho dự án của mình trên Google Cloud. Tìm hiểu cách kiểm tra xem tính năng thanh toán có được bật trên một dự án hay không.
Bật Gemini API
- Chuyển đến Gemini Marketplace để bật API này. Bạn cũng có thể sử dụng gcloud để bật API này:
gcloud services enable cloudaicompanion.googleapis.com --project PROJECT_ID
- Truy cập vào trang Gemini rồi nhấp vào "Bắt đầu trò chuyện".
- Lưu ý quan trọng: Hãy làm theo bước 1 và 2 trong lớp học lập trình này để bắt đầu sử dụng Gemini và bật Gemini trong IDE Cloud Shell tương ứng.
Bật Cloud Functions API
- Trong Google Cloud Console, trên trang bộ chọn dự án, hãy chọn hoặc tạo một dự án trên Google Cloud.
- Chuyển đến trang API Cloud Functions để bật API này. Bạn cũng có thể sử dụng gcloud để bật API này:
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 đượ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:
- Sau khi kết nối với Cloud Shell, bạn sẽ thấy mình đã được xác thực và dự án được đặt thành mã dự á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 dự án của bạn chưa được thiết lập, hãy sử dụng lệnh sau để thiết lập dự án:
gcloud config set project <YOUR_PROJECT_ID>
Hãy tham khảo tài liệu để biết các lệnh gcloud và cách sử dụng.
Mở Trình chỉnh sửa
- Đối với lớp học lập trình này, chúng ta sẽ sử dụng trình chỉnh sửa đám mây tích hợp sẵn. 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 soạn thảo VSCode cho bạn.
Thêm tiện ích Ruby
- Trên trình đơn bên trái, nhấp vào biểu tượng tiện ích
, viết
vscode ruby
vào thanh tìm kiếm và cài đặt tiện ích VSCode Ruby.
3. Khởi động Gemini
Các LLM là không xác định. Vì vậy, trong khi thử những câu lệnh này, phản hồi bạn nhận được có thể khác với phản hồi trong ảnh chụp màn hình đính kèm trong lớp học lập trình.
Trước tiên, hãy hỏi Gemini về TDD. Để bắt đầu trò chuyện với Gemini trong cùng một Trình chỉnh sửa Cloud Shell ở vị trí hiện tại của chúng ta, 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
. Thao tác này sẽ mở ra 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 với nội dung
Enter a prompt here
Lời nhắc:
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. ....
Tài liệu này giới thiệu ngắn gọn về TDD và các lợi ích của nó.
Bây giờ, hãy hỏi Gemini về Ruby là gì:
Lời nhắc:
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. ....
Hướng dẫn này giải thích định nghĩa của Ruby và lợi ích của việc 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 bất kỳ tên nào bạn muốn. Chúng ta sẽ đặt tên lớp này 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ẻ Explorer, hãy tạo thư mục trong/home/<YOUR-USERNAME>/
- Hãy mở thư mục chúng ta vừa tạo. Trên trình đơn ngoài cùng bên trái, hãy nhấp vào biểu tượng
, sau đó 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 khởi đầu cho ứng dụng. Bạn có thể đặt tên bất kỳ cho tệp này. Trong lớp học lập trình này, chúng ta sẽ đặt tên cho thuộc tính này là
app.rb
. - 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
để viết 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 chút bối cảnh về những việc chúng tôi đang cố gắng thực hiện và yêu cầu Gemini tạo các trường hợp thử nghiệm tương tự. Sao chép câu lệnh sau đây trong câu lệnh trò chuyện của Gemini.
Lời nhắc:
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. .....
Ví dụ này 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ố. Tệp này cũng nhập phần phụ thuộc bắt buộc minitest/autorun
cho các bài kiểm thử. Hãy sao chép nội dung vào app_test.rb
. Hãy thử và chạy kiểm thử này ngay bây giờ; vì chúng ta không viết mã nên chắc chắn sẽ không thành công.
Hãy hỏi Gemini cách thực hiện quy trình kiểm tra này.
Lời nhắc:
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ì vậy, hãy tiếp tục và chạy kiểm thử. Nhấp chuột phải vào app_test.rb
trong thẻ Explorer rồi nhấp vào "Open in Integration Terminal" (Mở trong cửa sổ dòng tích hợp)
Đảm bảo bạn đang ở trong cùng một thư mục với tệp app_test.rb, nếu không sử dụng lệnh cd để truy cập vào đó. Trong cửa sổ dòng lệnh, hãy chạy lệnh do Gemini trả về:
ruby app_test.rb
Bạn sẽ gặp lỗi sau:
NameError: uninitialized constant Calculator
Hãy hỏi Gemini cách khắc phục vấn đề 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à hỏi câu lệnh bên dưới:
Lời nhắc:
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 chúng ta biết rằng chúng ta không có lớp học có tên là Calculator
và chúng ta cần tạo một lớp học. Ví dụ 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
trên thẻ Explorer rồi sao chép mã do Gemini cung cấp trong đó. Trong khi sửa đổi nội dung trong app.rb, bạn có thể nhận được một số đề xuất của Gemini dưới dạ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 muốn.
Bây giờ, hãy chạy lại chương trình kiểm thử. Nhập lệnh sau vào thiết bị đầu cuối tích hợp của bạn:
ruby app_test.rb
Nhưng bạn vẫn sẽ gặp lỗi tương tự "NameError: uninitialized constant Calculator
". Hãy hỏi Gemini cách khắc phục vấn đề này.
6. TDD lặp lại với Gemini
Lời nhắc:
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
....
Phản hồi này đã cho chúng tôi 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 cho Gemini biết rõ rằng chúng ta đã xác định lớp Máy tính trong app.rb .
Lời nhắc:
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 tôi nhận được phản hồi của Gemini yêu cầu nhập app.rb nơi chúng tôi đã xác định lớp Máy tính. Đôi khi có thể cần 2-3 lần lặp lại câu lệnh để có được câu trả lời đúng nhưng bạn sẽ hiểu được cách này và kết quả sẽ tốt hơn. Xin lưu ý rằng trong câu trả lời của Gemini, có thể bạn cũng sẽ thấy require "./app". Hãy thêm mã này vào tệp app.rb trong app_test.rb rồi chạy lại cùng một lượt kiểm thử.
Hãy đả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ứ suôn sẻ, kiểm thử sẽ thành công. Vì vậy, chúng tôi đã phát triển một ứng dụng Ruby rất đơn giản theo 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à do bản chất của các mô hình LLM. Bạn có thể nhận được nhiều thao tác của Máy tính hơn từ Gemini, nhưng nhìn chung, quy trình mà chúng ta vừa làm theo vẫn hoạt động bình thườ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 chức năng này cho Cloud Function:
Lời nhắc:
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 giao diện người dùng Chức năng đám mây. Nhưng tôi không muốn làm việc đó. Hãy yêu cầu Gemini cấp cho chúng tôi lệnh gcloud
mà tôi có thể chạy ngay trên thiết bị đầu cuối tích hợp.
Lời nhắc:
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 đưa ra trong thiết bị đầu cuối.
gcloud functions deploy calculator --runtime ruby32 --trigger-http --entry-point app
Bạn sẽ gặp 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 để Gemini trợ giúp để khắc phục lỗi này.
Lời nhắc:
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 dòng lệnh sẽ tạo Gemfile.lock
. Sau khi chạy lệnh, hãy kiểm tra thẻ Explorer, bạn sẽ thấy Gemfile.lock
.
Hãy cố gắng triển khai lại 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 một lỗi khác sau đây:
"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. Khung hàm cho Ruby
Hãy hỏi Gemini về lỗi này:
Lời nhắc:
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, ứng dụng của chúng ta đang thiếu điểm đá quý function_framework. Hãy tiếp tục và thêm dòng này vào Gemfile của chúng ta:
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 thông báo lỗi "Noexplicit global resource in Gemfile" (Không có tài nguyên toàn cầu rõ ràng trong Gemfile) của Google. Nếu bạn gặp phải lỗi này, hãy đảm bảo rằng bạn có dòng sau làm dòng đầu tiên của Gemfile:
source "https://rubygems.org"
Sau đó, chạy lại bundle install
trên 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
Hiện tại, bạn sẽ gặp 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 dùng thử tính năng Generate Code
của Gemini. Hãy mở app.rb từ thẻ Explorer (Trình khám phá), nơi chúng ta đã có mã ứng dụng 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 :
Hãy nhấn phím Tab để chấp nhận gợi ý. Sau khi chấp nhận yêu cầu này, bạn sẽ thấy các đề xuất khác như bên dưới:
Nhấn phím Tab để chấp nhận thêm nội dung đề xuất. 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
Nếu mọi thứ diễn ra suôn sẻ, việc triển khai sẽ được thực hiện và bạn sẽ thấy được URL nơi ứng dụng của mình được lưu trữ. Tuyệt, hãy sửa đổi app.rb một chút để trả về kết quả bổ sung. 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à chuyển các tham số truy vấn a
và b
như minh hoạ dưới đây:
https://[APP-URL]/?a=2&b=3
Bạn có thể thấy phản hồi là : "Result: 5"
. Máy tính có rất nhiều phép tính. Bạn cũng 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
Chúng ta đã tìm hiểu cách phát triển một ứng dụng Ruby hiện nay theo phương pháp TDD với sự trợ giúp của Gemini. Như bạn đã nhận thấy, Gemini có thể cung cấp cho bạn những kết quả khác nhau, nhưng chắc chắn sẽ giúp bạn đẩy nhanh quá trình phát triển bằng một ngôn ngữ mà có thể bạn chưa quen dùng, đồng thời vẫn hiển thị cho bạn các hàm hoặc đoạn trích để tăng tốc độ học tập của bạn.
Mọi nhà phát triển ( bất kể kinh nghiệm gì) đều có thể sử dụng Gemini trong quá trình phát triển ứng dụng. Nếu không dùng để phát triển, bạn có thể dùng Gemini để giải thích đoạn mã hiện có, bạn có thể yêu cầu Gemini tạo các bài kiểm thử cho đoạn 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!