1. Introdução
Neste laboratório, você vai usar o Gemini Code Assist, um colaborador com tecnologia de IA do Google Cloud, para adicionar testes a um aplicativo da Web em Python, além de encontrar e corrigir erros nesse aplicativo expostos pelos testes. Em seguida, você vai usar o Code Assist para criar testes de novas funcionalidades e gerar código para passar nesses testes e ampliar o app.
O que você vai fazer…
- Você usará o Editor do Cloud Shell para fazer o download do código de um aplicativo da Web atual.
- Você vai usar o Gemini Code Assist Chat no editor do Cloud Shell para fazer perguntas gerais sobre o Google Cloud.
- Você vai usar a assistência de código inline do Gemini Code Assist no editor do Cloud Shell para gerar testes do aplicativo, além de encontrar e corrigir erros e, em seguida, ampliar a funcionalidade do aplicativo.
O que você vai aprender…
- Como usar o Gemini Code Assist em várias tarefas de desenvolvedor, como geração de testes e de código.
- Como usar o Gemini Code Assist para aprender sobre o Google Cloud.
O que é necessário…
- Navegador da Web Google Chrome
- Uma conta do Gmail
- Um projeto do Cloud com faturamento ativado
- Gemini Code Assist ativado para seu projeto do Cloud
Este laboratório é voltado para desenvolvedores com todos os níveis de conhecimento, inclusive iniciantes. Mesmo que o aplicativo de exemplo esteja na linguagem Python, você não precisa saber programação em Python para entender o que está acontecendo. Nosso foco será nos familiarizar com os recursos do Gemini Code Assist para desenvolvedores.
2. Configuração
É preciso ter um projeto do Cloud com o faturamento ativado para usar neste laboratório. Agora vamos ativar a API Gemini no nosso projeto do Google Cloud. Siga estas etapas:
- Acesse https://console.cloud.google.com e confira se você selecionou o projeto do Google Cloud com que vai trabalhar neste laboratório. Clique no ícone do Gemini no canto superior direito.
- A janela do Gemini para o console do Cloud vai abrir no lado direito do console. Clique no botão Ativar, se mostrado abaixo. Se o botão Ativar não aparecer, mas a interface do Chat não aparecer, você já ativou o Gemini para Cloud no projeto e pode avançar diretamente para a próxima etapa.
- Depois de ativá-lo, você pode fazer uma ou duas consultas para testar o Gemini. Você verá alguns exemplos de consulta, mas é possível tentar algo como O que é o Cloud Run?
O Code Assist vai responder com a resposta à sua pergunta. Clique no ícone no canto superior direito para fechar a janela de chat do Code Assist.
Ativar o Gemini no editor do Cloud Shell
O Gemini Code Assist está disponível e se comporta de forma semelhante em vários ambientes de desenvolvimento integrados conhecidos. Neste codelab, você vai usar o Editor do Google Cloud Shell, que é totalmente executado no navegador da Web. Você precisa ativar e configurar o Gemini no editor do Cloud Shell. Siga estas etapas:
- Inicie o Cloud Shell com o ícone mostrado abaixo. Esse processo pode levar um ou dois minutos.
- Clique no botão Editor ou Abrir editor (pode ser o caso) e aguarde até que o editor do Cloud Shell seja exibido. Se estiver disponível, clique no botão Conheça o novo editor.
- Clique no botão Cloud Code – Fazer login na barra de status inferior, conforme mostrado. Autorize o plug-in conforme instruído. Se a barra de status mostrar Cloud Code – sem projeto, clique na opção e escolha o projeto do Google Cloud com que você quer trabalhar na lista.
- Se o ícone do Gemini não aparecer na barra de status, na parte de baixo à direita, será necessário ativar esse recurso no Cloud Code. Antes de fazer isso, verifique se o Gemini (antigo Duet AI para desenvolvedores) está ativado no ambiente de desenvolvimento integrado. Para isso, acesse Cloud Code Extension → Configurações e digite o texto Duet AI: ativar, conforme mostrado abaixo. Confira se a caixa de seleção está marcada. Atualize o ambiente de desenvolvimento integrado. Isso ativa o Gemini no Cloud Code, e a barra de status do Gemini aparece no seu ambiente de desenvolvimento integrado.
- Clique no botão Gemini no canto inferior direito, conforme mostrado, e selecione o projeto correto do Google Cloud em que ativamos a API Cloud AI Companion.
- Depois de selecionar seu projeto do Google Cloud, verifique se aparece na mensagem de status do Cloud Code na barra de status e se o Gemini também está ativado à direita, na barra de status, conforme mostrado abaixo:
O Gemini Code Assist está pronto para ser usado.
3. Faça o download e analise o aplicativo
Na janela do terminal, execute o comando para clonar o repositório com o código inicial e mude para o novo diretório. Se a janela do terminal não estiver mais aberta, clique no botão Terminal ou Abrir terminal para restaurá-lo:
git clone https://github.com/GoogleCloudPlatform/testing-with-duet-ai-codelab.git
cd testing-with-duet-ai-codelab
Abra o main.py no editor e clique no ícone de chat do Gemini no lado esquerdo do editor para abrir a janela do Gemini Chat. Esta janela do Gemini Chat está dentro do ambiente de desenvolvimento integrado e tem o código disponível como contexto para discussão. Digite o comando Explique isso e confira a resposta:
Role a janela do chat para conferir a resposta completa. A explicação diz que é possível executar esse programa localmente com o comando python3 main.py
na janela do terminal.
4. Executar no local
Mude para o diretório do repositório com cd ~/testing-with-duet-ai-codelab
, se necessário, e digite o comando python3 main.py
na janela do terminal:
Clique no link http://127.0.0.1:8080 para abrir uma nova guia do navegador na página inicial do aplicativo:
O aplicativo está sendo executado "localmente". Na verdade, o editor do Cloud Shell fez uma operação mágica. O aplicativo está sendo executado no Cloud Shell, não no seu computador. Quando você clicava no link, uma guia abria uma guia, não para o endereço local real http://127.0.0.1:8080, mas para um servidor proxy configurado apenas para essa finalidade pelo Cloud Shell. O efeito é o mesmo que seria executado localmente.
Faça um teste. Digite 25 e pressione Converter!
Isso mesmo, 25 é XXV em algarismos romanos! Você deve ter concluído aqui.
Tente mais alguns números. 25 deu certo, e quanto a 24?
Talvez estivéssemos um pouco apressados para pensar que tudo estava bem. XXIIII é a conversão correta para 24? Não deveria ser XXIV?
É possível argumentar que XXIIII está certo, mas não é bem o que as pessoas esperam. No entanto, como isso não está errado (muitos relógios mostram 4 como numeral romano IIII), deixam esse problema para uma melhoria futura.
Que tal testar números negativos? Zero? Não é possível representar esses números em algarismos romanos. Nada parece voltar para o usuário, e isso parece um erro que precisa ser resolvido.
Testes podem ajudar a encontrar e eliminar erros, e o Gemini Code Assist pode nos ajudar a criar e usar testes.
5. Adicionar testes
Volte para a janela do Gemini Chat e faça uma pergunta
How can I test the number_to_roman function?
Leia a resposta, que deve incluir a discussão dos módulos unittest e pytest.
O Gemini Code Assist pode criar esses testes para você. Abra calendar.py, onde está o código de conversão real, no editor, volte à janela do Gemini Chat e faça outra pergunta
How can I test the number_to_roman function?
A resposta agora é mais específica, incluindo até mesmo um módulo unittest que pode ser copiado ou injetado em um novo arquivo:
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")
Talvez você encontre um código diferente do exemplo acima. Os modelos do Gemini Code Assist são atualizados periodicamente, então as respostas nem sempre serão as mesmas. Caso encontre um conjunto de código diferente, você pode copiar o código mostrado aqui para escolher se quer continuar com os exemplos mostrados aqui ou testar a resposta alternativa que o Gemini Code Assist passou. Se tiver tempo, tente os dois caminhos. O Gemini Code Assist é um assistente de programação para você usar como quiser.
Clique na seta dupla no canto superior direito da janela do Gemini Chat para criar um arquivo com o código do teste de unidade ou use o ambiente de desenvolvimento integrado para criar um arquivo e colar o código mostrado neste laboratório. Pressione CTRL-S ou CMD-S nessa janela para salvá-lo e chame o arquivo salvo calendar-unittest.py.
Volte ao terminal, pressione CTRL-C para interromper o servidor da Web que você deixou em execução anteriormente e vai receber um prompt do shell. Digite o comando
python3 calendar-unittest.py
para executar os novos testes.
Não há saída. Isso não é o que eu esperava. Tudo passou em silêncio? Você quer ter certeza disso. Confira a resposta do Gemini Code Assist que incluiu o código de teste. Abaixo do código, havia mais informações sobre como executar o caso de teste:
Tente executar o comando recomendado:
python -m unittest discover
Você pode ter um problema se sua máquina não atribuir um alias ao comando python3
para python
. Nesse caso, execute:
python3 -m unittest discover
O comando é executado, mas retorna Ran 0 tests in 0.000s
. O módulo tem vários testes. O que está acontecendo?
É a última palavra no comando, discover
. De onde veio? Aparentemente, o Gemini Code Assist esperava que o código de teste fosse salvo em um arquivo chamado discover
ou discover.py
, mas não especificou isso. Como você realmente salvou o arquivo em calendar-unittest.py
, tente executar o comando:
python3 -m unittest calendar-unittest
Várias saídas serão exibidas, começando com algo assim:
$ 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
A primeira linha mostra um período para cada teste aprovado e um F
para cada reprovação. A maioria dos testes está falhando. Em seguida, ele lista os testes com falha individualmente, mostrando a saída esperada e a saída real. Não está claro em que ordem esses testes foram executados. Ele estava em ordem alfabética pelo nome do teste, não na ordem em que os testes aparecem no arquivo. Então, test_convert_1
foi executado primeiro, depois test_convert_1990
, depois test_convert_2023
e assim por diante. Os casos de teste de 1
e 2023
são os únicos aprovados.
Ao testar esse código pela primeira vez, você percebeu que ele converteu 24
em XXIIII
, o que não estava exatamente errado, mas não é o formato comum em que IIII
é convertido em IV
. Todos os testes reprovados foram de casos semelhantes. Quando esse problema foi observado pela primeira vez, o laboratório disse: "Como ele não está realmente errado (muitos relógios mostram 4
como numeral romano IIII
), deixe esse problema para uma melhoria futura".
É possível mudar os casos de teste para esperar e aceitar o que é "realmente errado" responda ao que o código foi fornecido ou aceite que é hora desse "aprimoramento futuro". Portanto, a próxima etapa é corrigir o código, com a ajuda do Gemini Code Assist, para dar as respostas mais aceitáveis que os testes esperam.
6. Aprimorar o código
Lembre-se de que respostas como XXIIII
para 24
, em vez de XXIV
mais comuns, foram consideradas "não muito erradas" e foram adiados para aprimoramentos futuros. Esse futuro é agora. Esses que “não estão realmente errados” as respostas ainda são irritantes.
A primeira regra para dígitos repetidos em algarismos romanos é: sempre que você tiver quatro dígitos idênticos em uma linha, eles deverão ser substituídos por um dos dígitos seguido pelo próximo dígito mais alto. Portanto, XXIIII
precisa ser substituído por XXIV
. Da mesma forma, XXXX
precisa ser mudado para XL
, e CCCC
precisa se tornar CD
.
Pergunte ao Gemini Code Assist como mudar o valor da variável roman dessa maneira um pouco antes de ela ser retornada por 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?
A sugestão é adicionar um código no final:
Copie/cole ou digite essas linhas no editor e veja o que acontece:
O Gemini Code Assist adicionou mais linhas para lidar com os casos que você pode enfrentar depois das primeiras substituições. Por exemplo, o número 19 seria convertido para XVIIII, depois para XVIV e, finalmente, para o XIX correto.
Se o Gemini Code Assist fez sugestões aparentemente úteis, pressione Tab para aceitar as recomendações, salvar o arquivo e executar o servidor da Web de novo. Caso contrário, adicione manualmente as linhas mostradas no exemplo e salve o arquivo. Tente uma conversão difícil: 1999:
Correto.
Agora, execute novamente os testes. Todos eles são aprovados!
O aplicativo da Web parece estar pronto para ser colocado em produção.
7. Implantar no Cloud Run
O Cloud Run vai executar um aplicativo conteinerizado na Internet para você. Para aplicativos escritos em frameworks comuns, como Flash, o comando gcloud run deploy
cria o contêiner antes de implantá-lo. Execute o comando:
gcloud run deploy
No terminal. Quando o local do código-fonte for solicitado, pressione Enter para aceitar o local correto sugerido. Da mesma forma, quando um nome de serviço for solicitado, pressione Enter para aceitar a sugestão.
O comando pode falhar porque a gcloud não consegue determinar o projeto a ser usado. Nesse caso, execute o comando:
gcloud config set core/project <project-id>
em que
é substituído pelo ID do projeto, que pode ser igual ao nome dele. Em seguida, execute novamente o comando gcloud run deploy
.
- O comando vai mostrar que algumas APIs são necessárias e ainda não estão ativadas. Digite y para ativá-las.
- Quando for solicitado que você selecione uma região, escolha uma que seja conveniente para você. Inserir o número correspondente a
us-central1
é uma opção segura. - Quando solicitado, digite "Y" para continuar.
- É preciso permitir invocações não autenticadas deste serviço do Cloud Run. A opção de autenticação usada pelo Cloud Run é adequada para ser usada por programas que chamam o serviço. Como se trata de um site, você não vai usar a autenticação.
O Google Cloud vai criar e implantar o contêiner, rotear o tráfego para ele, definir políticas de acesso e mostrar o link para a página inicial:
Você pode clicar nesse link e acessar seu aplicativo.
Digite um número, pressione Enter e pronto!
O quê?!
Funcionou na sua máquina. Por que ele não terminou?
Descubra. Pergunte ao Gemini Code Assist,
Why am I getting an internal server error on cloud run?
O Gemini Code Assist pode ler o arquivo de registro, que diz algo semelhante. Vamos perguntar ao Gemini Code Assist como você pode ver os registros por conta própria:
Vá em frente e crie as chaves. Procure linhas com vermelho! indicadores de erro, conforme abaixo:
Isso é seguido por muitas linhas de detalhes na pilha de chamadas que chegam até aqui, mas há o seguinte:
No arquivo calendar.py, você encontra a função number_to_roman. E você sabe que está certo, porque funcionou na sua máquina. O que poderia ser diferente no Cloud Run?
A resposta é complicada. Há um módulo padrão incluído no Python3 chamado calendar, assim como o arquivo calendar.py em que a função number_to_roman está definida. Na máquina local, quando o Python procurou um módulo chamado calendar, ele pesquisou primeiro o diretório do seu aplicativo. Aparentemente, o Python no Cloud Run procurou primeiro os módulos padrão, os importou e não encontrou a função number_to_roman.
Esses tipos de diferenças em ambientes são sempre possíveis. Felizmente, quando um aplicativo é conteinerizado, ele carrega o ambiente dentro dele. Portanto, onde quer que seja executado, você pode esperar o mesmo comportamento. Se você tivesse executado o mesmo aplicativo conteinerizado localmente que o Cloud Run, você teria o mesmo problema.
Corrigir este problema. Você precisa alterar o nome do módulo de agenda local para algo que não seja também um nome de módulo padrão. Renomeie o arquivo calendar.py como my_calendar.py e altere as linhas import calendar
em main.py e calendar-unittest.py para import my_calendar
. Por fim, altere a linha
roman = calendar.number_to_roman(number)
a
roman = my_calendar.number_to_roman(number)
Teste localmente, execute os testes e reimplante:
gcloud run deploy
Agora ela funciona:
Você pode compartilhar esse URL, e qualquer pessoa que precisar de uma ferramenta de conversão de números romanos poderá usar a sua.
8. Opcional: melhorar a aparência
Seu aplicativo está funcionando bem e pode ser acessado por qualquer pessoa na web. Mas ela é um pouco simples. Antes de contar para todo mundo, por que não pedir ao Gemini Code Assist para melhorar a aparência dele?
Abra o arquivo templates/index.html
. Na janela de conversa no Gemini, pergunte:
Make this index.html file use material design.
A resposta é fazer adições ao arquivo atual, resultando em algo semelhante ao seguinte:
<!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>
Use o ícone para copiar o código sugerido e colar no conteúdo existente de index.html. No terminal, execute python3 main.py
e clique no link para abrir uma janela de visualização. A página está um pouco menos simples agora:
Você pode repetir esse processo com o arquivo convert.html, se quiser.
O Gemini Code Assist conhece bastante CSS e pode ajudar você a estilizar as páginas do aplicativo de várias maneiras. Isso é apenas o começo.
Como você quer compartilhar esse aplicativo, não se esqueça de reimplantá-lo no Cloud Run:
gcloud run deploy
Você pode passar o URL para pessoas que precisam fazer a conversão para algarismos romanos.
9. Parabéns!
Parabéns! Você usou o Gemini Code Assist para adicionar testes a um aplicativo, corrigir erros e aprimorar a funcionalidade.
Quando terminar de usar o aplicativo que você criou, ele poderá ser excluído do painel do console do Cloud para evitar cobranças futuras.