Gemini 程式碼輔助功能測試簡介

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。步驟如下:

  1. 請前往 https://console.cloud.google.com,確認已選取這個研究室要執行的 Google Cloud 專案。按一下右上方的 Gemini 圖示。

GeminiBanner.png

  1. Cloud 控制台專用 Gemini 視窗隨即會在控制台右側開啟。點按「啟用」按鈕 (如下所示)。如果沒有看到「啟用」按鈕,而是看到 Chat 介面,表示您已為專案啟用 Gemini 版 Cloud,可以直接進行下一個步驟。

GeminiApiEnable.png

  1. 啟用 Gemini 後,只要查詢一、兩個查詢就能測試 Gemini。系統會顯示一些查詢範例,但您可以嘗試 什麼是 Cloud Run?

GeminiChatWindow.png

Code Assist 會回覆您的問題。您可以點選右上角的 f68286b2b2ea5c0a.png 圖示,關閉 Code Assist 即時通訊視窗。

在 Cloud Shell 編輯器中啟用 Gemini

Gemini Code Assist 可使用,運作方式在幾種熱門 IDE 中的運作方式相似。在本程式碼研究室中,您將使用 Google Cloud Shell 編輯器,可以在網路瀏覽器中完全執行。您必須在 Cloud Shell 編輯器中啟用及設定 Gemini,步驟如下:

  1. 透過下方顯示的圖示啟動 Cloud Shell。Cloud Shell 執行個體可能需要一到兩分鐘才會啟動。

72dc3df7b007fcde.png

  1. 按一下「Editor」或「Open Editor」按鈕 (視情況而定),然後等待 Cloud Shell 編輯器顯示。如果看到「試用新版編輯器」按鈕,請點選該按鈕。

CloudShellEditor.png

  1. 按一下底部狀態列中的「Cloud Code - 登入」按鈕 (如圖所示)。按照指示授權外掛程式。如果您在狀態列中看到「Cloud Code - no project」,請選取該專案,然後從您打算使用的專案清單中選取特定的 Google Cloud 專案。

CloudCodeSignIn.png

  1. 如果右下方的狀態列未顯示 Gemini 圖示,請前往 Cloud Code 啟用。開始前,請先依序前往「Cloud Code Extension」→「Settings」並輸入「Duet AI:啟用」,確認 IDE 中的 Gemini (舊稱「開發人員專用 Duet AI」) 已啟用。確認已勾選該核取方塊。建議您重新載入 IDE。這項操作會啟用 Gemini 版 Cloud Code,IDE 中會顯示 Gemini 狀態列。

EnableDuetAiSetting.png

  1. 點選畫面右下角的「Gemini」Gemini按鈕,然後選取已啟用 Gemini 的正確 Google Cloud 專案。

GeminiSelectGoogleCloudProject.png

  1. 選取 Google Cloud 專案後,請確認狀態列的 Cloud Code 狀態訊息中會顯示相關訊息,且右側狀態列中也會顯示 Gemini 已啟用,如下所示:

GeminiEnabledStatusBar.png

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 中使用程式碼討論討論內容。輸入「說明這個」提示並查看答案:

GeminiChatExplainThis.png

捲動這個即時通訊視窗即可查看完整解答。說明指出我們可以在終端機視窗中使用 python3 main.py 指令在本機執行這個程式。

4. 在本機執行

視需要變更為包含 cd ~/testing-with-duet-ai-codelab 的存放區目錄,然後在終端機視窗中輸入 python3 main.py 指令:

3bf558e9cea15375.png

按一下連結 http://127.0.0.1:8080,開啟新的瀏覽器分頁,並前往應用程式首頁:

fb06f382a4c03e4c.png

應用程式是在「本機」執行。其實 Cloud Shell 編輯器其實執行了幾項神奇任務。應用程式是在 Cloud Shell 執行,而不是在您自己的電腦上。當您點選該連結時,會開啟一個分頁,而不是實際的本機位址 (http://127.0.0.1:8080),而會開啟專為 Cloud Shell 設定的 Proxy 伺服器。效果與在本機執行時的效果相同。

歡迎立即試用!輸入 25,然後按下「Convert!」

e1b9d5832f6d0058.png

沒錯,25 的羅馬數字是 XXV!您必須在這裡完成設定。

再多找幾組數字吧。25 能順利運作, 24 吧?

37982e385e17baac.png

也許我們有點難以置信,請問 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 提供測試程式碼的回覆。您可以在程式碼下方進一步瞭解測試案例的執行方式:

run-unittest.png

請嘗試執行建議的指令:

python -m unittest discover

如果機器未將 python3 指令別名設為 python,則可能是發生問題;在這種情況下,請執行以下指令:

python3 -m unittest discover

指令會執行,但傳回 Ran 0 tests in 0.000s。當中有多個測試。預期情況

這是指令中的最後一個字詞:discover。從何而來?很明顯,Gemini Code Assist 預期將測試程式碼儲存在名為 discoverdiscover.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_1990test_convert_2023 等等。只有 12023 的測試案例通過。

初次嘗試這個程式碼時,發現程式碼 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?

建議您在結尾加入一些程式碼:

6437c3fa2c5fabd1.png

在編輯器中複製/貼上或輸入各行內容,然後看看會發生什麼事:

dcefa568cab82fb7.png

Gemini Code Assist 新增了更多行,可處理建立第一組替代項目後可能發生的情況。舉例來說,19 會依序轉換為 XVIIII,然後轉換為 XVIV,最後再轉換為正確的 XIX。

如果 Gemini Code Assist 提供明顯實用的建議,請按下 Tab 鍵接受建議、儲存檔案,然後再次執行網路伺服器。否則,請手動新增此處範例中顯示的行,並儲存檔案。嘗試克服轉型難關:1999:

a206999587fdc9.png

答對了!

請立即重新執行測試。它們通過!

網頁應用程式似乎已準備好推出正式版。

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 會建構、部署容器、將流量轉送至該容器、設定存取權政策,然後向您顯示首頁連結:

94ba7d8d63a44afd.png

您可以前往該連結並存取應用程式。

a2e51666dfd33a9f.png

輸入數字並按下 Enter 鍵,然後...

5021535ac991a95c.png

什麼!?

這項功能可以在你的機器上運作!為什麼沒有完成?

瞭解詳情。向 Gemini Code Assist 提問,

Why am I getting an internal server error on cloud run?

4b24321251d6eddf.png

基本上,Gemini Code Assist 可以讀取記錄檔,顯示類似的內容。歡迎詢問 Gemini Code Assist,您可以如何自行查看記錄:

92d1855be73ef1d.png

請按照指示操作尋找有紅色 ! 標示的線條!錯誤指標,如下所示:

9bed4f9ed82de21c.png

下方接著是呼叫堆疊的許多詳細資料,但這將是:

47fc93be845f4e3f.png

查看 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.pycalendar-unittest.pyimport calendar 行變更為 import my_calendar。最後將一行程式碼

roman = calendar.number_to_roman(number)

roman = my_calendar.number_to_roman(number)

請在本機試用、執行測試,然後重新部署:

gcloud run deploy

現在可以正常運作了:

ed288801c6825eb1.png

您可以將這個網址分享給所有需要羅馬數字轉換工具的使用者,

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 並按一下連結,開啟預覽視窗。這個頁面現在稍微簡單了:

295643ec03fcaafc.png

如有需要,可以重複使用 convert.html 檔案。

Gemini Code Assist 具備許多 CSS 功能,可協助您以多種方式設定應用程式頁面的樣式。這只是第一步。

由於您想要共用這個應用程式,因此別忘了將應用程式重新部署至 Cloud Run:

gcloud run deploy

您可以將網址傳遞給需要轉換成羅馬數字的使用者。

9. 恭喜!

恭喜!您已成功使用 Gemini Code Assist,在應用程式中新增測試、修正應用程式錯誤及新增進階功能。

在您完成建構的應用程式使用完畢後,可以從 Cloud 控制台資訊主頁刪除應用程式,以免日後產生任何費用。

參考說明文件...