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。请按下面给出的步骤操作:
- 访问 https://console.cloud.google.com,并确保您已选择计划用于本实验的 Google Cloud 项目。点击右上角的 Gemini 图标。
- Gemini for Cloud 控制台窗口将在控制台右侧打开。点击启用按钮(如下所示)。如果您没有看到启用按钮,而是看到聊天界面,则表明您已经为该项目启用了 Gemini for Cloud,可以直接转到下一步。
- 启用后,你可以向它询问一两个问题,试用一下 Gemini。下方显示了一些示例查询,不过您可以尝试查询什么是 Cloud Run?
代码助理将回答您的问题。您可以点击右上角的 图标关闭 Code Assist 聊天窗口。
在 Cloud Shell Editor 中启用 Gemini
Gemini Code Assist 可在一些热门的 IDE 中使用,其行为方式与之类似。在此 Codelab 中,您将使用 Google Cloud Shell Editor,它完全在网络浏览器中运行。您需要在 Cloud Shell Editor 中启用和配置 Gemini,具体步骤如下所示:
- 通过如下所示的图标启动 Cloud Shell。启动 Cloud Shell 实例可能需要一两分钟的时间。
- 点击编辑器或打开编辑器按钮(视具体情况而定),然后等待 Cloud Shell Editor 出现。如果您看到试用新编辑器按钮,请点击该按钮。
- 如图所示,点击底部状态栏中的 Cloud Code - 登录按钮。按照说明对插件进行授权。如果您在状态栏中看到 Cloud Code - no project,请选择该选项,然后从项目列表中选择您打算使用的 Google Cloud 项目。
- 如果您在右下角的状态栏中没有看到 Gemini 图标,则需要在 Cloud Code 中启用该图标。在执行此操作之前,请确保已在 IDE 中启用 Gemini(以前称为 Duet AI for Developers),方法是依次转到 Cloud Code Extension → Settings,然后输入文本 Duet AI: Enable(如下所示)。确保选中此复选框。您应重新加载 IDE。这将在 Cloud Code 中启用 Gemini,并且您的 IDE 中将显示 Gemini 状态栏。
- 点击右下角的 Gemini 按钮(如图所示),然后选择已启用 Cloud AI Companion API 的正确 Google Cloud 项目。
- 选择 Google Cloud 项目后,请确保您能够在状态栏的 Cloud Code 状态消息中看到该信息,并且您还可以在右侧状态栏的状态栏中看到 Gemini,如下所示:
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”(说明此内容),然后查看答案:
您可以滚动此聊天窗口,查看完整回答。解释说我们可以在终端窗口中使用 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 专门为此目的设置的代理服务器。效果与实际在本地运行相同。
试试看。输入 25,然后按 Convert!
没错,25 是罗马数字中的 XXV!您必须在此处完成。
建议再多查看几个数字。25 个可行,那么 24 个呢?
可能我们有点仓促地认为一切都还顺利。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 提供的包含测试代码的答案。代码下方包含有关如何运行测试用例的详细信息:
尝试运行以下建议的命令:
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
的 XXIIII
等响应(而非更常见的 XXIV
)被认为“不太错误”,因此推迟了未来的增强功能。那未来就是现在。那些“没错”的答案仍然很烦人。
罗马数字中重复数字的第一条规则是:每当有 4 个相同的数字连续出现时,都应将其替换为其他数字,后跟下一个数字。因此,XXIIII
应替换为 XXIV
。同样,XXXX
应更改为 XL
,CCCC
应更改为 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?
建议在末尾添加一些代码:
在编辑器中复制/粘贴或输入这几行代码,然后看看会发生什么:
Gemini Code Assist 增加了更多行,以处理您在完成第一组替换后可能最终遇到的情况。例如,19 会转换为 XVIIII,然后是 XVIV,最后是正确的 XIX。
如果 Gemini Code Assist 提供了明显有用的建议,请按 Tab 键接受建议、保存文件,然后再次运行网络服务器。否则,请手动添加此处示例中显示的代码行,然后保存文件。尝试复杂的转换:1999:
正确!
立即重新运行测试。全部通过!
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 将构建容器并进行部署,将流量路由到容器并设置访问权限政策,然后显示首页链接:
您可以转到该链接并访问您的申请。
输入一个数字,然后按 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 的标准模块,就像用于定义 number_to_roman 函数的 calendar.py 文件一样。在您的本地计算机上,当 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 控制台信息中心将其删除,以免日后再产生任何费用。