Wprowadzenie do testowania za pomocą narzędzia Gemini Code Assist

1. Wstęp

W tym module użyjesz Gemini Code Assist, opartego na AI współpracy w Google Cloud, aby dodać testy do istniejącej aplikacji internetowej w języku Python, a także znaleźć i naprawić błędy tej aplikacji ujawnione w ramach testów. Następnie w Code Assist tworzenie testów nowych funkcji oraz generowanie kodu pozwalającego zaliczyć te testy i rozszerzyć aplikację.

Co zrobisz...

  • Użyjesz edytora Cloud Shell, aby pobrać kod istniejącej aplikacji internetowej.
  • Do zadawania ogólnych pytań dotyczących Google Cloud będziesz używać czatu z pomocą kodu Gemini w edytorze Cloud Shell.
  • Będziesz korzystać z pomocy wbudowanej w kodowaniu Gemini Code Assist w edytorze Cloud Shell, aby generować testy aplikacji, przeprowadzać testy, znajdować i naprawiać błędy, a także rozszerzać funkcje aplikacji.

Czego się nauczysz...

  • Jak używać narzędzia Gemini Code Assist do kilku zadań programistycznych, takich jak generowanie testów i generowanie kodu.
  • Jak korzystać z narzędzia Gemini Code Assist do poznawania Google Cloud.

Czego potrzebujesz...

  • Przeglądarka Chrome
  • konto Gmail.
  • Projekt Cloud z włączonymi płatnościami
  • W projekcie Cloud włączono usługę Gemini Code Assist

Ten moduł jest przeznaczony dla programistów na każdym poziomie, w tym początkujących. Chociaż przykładowa aplikacja jest napisana w języku Python, nie musisz znać się na programowaniu w tym języku, aby zrozumieć, co się dzieje. Skupimy się na zapoznaniu się z możliwościami narzędzia Gemini Code Assist przeznaczonego dla programistów.

2. Konfiguracja

Aby móc skorzystać z tego modułu, musisz już mieć projekt Cloud z włączonymi płatnościami. Włączymy teraz interfejs Gemini API w projekcie Google Cloud. Wykonaj te czynności:

  1. Wejdź na https://console.cloud.google.com i wybierz projekt Google Cloud, w którym zamierzasz pracować w tym module. Kliknij ikonę Gemini, która wyświetla się w prawym górnym rogu.

GeminiBanner.png

  1. Po prawej stronie konsoli otworzy się okno konsoli Gemini for Cloud. Kliknij przycisk Włącz, jeśli jest widoczny poniżej. Jeśli nie widzisz przycisku Włącz, a zamiast tego widzisz interfejs Google Chat, oznacza to, że usługa Gemini for Cloud jest już włączona w projekcie i możesz przejść bezpośrednio do następnego kroku.

GeminiApiEnable.png

  1. Gdy jest włączona, możesz przetestować Gemini, wysyłając zapytanie o co najmniej 2 zapytania. Zobaczysz kilka przykładowych zapytań, ale możesz na przykład sprawdzić, co to jest Cloud Run?.

GeminiChatWindow.png

Zespół pomocy kodu udzieli odpowiedzi na Twoje pytanie. Aby zamknąć okno czatu w Asystencie kodu, możesz kliknąć ikonę f68286b2b2ea5c0a.png w prawym górnym rogu.

Włączanie Gemini w edytorze Cloud Shell

Narzędzie Gemini Code Assist jest dostępne i działa podobnie w kilku popularnych IDE. W tym ćwiczeniu w programie użyjesz edytora Google Cloud Shell, który działa w całości w przeglądarce. Musisz włączyć i skonfigurować Gemini w edytorze Cloud Shell, a potem wykonaj te czynności:

  1. Uruchom Cloud Shell, korzystając z ikony widocznej poniżej. Uruchamianie instancji Cloud Shell może potrwać kilka minut.

72dc3df7b007fcde.png

  1. Kliknij przycisk Edytor lub Otwórz edytor (w razie potrzeby) i poczekaj, aż pojawi się edytor Cloud Shell. Jeśli widzisz przycisk Wypróbuj nowy edytor, kliknij go.

CloudShellEditor.png

  1. Na dolnym pasku stanu kliknij przycisk Cloud Code – Sign in (Zaloguj się). Autoryzuj wtyczkę zgodnie z instrukcjami. Jeśli na pasku stanu zobaczysz komunikat „Cloud Code – no project” (Cloud Code – brak projektu), zaznacz go, a następnie wybierz odpowiedni projekt Google Cloud z listy projektów, w których zamierzasz pracować.

CloudCodeSignIn.png

  1. Jeśli nie widzisz ikony Gemini na pasku stanu u dołu po prawej stronie, musisz ją włączyć w Cloud Code. Zanim to zrobisz, upewnij się, że usługa Gemini (dawniej Duet AI for Developers) jest włączona w IDE. Aby to zrobić, otwórz Rozszerzenie Cloud Code → Ustawienia i wpisz tekst Duet AI: Włącz, jak pokazano poniżej. Upewnij się, że pole wyboru jest zaznaczone. Załaduj ponownie IDE. Spowoduje to włączenie Gemini w Cloud Code, a w Twoim IDE pojawi się pasek stanu Gemini.

EnableDuetAiSetting.png

  1. Kliknij przycisk Gemini w prawym dolnym rogu, jak pokazano na ilustracji, i wybierz odpowiedni projekt Google Cloud, dla którego włączyliśmy Cloud AI Companion API.

GeminiSelectGoogleCloudProject.png

  1. Po wybraniu projektu Google Cloud sprawdź, czy widzisz komunikat o stanie Cloud Code na pasku stanu, a po prawej stronie masz włączoną obsługę Gemini:

GeminiEnabledStatusBar.png

Usługa Gemini Code Assist jest gotowa do użycia.

3. Pobieranie i sprawdzanie aplikacji

W oknie terminala uruchom polecenie sklonowania repozytorium kodem początkowym, a następnie przejdź do nowego katalogu (jeśli okno terminala nie jest już otwarte, kliknij przycisk Terminal lub Otwórz terminal, aby je przywrócić):

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

Otwórz plik main.py w edytorze, a następnie otwórz okno Gemini Chat, klikając ikonę czatu Gemini po lewej stronie edytora. To okno Gemini Chat znajduje się w IDE i zawiera kod w IDE jako kontekst do dyskusji. Wpisz prompt Wyjaśnij to i wyświetl odpowiedź:

GeminiChatExplainThis.png

Możesz przewinąć to okno czatu, aby zobaczyć całą odpowiedź. Wyjaśnienie wskazuje, że możemy uruchomić ten program lokalnie poleceniem python3 main.py w oknie terminala.

4. Uruchom lokalnie

W razie potrzeby przejdź do katalogu repozytoriów, wpisując cd ~/testing-with-duet-ai-codelab i w oknie terminala wpisz polecenie python3 main.py:

3bf558e9cea15375.png

Kliknij link http://127.0.0.1:8080, aby otworzyć nową kartę przeglądarki i otworzyć stronę główną aplikacji:

fb06f382a4c03e4c.png

Aplikacja działa „lokalnie”. W rzeczywistości edytor Cloud Shell okazał się tu nieco magiczny. Aplikacja działa w Cloud Shell, a nie na Twoim komputerze. Kliknięcie linku powoduje otwarcie karty, która nie prowadzi do rzeczywistego adresu lokalnego http://127.0.0.1:8080, a na serwer proxy skonfigurowany specjalnie do tego celu przez Cloud Shell. Efekt jest taki sam jak w przypadku działania lokalnego.

Wypróbuj go. Wpisz 25 i naciśnij Convert!

e1b9d5832f6d0058.png

Tak, 25 to XXV w cyfrach rzymskich! Musisz to zrobić tutaj.

Sprawdź jeszcze kilka wyników. 25 się sprawdziło. A 24?

37982e385e17baac.png

Może się spieszyliśmy, żeby uznać, że wszystko jest w porządku. Czy XXIIII to prawidłowa konwersja na 24? XXIV, zgadza się?

Można stwierdzić, że XXIIII ma rację, ale nie jest to coś, czego zwykle spodziewają się ludzie. Nie jest to jednak błędna sytuacja (wiele zegarów pokazuje 4 liczbę rzymską IIII), więc warto ją poprawić.

A może chcesz spróbować liczb ujemnych? Zero? Takich liczb nie można przedstawić za pomocą cyfr rzymskich. Wygląda na to, że użytkownik nie zareagował, co oznacza, że trzeba naprawić błąd.

Testowanie pomaga znaleźć i wyeliminować błędy, a Gemini Code Assist może ułatwić nam pisanie i wykorzystywanie testów.

5. Dodawanie testów

Wróć do okna czatu Gemini i zapytaj

How can I test the number_to_roman function?

Zapoznaj się z odpowiedzią. Powinno ono obejmować omówienie modułów unittest i pytest.

Być może chcesz, aby program Gemini Code Assist pisał te testy za Ciebie. Otwórz w edytorze plik calendar.py, w którym znajduje się rzeczywisty kod konwersji, wróć do okna czatu Gemini i zapytaj jeszcze raz.

How can I test the number_to_roman function?

Odpowiedź jest teraz bardziej szczegółowa – zawiera nawet moduł testu jednostkowego, który możesz skopiować lub wstawić do nowego pliku:

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")

W powyższym przykładzie może być inny kod niż w przykładzie powyżej. Podstawowe modele narzędzia Gemini Code Assist są od czasu do czasu aktualizowane, więc odpowiedzi nie zawsze będą takie same. Jeśli widzisz inny zestaw kodu, możesz teraz wybrać, czy chcesz kontynuować z przykładami przedstawionymi w tych ćwiczeniach z programowania, kopiując wyświetlany tu kod. Możesz też wypróbować alternatywną odpowiedź oferowaną przez narzędzie Gemini Code Assist. Jeśli masz czas, możesz nawet wypróbować obie ścieżki. Gemini Code Assist to asystent kodowania, którego możesz używać według własnego uznania.

Kliknij podwójną strzałkę w prawym górnym rogu okna czatu Gemini, aby utworzyć nowy plik zawierający kod testu jednostki, lub użyj IDE, aby utworzyć nowy plik i wkleić kod pokazany w tym module. Naciśnij w tym oknie klawisze CTRL-S lub CMD-S, aby go zapisać, i wywołaj zapisany plik calendar-unittest.py.

Wróć do terminala i naciśnij CTRL+C, aby zatrzymać wcześniej uruchomiony serwer WWW i wyświetlić monit powłoki. Wpisz polecenie

python3 calendar-unittest.py

aby uruchomić nowe testy.

Brak danych wyjściowych. Nie tego się spodziewaliśmy. Czy wszystko przebiegło po cichu? Na pewno chcesz to wiedzieć. Spójrz na odpowiedź od zespołu Gemini Code Assist, która uwzględniała kod testowy. Pod kodem znajduje się więcej informacji o tym, jak uruchomić przypadek testowy:

run-unittest.png

Spróbuj uruchomić zalecane polecenie:

python -m unittest discover

Problem może wystąpić, jeśli komputer nie tworzy aliasu polecenia python3 na python. W takim przypadku uruchom polecenie:

python3 -m unittest discover

Polecenie jest uruchamiane, ale zwraca wartość Ran 0 tests in 0.000s. Moduł zawiera kilka testów. Co się dzieje?

To ostatnie słowo w poleceniu: discover. Skąd się wzięła ta funkcja? Wygląda na to, że zespół Gemini Code Assist oczekiwał, że kod testowy zostanie zapisany w pliku o nazwie discover lub discover.py, ale nie określił, co należy zrobić. Ponieważ plik został zapisany w calendar-unittest.py, spróbuj uruchomić to polecenie:

python3 -m unittest calendar-unittest

Teraz widzisz dużo danych wyjściowych, na przykład mniej więcej takich:

$ 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

Pierwszy wiersz zawiera kropkę za każdy test z wynikiem pozytywnym, a w przypadku każdego innego niezaliczonego testu – F. Większość testów kończy się niepowodzeniem. Następnie wyświetla listę niepowodzeń z poszczególnymi testami, pokazując oczekiwane i rzeczywiste dane wyjściowe. Nie jest jasne, w jakiej kolejności przeprowadzono te testy. Testy zostały uporządkowane alfabetycznie według nazwy testu, a nie kolejności występowania w pliku. Więc test_convert_1 uruchomił się jako pierwszy, potem test_convert_1990, potem test_convert_2023 i tak dalej. Testy elementów 1 i 2023 to jedyne te, które zostały pozytywnie zakończone.

Przy pierwszym użyciu tego kodu zauważyłeś, że przekształcił on 24 na XXIIII. Nie jest to jednak błąd, ale nie jest to typowy format, w którym IIII jest konwertowany na IV. Wszystkie nieudane testy dotyczyły podobnych przypadków. Gdy po raz pierwszy zauważono ten problem, laboratorium podało: „To nie jest jednak tak naprawdę błędne (wiele zegarów pokazuje 4 jako cyfrę rzymską IIII), więc zostawia go na później.

Możesz zmienić grupy testowe tak, aby się spodziewać, i zaakceptować „niewłaściweniewłaściwe” odpowiedzi na podany kod lub zaakceptować „przyszłe ulepszenie”. Następnym krokiem jest więc poprawienie kodu w pomocy Gemini Code Assist, aby odpowiedzi były bardziej akceptowalne.

6. Ulepszanie kodu

Pamiętaj, że odpowiedzi takie jak XXIIII w przypadku 24, a nie bardziej powszechne XXIV, zostały uznane za „nieprawdziwe” i odrzucone w przyszłości. Ta przyszłość nadeszła już teraz. Te „niezłe” odpowiedzi nadal są irytujące.

Pierwsza zasada dotycząca powtarzających się cyfr w liczebnikach rzymskich: za każdym razem, gdy w wierszu są cztery identyczne cyfry, należy je zastąpić jedną z cyfr, po której następuje kolejna, wyższa cyfra. Dlatego właściwość XXIIII powinna zostać zastąpiona przez XXIV. Analogicznie pole XXXX należy zmienić na XL, a pole CCCC powinno zmienić się na CD.

Zapytaj zespół pomocy kodu Gemini o jak zmienić wartość zmiennej roman w ten sposób tuż przed jej zwróceniem przez funkcję 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?

Warto dodać kod na końcu:

6437c3fa2c5fabd1.png

Skopiuj i wklej te wiersze lub wpisz je w edytorze i sprawdź, co się dzieje:

dcefa568cab82fb7.png

Narzędzie Gemini Code Assist dodało więcej wierszy do obsługi przypadków, które mogą pojawić się po wykonaniu pierwszego zestawu podstawień. Na przykład numer 19 zostanie przekonwertowany na format XVIII, następnie na XVIV, a na koniec na prawidłowy XIX.

Jeśli narzędzie Gemini Code Assist zaproponowało pozornie przydatne sugestie, naciśnij klawisz Tab, aby zaakceptować rekomendacje, zapisać plik i ponownie uruchomić serwer WWW. W przeciwnym razie ręcznie dodaj wiersze pokazane w przykładzie i zapisz plik. Przed Tobą trudny okres: 1999:

a206999587fdc9.png

Zgadza się!

Ponownie uruchom testy. Wszystkie zaliczą!

Aplikacja internetowa wydaje się gotowa do wdrożenia w środowisku produkcyjnym.

7. Wdrożenie w Cloud Run

Cloud Run uruchomi skonteneryzowaną aplikację w internecie. W przypadku aplikacji napisanych przy użyciu popularnych platform, takich jak Flash, polecenie gcloud run deploy utworzy nawet dla Ciebie ten kontener przed jego wdrożeniem. Uruchom polecenie:

gcloud run deploy

W terminalu. Gdy pojawi się pytanie o lokalizację kodu źródłowego, naciśnij Enter, aby zaakceptować sugerowaną prawidłową lokalizację. Podobnie gdy zostanie wyświetlona prośba o podanie nazwy usługi, naciśnij Enter, aby zaakceptować sugestię.

Polecenie może zakończyć się niepowodzeniem, ponieważ gcloud nie może określić, którego projektu użyć. W takim przypadku uruchom polecenie:

gcloud config set core/project <project-id>

gdzie jest zastępowana identyfikatorem projektu, który może być taki sam jak jego nazwa. Następnie uruchom ponownie polecenie gcloud run deploy.

  • Polecenie wyświetli komunikat, że niektóre interfejsy API są potrzebne, ale nie zostały jeszcze włączone. Wpisz „y”, aby je włączyć.
  • Po wyświetleniu prośby o wybór regionu wybierz ten, który Ci odpowiada. Wpisanie numeru odpowiadającego us-central1 jest bezpieczne.
  • Gdy pojawi się prośba, wpisz Y, aby kontynuować.
  • Musisz zezwolić na unauthenticated wywołania tej usługi Cloud Run. Opcja uwierzytelniania używana przez Cloud Run jest odpowiednia dla programów wywołujących usługę. Ponieważ jest to strona internetowa, nie użyjesz uwierzytelniania.

Google Cloud utworzy kontener, wdroży go, skieruje do niego ruch i ustawi zasady dostępu. Następnie wyświetli link do strony głównej:

94ba7d8d63a44afd.png

Aby otworzyć aplikację, kliknij ten link.

a2e51666dfd33a9f.png

Wpisz liczbę, naciśnij Enter, a potem tada!

5021535ac991a95c.png

Co?

Udało się. Dlaczego to jeszcze nie koniec?

Sprawdź. Zespół pomocy Gemini

Why am I getting an internal server error on cloud run?

4b24321251d6eddf.png

Wygląda na to, że Gemini Code Assist może odczytać plik dziennika, który ma podobny komunikat. Zapytajmy Gemini Code Assist, jak analizować dane w dziennikach:

92d1855be73ef1d.png

Zrób to. Poszukaj linii z czerwonymi symbolami !! , jak poniżej:

9bed4f9ed82de21c.png

Po tym nagłówku następuje kilka wierszy szczegółów dotyczących stosu wywołań, ale dalej:

47fc93be845f4e3f.png

W pliku calendar.py widzisz funkcję number_to_roman. Wiesz, że to jest dobre rozwiązanie, bo sprawdza się na Twoim komputerze. Co może się zmienić w Cloud Run?

Odpowiedź jest podchwytliwa. W Pythonie3 zawarty jest standardowy moduł o nazwie calendar, tak jak plik calendar.py, w którym zdefiniowano funkcję number_to_roman. Podczas wyszukiwania modułu o nazwie calendar na komputerze lokalnym Python przeszukał najpierw katalog aplikacji. Wygląda na to, że Python w Cloud Run najpierw szukał modułów standardowych, zaimportował je, ale nie znalazł funkcji number_to_roman.

Takie różnice w środowiskach są zawsze możliwe. Na szczęście, gdy aplikacja znajduje się w kontenerze, zawiera swoje środowisko, więc można oczekiwać tego samego działania przy każdym uruchomieniu. Gdyby lokalnie ta sama skonteneryzowana aplikacja była uruchamiana w Cloud Run, problem zniknąłby.

Rozwiąż ten problem. Musisz zmienić nazwę modułu kalendarza lokalnego na inną niż standardowa nazwa modułu. Zmień nazwę pliku calendar.py na my_calendar.py, a następnie zmień wiersze import calendar w main.py i calendar-unittest.py na import my_calendar. Na koniec zmień linię

roman = calendar.number_to_roman(number)

 

roman = my_calendar.number_to_roman(number)

Wypróbuj ją lokalnie, przeprowadź testy, a potem wdróż ponownie:

gcloud run deploy

A teraz działa:

ed288801c6825eb1.png

Możesz udostępnić ten URL i każdy, kto potrzebuje narzędzia do konwersji w postaci liczby rzymskiej, będzie mógł użyć Twojego.

8. Opcjonalnie: zmień wygląd na ładniejszy

Twoja aplikacja działa prawidłowo i jest dostępna dla wszystkich użytkowników internetu. Jest to jednak trochę proste. Zanim o tym wszystkim opowiesz, zapytaj zespół Gemini Code Assist o poprawę wyglądu interfejsu.

Otwórz plik templates/index.html. W oknie czatu Gemini zadaj pytanie:

Make this index.html file use material design.

Odpowiedź to dodanie elementów do bieżącego pliku, co daje podobny efekt:

<!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>

Kliknij ikonę, by skopiować sugerowany kod i wkleić go w obecnej zawartości pliku index.html. W terminalu uruchom polecenie python3 main.py i kliknij link, aby otworzyć okno podglądu. Strona jest teraz trochę mniej przejrzysta:

295643ec03fcaafc.png

Jeśli chcesz, możesz to powtórzyć z plikiem convert.html.

Gemini Code Assist zna sporo języka CSS, więc możesz liczyć na pomoc w dostosowywaniu stylów stron aplikacji na różne sposoby. To dopiero początek.

Chcesz udostępnić tę aplikację, więc wdróż ją ponownie w Cloud Run:

gcloud run deploy

Możesz go przekazać osobom, które mają przekonwertować go na cyfry rzymskie.

9. Gratulacje!

Gratulujemy – udało Ci się utworzyć z Gemini Code Assist testy w aplikacji, naprawić w niej błędy i dodać rozszerzone funkcje.

Gdy skończysz korzystać z utworzonej aplikacji, możesz usunąć ją z panelu konsoli Cloud, aby uniknąć ewentualnych przyszłych opłat.

Materiały referencyjne...