1. 簡介
在本研究室中,您將使用 Gemini Code Assist,這是 Google Cloud 中的 AI 技術輔助協作工具,在現有的 Python 網頁應用程式中新增測試,以及找出並修正測試公開應用程式中的錯誤。接著,您將使用 Code Assist 建立新功能測試,並產生程式碼來通過這些測試及擴充應用程式。
您將要執行的操作...
- 您將使用 Cloud Shell 編輯器下載現有網頁應用程式的程式碼。
- 您可以使用 Cloud Shell 編輯器中的 Gemini Code Assist Chat 提出有關 Google Cloud 的一般問題。
- 您將在 Cloud Shell 編輯器中使用 Gemini Code Assist 內嵌程式碼輔助功能,產生應用程式測試、執行測試、找出並修正錯誤,以及擴充應用程式功能。
課程內容...
- 如何使用 Gemini Code Assist 處理多項開發人員工作,例如生成測試與程式碼。
- 如何使用 Gemini Code Assist 認識 Google Cloud。
軟硬體需求
- Chrome 網路瀏覽器
- Gmail 帳戶
- 已啟用計費功能的 Cloud 專案
- 你的 Cloud 專案已啟用 Gemini Code Assist
本研究室的適用對象為各級開發人員,包括初學者。雖然範例應用程式採用 Python 語言,但您不需要熟悉 Python 程式也能瞭解其中緣由。我們的重點將放在向開發人員熟悉 Gemini Code Assist 的功能。
2. 設定
在此研究室中,您應該擁有已啟用計費功能的 Cloud 專案。我們現在會在 Google Cloud 專案中啟用 Gemini API。步驟如下:
- 請前往 https://console.cloud.google.com,確認已選取這個研究室要執行的 Google Cloud 專案。按一下右上方的 Gemini 圖示。
- Cloud 控制台專用 Gemini 視窗隨即會在控制台右側開啟。點按「啟用」按鈕 (如下所示)。如果沒有看到「啟用」按鈕,而是看到 Chat 介面,表示您已為專案啟用 Gemini 版 Cloud,可以直接進行下一個步驟。
- 啟用 Gemini 後,只要查詢一、兩個查詢就能測試 Gemini。系統會顯示一些查詢範例,但您可以嘗試 什麼是 Cloud Run?
Code Assist 會回覆您的問題。您可以點選右上角的 圖示,關閉 Code Assist 即時通訊視窗。
在 Cloud Shell 編輯器中啟用 Gemini
Gemini Code Assist 可使用,運作方式在幾種熱門 IDE 中的運作方式相似。在本程式碼研究室中,您將使用 Google Cloud Shell 編輯器,可以在網路瀏覽器中完全執行。您必須在 Cloud Shell 編輯器中啟用及設定 Gemini,步驟如下:
- 透過下方顯示的圖示啟動 Cloud Shell。Cloud Shell 執行個體可能需要一到兩分鐘才會啟動。
- 按一下「Editor」或「Open Editor」按鈕 (視情況而定),然後等待 Cloud Shell 編輯器顯示。如果看到「試用新版編輯器」按鈕,請點選該按鈕。
- 按一下底部狀態列中的「Cloud Code - 登入」按鈕 (如圖所示)。按照指示授權外掛程式。如果您在狀態列中看到「Cloud Code - no project」,請選取該專案,然後從您打算使用的專案清單中選取特定的 Google Cloud 專案。
- 如果右下方的狀態列未顯示 Gemini 圖示,請前往 Cloud Code 啟用。開始前,請先依序前往「Cloud Code Extension」→「Settings」並輸入「Duet AI:啟用」,確認 IDE 中的 Gemini (舊稱「開發人員專用 Duet AI」) 已啟用。確認已勾選該核取方塊。建議您重新載入 IDE。這項操作會啟用 Gemini 版 Cloud Code,IDE 中會顯示 Gemini 狀態列。
- 點選畫面右下角的「Gemini」Gemini按鈕,然後選取已啟用 Gemini 的正確 Google Cloud 專案。
- 選取 Google Cloud 專案後,請確認狀態列的 Cloud Code 狀態訊息中會顯示相關訊息,且右側狀態列中也會顯示 Gemini 已啟用,如下所示:
Gemini Code Assist 已可使用!
3. 下載並檢查應用程式
在終端機視窗中,執行指令以複製含有範例程式碼的存放區,然後變更為新目錄。如果終端機視窗已無法開啟,請按一下「Terminal」(終端機) 或「Open Terminal」(開啟終端機) 按鈕還原存放區:
git clone https://github.com/GoogleCloudPlatform/testing-with-duet-ai-codelab.git
cd testing-with-duet-ai-codelab
在編輯器中開啟 main.py,接著點按編輯器左側的「Gemini 對話」圖示,開啟「Gemini Chat」視窗。這個 Gemini Chat 視窗位於 IDE 中,您可以在 IDE 中使用程式碼討論討論內容。輸入「說明這個」提示並查看答案:
捲動這個即時通訊視窗即可查看完整解答。說明指出我們可以在終端機視窗中使用 python3 main.py
指令在本機執行這個程式。
4. 在本機執行
視需要變更為包含 cd ~/testing-with-duet-ai-codelab
的存放區目錄,然後在終端機視窗中輸入 python3 main.py
指令:
按一下連結 http://127.0.0.1:8080,開啟新的瀏覽器分頁,並前往應用程式首頁:
應用程式是在「本機」執行。其實 Cloud Shell 編輯器其實執行了幾項神奇任務。應用程式是在 Cloud Shell 執行,而不是在您自己的電腦上。當您點選該連結時,會開啟一個分頁,而不是實際的本機位址 (http://127.0.0.1:8080),而會開啟專為 Cloud Shell 設定的 Proxy 伺服器。效果與在本機執行時的效果相同。
歡迎立即試用!輸入 25,然後按下「Convert!」。
沒錯,25 的羅馬數字是 XXV!您必須在這裡完成設定。
再多找幾組數字吧。25 能順利運作, 24 吧?
也許我們有點難以置信,請問 XXIIII 的 24 轉換是否正確?它應該不是 XXIV?
例子可以證明 XXIIII 是正確的,但這並非大家平常的期待。不過,由於問題並沒有真的「錯誤」 (請注意,許多時鐘顯示為羅馬數字 IIII),請保留該問題,以利我們日後改進。
如何嘗試負數?完全沒有?以羅馬數字表示這些數字。沒有任何內容會向使用者傳回,但這似乎是需要解決的錯誤。
進行測試有助於找出並消除錯誤,Gemini Code Assist 能協助我們撰寫及使用測試。
5. 新增測試
返回 Gemini Chat 視窗,然後提問
How can I test the number_to_roman function?
詳閱回應,其中應包含討論 unittest 模組和 pytest 模組。
你不妨讓 Gemini Code Assist 實際撰寫這些測試。在編輯器中開啟 calendar.py,也就是實際轉換程式碼所在的編輯器,返回 Gemini Chat 視窗,然後再次詢問
How can I test the number_to_roman function?
現在回應更為具體,包括可以複製或插入新檔案中的單元測試模組:
import unittest
import calendar
class NumberToRomanTest(unittest.TestCase):
def test_convert_1(self):
self.assertEqual(calendar.number_to_roman(1), "I")
def test_convert_4(self):
self.assertEqual(calendar.number_to_roman(4), "IV")
def test_convert_9(self):
self.assertEqual(calendar.number_to_roman(9), "IX")
def test_convert_40(self):
self.assertEqual(calendar.number_to_roman(40), "XL")
def test_convert_90(self):
self.assertEqual(calendar.number_to_roman(90), "XC")
def test_convert_400(self):
self.assertEqual(calendar.number_to_roman(400), "CD")
def test_convert_900(self):
self.assertEqual(calendar.number_to_roman(900), "CM")
def test_convert_1990(self):
self.assertEqual(calendar.number_to_roman(1990), "MCMXC")
def test_convert_2023(self):
self.assertEqual(calendar.number_to_roman(2023), "MMXXIII")
您可能會看到與上述範例不同的程式碼。Gemini Code Assist 的基礎模型會不時更新,因此答案不一定相同。如果看到另一組程式碼,可以複製這裡顯示的程式碼,選擇是否繼續本程式碼研究室顯示的範例,或試試 Gemini Code Assist 提供的替代解答。如有時間,也可以同時嘗試兩種途徑。Gemini Code Assist 是程式設計助理,可依需求使用。
點按 Gemini Chat 視窗右上角的雙箭頭箭頭,即可建立含有單元測試程式碼的新檔案,或是使用 IDE 建立新檔案,然後貼上本研究室中顯示的程式碼。在視窗中按下 CTRL-S 或 CMD-S 來儲存,然後呼叫儲存的 calendar-unittest.py。
返回終端機,按下 CTRL-C 鍵來停止您先前執行的網路伺服器,接著收到殼層提示。輸入以下指令
python3 calendar-unittest.py
執行新的測試
沒有任何輸出內容。這不如預期。一切都靜音了嗎?你想瞭解這一點。查看 Gemini Code Assist 提供測試程式碼的回覆。您可以在程式碼下方進一步瞭解測試案例的執行方式:
請嘗試執行建議的指令:
python -m unittest discover
如果機器未將 python3
指令別名設為 python
,則可能是發生問題;在這種情況下,請執行以下指令:
python3 -m unittest discover
指令會執行,但傳回 Ran 0 tests in 0.000s
。當中有多個測試。預期情況
這是指令中的最後一個字詞:discover
。從何而來?很明顯,Gemini Code Assist 預期將測試程式碼儲存在名為 discover
或 discover.py
的檔案,但並未指明應執行的操作。由於您實際上是在 calendar-unittest.py
中儲存檔案,請嘗試執行以下指令:
python3 -m unittest calendar-unittest
現在您可以看到許多輸出內容,一開始會像這樣:
$ python3 -m unittest calendar-unittest
.F.FFFFFF
======================================================================
FAIL: test_convert_1990 (calendar-unittest.NumberToRomanTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/charles_engelke/testing-with-duet-ai-codelab/calendar-unittest.py", line 28, in test_convert_1990
self.assertEqual(calendar.number_to_roman(1990), "MCMXC")
AssertionError: 'MDCCCCLXXXX' != 'MCMXC'
- MDCCCCLXXXX
+ MCMXC
第一行顯示每項通過測試的時段,以及每項失敗的 F
。大多數的測試都失敗了!然後單獨列出失敗的測試,顯示預期的輸出內容和實際輸出內容。我們不太確定這些測試的執行順序。因為這是依測試名稱的字母順序排列,而不是測試在檔案中的顯示順序。因此 test_convert_1
先執行,然後依序為 test_convert_1990
、test_convert_2023
等等。只有 1
和 2023
的測試案例通過。
初次嘗試這個程式碼時,發現程式碼 24
轉換為 XXIIII
,但這不是確切的錯誤,但並非將 IIII
轉換為 IV
的常見格式。所有失敗測試都屬於類似的案例。首次回報這個問題時,研究室會回答:「因為那並不是真的錯誤 (請注意,許多時鐘的 4
顯示為羅馬數字 IIII
),該問題我們日後會進行改善。」
您可以變更測試案例,並接受「真的錯誤」或接受系統發出的程式碼,或接受該是「未來強化」的時間。接下來,再透過 Gemini Code Assist 修正程式碼,為測試提供更多可接受的答案。
6. 強化程式碼
提醒您,系統會將「24
」的回覆 (而非較常見的XXIV
) 視為「不是錯誤」XXIIII
因此開放了日後的強化功能未來就是這樣這些「沒有完全錯誤」的問題仍然感到困擾
羅馬數字中重複數字的第一個規則是:只要連續四個數字相同,就必須替換成其中 1 個數字,後面接著次高的數字。因此,應使用 XXIV
取代 XXIIII
。同樣地,XXXX
應變更為 XL
,而 CCCC
應變為 CD
。
您可以詢問 Gemini Code Assist 如何在 number_to_roman 傳回 roman 變數前,用這種方式變更該變數的值:
If the final value of roman has IIII in it, that should be replaced by IV. Similarly XXXX should be replaced by XL, and CCCC should become CD. How can I make those changes?
建議您在結尾加入一些程式碼:
在編輯器中複製/貼上或輸入各行內容,然後看看會發生什麼事:
Gemini Code Assist 新增了更多行,可處理建立第一組替代項目後可能發生的情況。舉例來說,19 會依序轉換為 XVIIII,然後轉換為 XVIV,最後再轉換為正確的 XIX。
如果 Gemini Code Assist 提供明顯實用的建議,請按下 Tab 鍵接受建議、儲存檔案,然後再次執行網路伺服器。否則,請手動新增此處範例中顯示的行,並儲存檔案。嘗試克服轉型難關:1999:
答對了!
請立即重新執行測試。它們通過!
網頁應用程式似乎已準備好推出正式版。
7. 部署至 Cloud Run
Cloud Run 會在網際網路上執行容器化應用程式。對於使用 Flash 等常見架構編寫的應用程式,gcloud run deploy
指令甚至會先為您建構該容器,再進行部署。執行下列指令:
gcloud run deploy
在終端機中。系統詢問原始碼位置時,請按下 Enter 鍵接受系統建議的正確位置。同樣地,當系統要求您輸入服務名稱時,按下 Enter 鍵即可接受建議。
gcloud 無法判斷要使用的專案,因此指令可能會失敗。在這種情況下,請執行下列指令:
gcloud config set core/project <project-id>
其中
會換成您的專案 ID,可能與專案名稱相同。接著,請重新執行 gcloud run deploy
指令。
- 這個指令會提示您啟用某些尚未啟用的 API。請輸入 y 來啟用廣告技術。
- 當系統要求您選取地區時,請挑選您方便的區域。輸入與
us-central1
對應的數字是一個安全選擇。 - 系統詢問時,請輸入 Y 繼續操作。
- 您可能會想要允許在未經驗證的情況下叫用這項 Cloud Run 服務。Cloud Run 使用的驗證選項適合用於呼叫服務的程式。由於這是網站,因此你不會使用驗證。
Google Cloud 會建構、部署容器、將流量轉送至該容器、設定存取權政策,然後向您顯示首頁連結:
您可以前往該連結並存取應用程式。
輸入數字並按下 Enter 鍵,然後...
什麼!?
這項功能可以在你的機器上運作!為什麼沒有完成?
瞭解詳情。向 Gemini Code Assist 提問,
Why am I getting an internal server error on cloud run?
基本上,Gemini Code Assist 可以讀取記錄檔,顯示類似的內容。歡迎詢問 Gemini Code Assist,您可以如何自行查看記錄:
請按照指示操作尋找有紅色 ! 標示的線條!錯誤指標,如下所示:
下方接著是呼叫堆疊的許多詳細資料,但這將是:
查看 calendar.py 檔案時,畫面上會顯示 number_to_roman 函式!這一切都是在您的機器上運作的Cloud Run 有什麼不同?
答案有點棘手。Python3 包含一個名為 calendar 的標準模組,如同 calendar.py 檔案,當中定義了 number_to_roman 函式。在本機電腦上,Python 尋找名為 calendar 的模組時,會先搜尋應用程式目錄。基本上,Cloud Run 上的 Python 會先尋找並匯入標準模組,而且找不到 number_to_roman 函式。
這兩種環境在環境上的差異很大。幸運的是,當應用程式完成容器化後,即會在該環境中執行其環境,因此您在任何執行應用程式時都能看到相同的行為。如果您已在本機執行 Cloud Run 中的同一個容器化應用程式,也會發生同樣的問題。
修正這個問題。您必須將本機日曆模組的名稱變更為非標準模組名稱。將 calendar.py 檔案重新命名為 my_calendar.py,然後將 main.py 和 calendar-unittest.py 的 import calendar
行變更為 import my_calendar
。最後將一行程式碼
roman = calendar.number_to_roman(number)
到
roman = my_calendar.number_to_roman(number)
請在本機試用、執行測試,然後重新部署:
gcloud run deploy
現在可以正常運作了:
您可以將這個網址分享給所有需要羅馬數字轉換工具的使用者,
8. 選用:修飾內容
您的應用程式運作正常,網路上的任何人都能存取。但看起來有點單純。向大家介紹前,不妨先請 Gemini Code Assist 調整外觀。
開啟 templates/index.html
檔案。在 Gemini 對話視窗中提問:
Make this index.html file use material design.
回應是新增目前的檔案,產生與下列內容相似的結果:
<!DOCTYPE html>
<html>
<head>
<title>Roman Numerals</title>
<link rel="stylesheet" href="https://code.getmdl.io/1.3.0/material.indigo-pink.min.css">
<script defer src="https://code.getmdl.io/1.3.0/material.min.js"></script>
</head>
<body>
<h1 class="mdl-typography--title">Roman Numerals</h1>
<form action="/convert" method="post">
<div class="mdl-textfield mdl-js-textfield">
<input class="mdl-textfield__input" type="text" id="number" name="number" required />
<label class="mdl-textfield__label" for="number">Enter a number:</label>
</div>
<button class="mdl-button mdl-js-button mdl-button--raised mdl-button--colored">
Convert!
</button>
</form>
</body>
</html>
請使用這個圖示複製建議的程式碼,並貼到 index.html 的現有內容上。在終端機中,執行 python3 main.py
並按一下連結,開啟預覽視窗。這個頁面現在稍微簡單了:
如有需要,可以重複使用 convert.html 檔案。
Gemini Code Assist 具備許多 CSS 功能,可協助您以多種方式設定應用程式頁面的樣式。這只是第一步。
由於您想要共用這個應用程式,因此別忘了將應用程式重新部署至 Cloud Run:
gcloud run deploy
您可以將網址傳遞給需要轉換成羅馬數字的使用者。
9. 恭喜!
恭喜!您已成功使用 Gemini Code Assist,在應用程式中新增測試、修正應用程式錯誤及新增進階功能。
在您完成建構的應用程式使用完畢後,可以從 Cloud 控制台資訊主頁刪除應用程式,以免日後產生任何費用。