Gemini Code Assist 测试简介

1. 简介

在本实验中,您将使用 Gemini Code Assist(Google Cloud 中依托 AI 技术的协作工具),向现有 Python Web 应用添加测试,并查找和修复这些测试所暴露的应用中的错误。然后,您将使用 Code Assist 创建针对新功能的测试,并生成代码以通过这些测试并扩展应用。

实践内容…

  • 您将使用 Cloud Shell Editor 下载现有 Web 应用的代码。
  • 您将在 Cloud Shell Editor 中使用 Gemini Code Assist 聊天来询问有关 Google Cloud 的一般性问题。
  • 您将使用 Cloud Shell Editor 中的 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. Gemini for Cloud 控制台窗口将在控制台右侧打开。点击启用按钮(如下所示)。如果您没有看到启用按钮,而是看到聊天界面,则表明您已经为该项目启用了 Gemini for Cloud,可以直接转到下一步。

GeminiApiEnable.png

  1. 启用后,你可以向它询问一两个问题,试用一下 Gemini。下方显示了一些示例查询,不过您可以尝试查询什么是 Cloud Run?

GeminiChatWindow.png

代码助理将回答您的问题。您可以点击右上角的 f68286b2b2ea5c0a.png 图标关闭 Code Assist 聊天窗口。

在 Cloud Shell Editor 中启用 Gemini

Gemini Code Assist 可在一些热门的 IDE 中使用,其行为方式与之类似。在此 Codelab 中,您将使用 Google Cloud Shell Editor,它完全在网络浏览器中运行。您需要在 Cloud Shell Editor 中启用和配置 Gemini,具体步骤如下所示:

  1. 通过如下所示的图标启动 Cloud Shell。启动 Cloud Shell 实例可能需要一两分钟的时间。

72dc3df7b007fcde.png

  1. 点击编辑器打开编辑器按钮(视具体情况而定),然后等待 Cloud Shell Editor 出现。如果您看到试用新编辑器按钮,请点击该按钮。

CloudShellEditor.png

  1. 如图所示,点击底部状态栏中的 Cloud Code - 登录按钮。按照说明对插件进行授权。如果您在状态栏中看到 Cloud Code - no project,请选择该选项,然后从项目列表中选择您打算使用的 Google Cloud 项目。

CloudCodeSignIn.png

  1. 如果您在右下角的状态栏中没有看到 Gemini 图标,则需要在 Cloud Code 中启用该图标。在执行此操作之前,请确保已在 IDE 中启用 Gemini(以前称为 Duet AI for Developers),方法是依次转到 Cloud Code Extension → Settings,然后输入文本 Duet AI: Enable(如下所示)。确保选中此复选框。您应重新加载 IDE。这将在 Cloud Code 中启用 Gemini,并且您的 IDE 中将显示 Gemini 状态栏。

EnableDuetAiSetting.png

  1. 点击右下角的 Gemini 按钮(如图所示),然后选择已启用 Cloud AI Companion API 的正确 Google Cloud 项目。

GeminiSelectGoogleCloudProject.png

  1. 选择 Google Cloud 项目后,请确保您能够在状态栏的 Cloud Code 状态消息中看到该信息,并且您还可以在右侧状态栏的状态栏中看到 Gemini,如下所示:

GeminiEnabledStatusBar.png

Gemini Code Assist 已可供使用!

3. 下载并检查应用

在终端窗口中,运行命令以克隆包含起始代码的代码库,然后切换到新目录(如果终端窗口不再打开,请点击终端打开终端按钮以恢复该目录):

git clone https://github.com/GoogleCloudPlatform/testing-with-duet-ai-codelab.git
cd testing-with-duet-ai-codelab

在编辑器中打开 main.py,然后点击编辑器左侧的 Gemini Chat 图标,打开 Gemini Chat 窗口。此 Gemini Chat 窗口位于 IDE 内,其中包含 IDE 中的代码,以供讨论的上下文。输入问题“Explain this”(说明此内容),然后查看答案:

GeminiChatExplainThis.png

您可以滚动此聊天窗口,查看完整回答。解释说我们可以在终端窗口中使用 python3 main.py 命令在本地运行此程序。

4. 在本地运行

如果需要,请使用 cd ~/testing-with-duet-ai-codelab 切换到代码库目录,并在终端窗口中输入 python3 main.py 命令:

3bf558e9cea15375

点击链接 http://127.0.0.1:8080 ,打开一个新的浏览器标签页,转到应用程序的主页:

fb06f382a4c03e4c.png

应用“在本地”运行。实际上,Cloud Shell 编辑器在这里完成了一些魔法操作。该应用在 Cloud Shell 中运行,而不是在您自己的计算机上运行。当您点击该链接后,系统打开的标签页不是实际本地地址 http://127.0.0.1:8080,而是 Cloud Shell 专门为此目的设置的代理服务器。效果与实际在本地运行相同。

试试看。输入 25,然后按 Convert!

e1b9d5832f6d0058.png

没错,25 是罗马数字中的 XXV!您必须在此处完成。

建议再多查看几个数字。25 个可行,那么 24 个呢?

37982e385e17baac

可能我们有点仓促地认为一切都还顺利。XXIIII 是 24 的正确换算吗?不是 XXIV?

我们有理由认为 XXIIII 是对的,但这并不是人们通常的期望。不过,这并不算什么错误(请注意,许多时钟将 4 显示为罗马数字 IIII),因此请忽略该问题,以便日后进行改进。

可以试试负数吗?零?这些数字不能用罗马数字表示。没有任何内容向用户返回,看起来是需要修正的错误。

测试可以帮助您发现并消除错误,而 Gemini Code Assist 可以帮助我们编写和使用测试。

5. 添加测试

返回 Gemini 聊天窗口,并提问

How can I test the number_to_roman function?

仔细阅读响应,其中应包含讨论 unittest 模块和 pytest 模块。

您可能希望 Gemini Code Assist 为您实际编写这些测试。在编辑器中打开 calendar.py(实际转化代码),然后返回 Gemini 聊天窗口,再次询问

How can I test the number_to_roman function?

现在,响应更加具体,甚至包括可复制或注入到新文件的 unittest 模块:

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 的基础模型会不时更新,因此答案并非总是完全相同。如果您看到另一组代码,现在可以通过复制此处显示的代码来选择继续使用此 Codelab 中显示的示例,也可以尝试 Gemini Code Assist 现在提供的备用答案。如果您有时间,甚至可以同时尝试这两种方法。Gemini Code Assist 是一款编码助理,您可以根据需要使用。

您可以点击 Gemini Chat 窗口右上角的双尖箭头创建包含单元测试代码的新文件,也可以使用 IDE 创建新文件,然后粘贴本实验中显示的代码。在该窗口中按 CTRL-S 或 CMD-S 进行保存,然后调用保存的文件 calendar-unittest.py。

返回终端,按 CTRL-C 键停止您之前运行的网络服务器,并获得 shell 提示符。输入命令

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_1990,然后运行 test_convert_2023,依此类推。只有 12023 的测试用例通过了测试。

首次试用此代码时,您发现它将 24 转换为 XXIIII,这并非完全错误,但与 IIII 转换为 IV 时的常见形式不同。所有失败的测试都针对类似的情况。首次发现这个问题时,实验室表示:“不过,其实并没有什么问题(请注意,许多时钟将 4 显示为罗马数字 IIII),留待以后的增强功能。”

您可以更改测试用例,以期获得并接受代码给出的“不是什么错误”的回答,或者接受是时候进行“未来的增强功能”了。因此,下一步是在 Gemini Code Assist 帮助下修复代码,提供测试期望的更可接受的答案。

6. 增强代码

回想一下,24XXIIII 等响应(而非更常见的 XXIV)被认为“不太错误”,因此推迟了未来的增强功能。那未来就是现在。那些“没错”的答案仍然很烦人。

罗马数字中重复数字的第一条规则是:每当有 4 个相同的数字连续出现时,都应将其替换为其他数字,后跟下一个数字。因此,XXIIII 应替换为 XXIV。同样,XXXX 应更改为 XLCCCC 应更改为 CD

在 number_to_roman 返回 roman 变量的那一刻,询问 Gemini Code Assist 如何以这种方式更改该变量的值:

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

在编辑器中复制/粘贴或输入这几行代码,然后看看会发生什么:

dcefa568cab82fb7.png

Gemini Code Assist 增加了更多行,以处理您在完成第一组替换后可能最终遇到的情况。例如,19 会转换为 XVIIII,然后是 XVIV,最后是正确的 XIX。

如果 Gemini Code Assist 提供了明显有用的建议,请按 Tab 键接受建议、保存文件,然后再次运行网络服务器。否则,请手动添加此处示例中显示的代码行,然后保存文件。尝试复杂的转换:1999:

a206999587fdc9.png

正确!

立即重新运行测试。全部通过!

Web 应用似乎已做好投入生产的准备。

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 服务进行unauthenticated的调用。Cloud Run 使用的身份验证选项适合调用该服务的程序使用。由于这是一个网站,因此您不需要使用身份验证。

Google Cloud 将构建容器并进行部署,将流量路由到容器并设置访问权限政策,然后显示首页链接:

94ba7d8d63a44afd.png

您可以转到该链接并访问您的申请。

a2e51666dfd33a9f.png

输入一个数字,然后按 Enter 键,

5021535ac991a95c

什么?!

它可以在您的机器上运行!为什么未完成?

一探究竟。咨询 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

当您查看 calendar.py 文件时,会看到 number_to_roman 函数!您知道它是正确的,因为它可以在您的计算机上运行。Cloud Run 中有哪些不同之处?

答案比较难。Python3 中包含一个名为 calendar 的标准模块,就像用于定义 number_to_roman 函数的 calendar.py 文件一样。在您的本地计算机上,当 Python 查找名为 calendar 的模块时,首先搜索您的应用目录。显然,Cloud Run 上的 Python 首先查找标准模块,然后将其导入,但未找到 number_to_roman 函数。

这些环境差异始终是可能发生的。所幸的是,当应用容器化时,它承载着其环境,因此,无论你在何处运行该应用,都会出现相同的行为。如果您曾在本地运行过与 Cloud Run 相同的容器化应用,也会遇到同样的问题。

解决此问题。您需要将本地日历模块的名称更改为非标准模块名称。将 calendar.py 文件重命名为 my_calendar.py,然后将 main.pycalendar-unittest.py 中的 import 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 控制台信息中心将其删除,以免日后再产生任何费用。

参考文档…