Gemini Code Assist 测试简介

1. 简介

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

实践内容…

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

GeminiApiEnable.png

  1. 启用 Gemini 后,你可以向它发出一两句查询来测试一下。下面列出了几个示例查询,不过您可以尝试什么是 Cloud Run?

GeminiChatWindow.png

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

在 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。这将启用 Gemini in Cloud Code,并且 Gemini 状态栏会显示在 IDE 中。

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 Editor 发挥了作用。该应用在 Cloud Shell 中运行,而不是在您自己的计算机上运行。点击该链接后,系统会打开一个标签页,而不会打开实际的本地地址 http://127.0.0.1:8080,而是打开 Cloud Shell 专门为此目的设置的代理服务器。效果与您真正在本地运行该应用的效果相同。

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

e1b9d5832f6d0058.png

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

建议再多检查几个数字。25 个有效,24 个呢?

37982e385e17baac

也许我们有点草率,认为一切都还不错。24 岁的字母 XXII 是正确的换算结果吗?应该是 XXIV 吗?

我们可以举例说明 XXIIII 是正确的,但这并不是人们通常所期望的结果。不过,由于这其实并无错误(请注意,许多时钟将 4 显示为罗马数字 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?

现在,响应更为具体,甚至包括您可以复制或注入到新文件的 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 停止您之前运行的 Web 服务器,并获取 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)被视为“没有真正错误”的响应并推迟了对未来的增强功能的使用。未来就在眼前。这些“没真的错”非常令人厌烦。

罗马数字中重复数字的第一条规则是:只要一行中存在四个相同的数字,就应将其替换为其中一个数字,后跟下一个高位数字。因此,XXIIII 应替换为 XXIV。同样,XXXX 应更改为 XLCCCC 应更改为 CD

在 number_to_roman 返回之前,询问 Gemini Code Assist 如何以这种方式更改 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

请在编辑器中复制/粘贴或输入这几行代码,然后看看会出现什么情况:

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 服务进行未经身份验证的调用。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

那就去做吧。注意寻找带有红色 !!错误指示器,如下所示:

9bed4f9ed82de21c

后面跟着此处的调用堆栈的多行详细信息,然后是以下内容:

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

如果需要,您可以对 convert.html 文件重复此操作。

Gemini Code Assist 对 CSS 了如指掌,它可以帮助您以多种方式设置应用页面的样式。这仅仅是个开始。

由于您希望共享此应用,因此不要忘记将其重新部署到 Cloud Run:

gcloud run deploy

您可以将该网址传递给需要转换为罗马数字的用户。

9. 恭喜!

恭喜!您已成功使用 Gemini Code Assist 向应用添加了测试、修复了应用中的错误并添加增强功能。

使用完构建的应用后,您可以将其从 Cloud 控制台信息中心删除,以免日后可能产生费用。

参考文档…