Gemini Code Assist 测试简介

1. 简介

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

实践内容…

  • 您将使用 Cloud Shell 编辑器下载现有 Web 应用的代码。
  • 您将使用 Cloud Shell 编辑器中的 Gemini Code Assist Chat 来询问有关 Google Cloud 的常见问题。
  • 您将使用 Cloud Shell 编辑器中的 Gemini Code Assist 内嵌代码助理来为应用生成测试、运行测试、查找和修复错误,然后扩展应用的功能。

学习内容…

  • 如何使用 Gemini Code Assist 执行多项开发者任务,例如测试生成和代码生成。
  • 如何使用 Gemini Code Assist 了解 Google Cloud。

所需条件…

  • Chrome 网络浏览器
  • Gmail 账号
  • 启用了结算功能的 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 后,您可以向其发出一两句查询来测试一下。下方显示了几个查询示例,不过您可以尝试诸如 What is Cloud Run? 之类的查询

GeminiChatWindow.png

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

在 Cloud Shell 编辑器中启用 Gemini

Gemini Code Assist 可在多种主流 IDE 中使用,并且行为类似。在此 Codelab 中,您将使用完全在网络浏览器中运行的 Google Cloud Shell 编辑器。您需要在 Cloud Shell 编辑器中启用和配置 Gemini,相关步骤如下所示:

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

72dc3df7b007fcde.png

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

CloudShellEditor.png

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

CloudCodeSignIn.png

  1. 如果您在右下角的状态栏中没有看到 Gemini 图标,则需要在 Cloud Code 中启用 Gemini。在执行此操作之前,请确保已在 IDE 中启用 Gemini(原称“面向开发者的 Duet AI”),方法是前往 Cloud Code 扩展程序 → 设置,然后输入文本 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 对话图标,打开 Gemini 对话窗口。此 Gemini Chat 窗口位于 IDE 中,并包含 IDE 中的代码,可作为讨论的上下文。输入提示 Explain this,然后查看回答:

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 专门为此目的设置的代理服务器。效果与您在本地实际运行该应用时相同。

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

e1b9d5832f6d0058.png

没错,25 用罗马数字表示就是 XXV!您必须在此处完成操作。

不妨再检查几个号码。25 可以,24 呢?

37982e385e17baac.png

也许我们有点操之过急,以为一切都正常。XXIIII 是 24 的正确转换吗?不应该是 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 对话窗口,然后再次询问

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 的底层模型会不时更新,因此给出的答案并不总是相同。如果您看到的是另一组代码,现在可以选择是否继续使用此 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. 增强代码

请注意,对于 24,系统会生成 XXIIII 等回答,而不是更常见的 XXIV,这些回答被认为是“不算错”,并将在未来的增强功能中得到改进。未来就在眼前。那些“不算错”的答案仍然令人恼火。

罗马数字中重复数字的第一条规则是:如果连续出现四个相同的数字,则应将其替换为其中一个数字,后跟下一个更高的数字。因此,XXIIII 应替换为 XXIV。同样,XXXX 应更改为 XL,而 CCCC 应变为 CD

问问 Gemini Code Assist 如何以这种方式更改 roman 变量的值,使其在 number_to_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 键接受建议,保存文件,然后再次运行 Web 服务器。否则,请手动添加此处示例中显示的代码行,然后保存文件。尝试一次困难的转换: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,该 ID 可能与项目名称相同。然后,重新运行 gcloud run deploy 命令。

  • 该命令会提示您需要某些 API,但这些 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 的标准模块,就像定义了 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 问问 Gemini 来改进一下它的外观。

打开 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 控制台信息中心将其删除,以避免日后产生任何潜在费用。

参考文档…