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

1. Wprowadzenie

W tym module użyjesz Gemini Code Assist, opartego na AI rozwiązania wspomagającego w Google Cloud, aby dodać testy do istniejącej aplikacji internetowej w języku Python oraz znaleźć i naprawić błędy w tej aplikacji ujawnione w ramach testów. Następnie będziesz używać Code Assist do tworzenia testów nowych funkcji oraz generowania kodu do fałszowania wyników i rozszerzania aplikacji.

Co możesz zrobić...

  • Użyjesz edytora Cloud Shell do pobrania kodu istniejącej aplikacji internetowej.
  • Czatu wspomagającego kod w Gemini Code w edytorze Cloud Shell będziesz używać do zadawania ogólnych pytań na temat Google Cloud.
  • Będziesz korzystać z wbudowanej pomocy w zakresie kodu Gemini Code Assist w edytorze Cloud Shell do generowania testów aplikacji, przeprowadzania testów oraz znajdowania i naprawiania błędów oraz rozszerzania funkcjonalności aplikacji.

Czego się nauczysz...

  • Jak używać Gemini Code Assist do różnych zadań programistycznych, takich jak generowanie testów i generowanie kodu.
  • Jak korzystać z Gemini Code Assist, aby poznać Google Cloud.

Co będzie Ci potrzebne...

  • Przeglądarka Chrome
  • konto Gmail,
  • Projekt Cloud z włączonymi płatnościami
  • Usługa Gemini Code Assist została włączona w Twoim projekcie Cloud

Ten moduł jest przeznaczony dla programistów na wszystkich poziomach zaawansowania, w tym początkujących. Chociaż przykładowa aplikacja jest w języku Python, nie musisz znać się na programowaniu w tym języku, aby zrozumieć, co się dzieje. Skupimy się na zapoznania się z możliwościami Gemini Code Assist dla deweloperów.

2. Konfiguracja

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

  1. Otwórz stronę https://console.cloud.google.com i upewnij się, że wybrany jest projekt Google Cloud, z którym zamierzasz pracować w tym module. Kliknij ikonę Gemini, która jest widoczna w prawym górnym rogu.

GeminiBanner.png

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

GeminiApiEnable.png

  1. Po włączeniu Gemini możesz przetestować Gemini, zadając mu jedno lub dwa zapytania. Wyświetlamy kilka przykładowych zapytań. Możesz na przykład zapytać Co to jest Cloud Run?.

GeminiChatWindow.png

Przedstawiciel pomocy Code Assist udzieli odpowiedzi na Twoje pytanie. Aby zamknąć okno czatu z Asystentem kodu, w prawym górnym rogu kliknij ikonę f68286b2b2ea5c0a.png.

Włączanie Gemini w edytorze Cloud Shell

Gemini Code Assist jest dostępny i działa podobnie w kilku popularnych IDE. W ramach tego ćwiczenia z programowania użyjesz edytora Google Cloud Shell, który w całości uruchamia się w przeglądarce. Musisz włączyć i skonfigurować Gemini w edytorze Cloud Shell. Wykonaj te czynności:

  1. Uruchom Cloud Shell, klikając ikonę widoczną poniżej. Uruchomienie 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. Kliknij przycisk Cloud Code – Zaloguj się na dolnym pasku stanu, jak pokazano na ilustracji. Autoryzuj wtyczkę zgodnie z instrukcjami. Jeśli na pasku stanu widzisz komunikat „Cloud Code – no project” (Cloud Code – brak projektu), zaznacz tę pozycję, a następnie wybierz konkretny projekt Google Cloud z listy projektów, z którymi zamierzasz pracować.

CloudCodeSignIn.png

  1. Jeśli nie widzisz ikony Gemini na pasku stanu w prawym dolnym rogu, musisz włączyć ją w Cloud Code. Zanim to zrobisz, upewnij się, że w IDE jest włączona usługa Gemini (wcześniej Duet AI dla programistów) – otwórz Rozszerzenie Cloud Code → Ustawienia, a następnie wpisz tekst Duet AI: włącz jak pokazano poniżej. Upewnij się, że pole wyboru jest zaznaczone. Załaduj IDE ponownie. Spowoduje to włączenie Gemini w Cloud Code. W Twoim IDE pojawi się pasek stanu Gemini.

EnableDuetAiSetting.png

  1. W prawym dolnym rogu kliknij przycisk Gemini, jak widać na ilustracji, i wybierz odpowiedni projekt Google Cloud, w którym włączono interfejs Cloud AI Companion API.

GeminiSelectGoogleCloudProject.png

  1. Po wybraniu projektu Google Cloud sprawdź, czy widzisz komunikat o stanie Cloud Code na pasku stanu oraz czy po prawej stronie na pasku stanu masz włączoną usługę Gemini, jak pokazano poniżej:

GeminiEnabledStatusBar.png

Możesz już korzystać z Gemini Code Assist.

3. Pobieranie i sprawdzanie aplikacji

W oknie terminala uruchom polecenie, aby sklonować repozytorium z kodem początkowym, a następnie przejść 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 z Gemini po lewej stronie edytora. To okno Gemini Chat znajduje się w IDE i zawiera kod w IDE dostępny 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żna uruchomić ten program lokalnie za pomocą polecenia python3 main.py w oknie terminala.

4. Uruchamianie lokalnie

W razie potrzeby przejdź do katalogu repozytorium, 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 ze stroną główną aplikacji:

fb06f382a4c03e4c.png

Aplikacja działa „lokalnie”. Edytor Cloud Shell zrobił tu trochę magii. Aplikacja działa w Cloud Shell, a nie na Twoim komputerze. Kliknięcie tego linku otwiera kartę nie z rzeczywistym adresem lokalnym http://127.0.0.1:8080, ale z serwerem proxy skonfigurowanym tylko do tego celu przez Cloud Shell. Efekt jest taki sam, jak gdyby przeglądarka została naprawdę uruchomiona lokalnie.

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

e1b9d5832f6d0058.png

Zgadza się, 25 to XXV w liczbie rzymskich. Musisz to zrobić tutaj.

Sprawdź jeszcze kilka liczb. Było 25, a co z 24?

37982e385e17baac.png

Być może zabrakło nam pośpiechu, gdy uznaliśmy, że wszystko jest w porządku. Czy XXIIII to prawidłowa konwersja dla 24? Czy nie powinno być XXIV?

Można stwierdzić, że XXIIII ma rację, ale nie jest to zgodne z oczekiwaniami ludzi. Ponieważ jednak nie jest to błędne (zauważ, że wiele zegarów wyświetla 4 jako rzymską liczbę IIII), warto to naprawić w przyszłości.

Co z wartościami ujemnymi? Zero? Nie można zapisać tych liczb przy użyciu liczb rzymskich. Nic nie wyświetla się użytkownikowi – wygląda na to, że trzeba naprawić błąd.

Testowanie pomaga wykrywać i eliminować błędy, a Gemini Code Assist może pomóc nam w pisaniu i wykorzystywaniu testów.

5. Dodawanie testów

Wróć do okna Gemini Chat i zapytaj

How can I test the number_to_roman function?

Przeczytaj odpowiedź, która powinna obejmować omówienie modułów unittest i pytest.

Być może chcesz, aby te testy były tworzone przez Gemini Code Assist. Otwórz plik calendar.py, w którym znajduje się rzeczywisty kod konwersji, w edytorze, wróć do okna Gemini Chat i jeszcze raz zapytaj

How can I test the number_to_roman function?

Teraz odpowiedź jest bardziej szczegółowa – nawet zawiera moduł unittest, który możesz skopiować lub wstrzykiwać 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")

Może się tam znaleźć inny kod niż w przykładzie powyżej. Podstawowe modele Gemini Code Assist są co jakiś czas aktualizowane, więc odpowiedzi nie zawsze są takie same. Jeśli widzisz inny zestaw kodu, możesz skopiować kod widoczny w tym ćwiczeniu. Możesz też wypróbować alternatywną odpowiedź w Gemini Code Assist. Jeśli masz czas, możesz wypróbować obie ścieżki. Gemini Code Assist to asystent kodowania, z którego możesz korzystać wedle uznania.

Kliknij podwójną strzałkę w prawym górnym rogu okna Gemini Chat, aby utworzyć nowy plik zawierający kod testu jednostkowego, lub użyj IDE, aby utworzyć nowy plik i wkleić kod pokazany w tym module. Naciśnij w tym oknie kombinację klawiszy 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ć działający wcześniej serwer WWW i wyświetlić komunikat o powłoce. Wpisz polecenie

python3 calendar-unittest.py

żeby przeprowadzić nowe testy.

Brak danych wyjściowych. Nie tak było. Czy wszystko przebiegło po cichu? Na pewno chcesz o tym wiedzieć. Spójrz na odpowiedź Gemini Code Assist zawierającą kod testowy. Pod kodem było więcej informacji o sposobie uruchamiania przypadku testowego:

run-unittest.png

Spróbuj uruchomić zalecane polecenie:

python -m unittest discover

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

python3 -m unittest discover

Polecenie jest wykonywane, 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ę to wzięło? Najwyraźniej usługa Gemini Code Assist oczekiwała, że kod testowy zostanie zapisany w pliku o nazwie discover lub discover.py, ale nie określił, co masz zrobić. Plik został zapisany w folderze calendar-unittest.py, więc spróbuj uruchomić polecenie:

python3 -m unittest calendar-unittest

Teraz zobaczysz dużo wyników, zaczynając od czegoś takiego:

$ 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

W pierwszym wierszu znajduje się przedział czasu dla każdego zdanego testu, a w przypadku każdego z nich – F. Większość testów kończy się niepowodzeniem. Następnie wyświetla listę nieudanych testów wraz z oczekiwanymi i rzeczywistymi wynikami. Nie jest jasne, w jakiej kolejności zostały przeprowadzone testy. Zostały one ułożone w kolejności alfabetycznej według nazwy testu, a nie w kolejności, w jakiej wystąpiły w pliku. Więc jako pierwszy uruchomił się tryb test_convert_1, potem test_convert_1990, potem test_convert_2023 i tak dalej. Tylko przypadki testowe 1 i 2023 zostały zaliczone.

Zauważyliśmy, że przy pierwszym użyciu tego kodu konwertował on 24 na XXIIII. Było to niezgodne z prawdą, ale nie było to typowa postać, w której IIII jest konwertowane na IV. Wszystkie niezrealizowane testy dotyczyły podobnych przypadków. Kiedy zauważyliśmy ten problem, laboratorium stwierdziło: „Skoro jednak nie jest to tak naprawdę błędne (zauważ, że wiele zegarów wyświetla 4 jako liczbę rzymską IIII), zostaw ten błąd, który zostanie udoskonalony w przyszłości”.

Można wprowadzić zmiany w przypadkach testowych i zaakceptować te stwierdzenia, które nie są nieprawidłowe, odpowiada za otrzymany kod lub przyjmuje, że czas na „przyszłe udoskonalenia”. Następnym krokiem jest więc poprawienie kodu przy pomocy Gemini Code Assist, aby odpowiedzi były jak najbardziej akceptowalne, których oczekujemy podczas testów.

6. Ulepszam kod

Pamiętaj, że odpowiedzi typu XXIIII na 24 zamiast bardziej popularnych XXIV zostały uznane za „nieprawdziwie” i zostały odłożone na przyszłość. Ta przyszłość jest teraz. To „nie tak naprawdę” odpowiedzi są irytujące.

Pierwsza zasada dla powtarzających się cyfr w przypadku cyfr rzymskich: za każdym razem, gdy w rzędzie występują cztery identyczne cyfry, należy je zastąpić jedną z cyfr, po której następuje kolejna większa cyfra. Dlatego pole XXIIII powinno zostać zastąpione elementem XXIV. Podobnie XXXX należy zmienić na XL, a CCCC powinien zmienić się na CD.

Zapytaj zespół pomocy Gemini Code, 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?

Zalecamy dodanie kodu na końcu:

6437c3fa2c5fabd1.png

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

dcefa568cab82fb7.png

Usługa Gemini Code Assist dodała więcej wierszy do obsługi zgłoszeń, z którymi możesz się spotkać po utworzeniu pierwszego zestawu zastąpień. Na przykład liczba 19 zostanie przekształcona w XVIII, potem na XVIV, a na koniec na prawidłową XIX.

Jeśli Gemini Code Assist podał przydatne sugestie, naciśnij Tab, aby je zaakceptować, zapisać plik i ponownie uruchomić serwer WWW. W przeciwnym razie ręcznie dodaj wiersze pokazane w tym przykładzie i zapisz plik. Spróbuj wykonać trudną konwersję: 1999:

a206999587fdc9.png

Zgadza się!

Ponownie uruchom testy. Wszystkie one zaliczone!

Wygląda na to, że aplikacja internetowa jest gotowa do wdrożenia w środowisku produkcyjnym.

7. Wdrożenie w Cloud Run

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

gcloud run deploy

w terminalu. Gdy pojawi się pytanie o lokalizację kodu źródłowego, naciśnij Enter, by zaakceptować sugerowaną prawidłową lokalizację. Podobnie, gdy pojawi się pytanie o nazwę usługi, naciśnij Enter, aby zaakceptować sugestię.

Polecenie może się nie powieść, 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ępowane identyfikatorem projektu, który może być taki sam jak jego nazwa. Następnie uruchom ponownie polecenie gcloud run deploy.

  • Pojawi się komunikat, że pewne interfejsy API są potrzebne, ale nie zostały jeszcze włączone. Aby je włączyć, wpisz y.
  • Gdy pojawi się prośba o wybranie regionu, wybierz ten, który Ci odpowiada. Możesz bezpiecznie wpisać numer us-central1.
  • Gdy pojawi się prośba, wpisz Y, aby kontynuować.
  • Zezwolisz na nieuwierzytelnione wywołania tej usługi Cloud Run. Opcja uwierzytelniania używana przez Cloud Run jest odpowiednia do użycia przez programy wywołujące tę usługę. Ponieważ jest to strona internetowa, nie będziesz używać uwierzytelniania.

Google Cloud skompiluje kontener, wdroży go, skieruje do niego ruch i ustawi zasady dostępu, a potem wyświetli Ci link do strony głównej:

94ba7d8d63a44afd.png

Możesz kliknąć ten link i przejść do aplikacji.

a2e51666dfd33a9f.png

Wpisz liczbę i naciśnij Enter, a następnie tada!

5021535ac991a95c.png

Co?!

Udało się. Dlaczego to nie zostało dokończone?

Sprawdź. Zapytaj Gemini Code Assist,

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 wygląda podobnie. Zapytajmy z Gemini Code Assist, jak możesz samodzielnie skonfigurować dzienniki:

92d1855be73ef1d.png

Zrób to. Szukaj wierszy z czerwonym !! wskaźniki błędu, jak poniżej:

9bed4f9ed82de21c.png

Dalej znajduje się wiele szczegółów dotyczących stosu wywołań, ale jeszcze to:

47fc93be845f4e3f.png

W pliku calendar.py znajduje się funkcja number_to_roman. A wiesz, że tak, bo zadziałał na Twoim komputerze. Co może się zmienić w Cloud Run?

Odpowiedź jest trudna. W języku Python3 dostępny jest standardowy moduł o nazwie calendar, podobnie jak plik calendar.py, w którym zdefiniowano funkcję number_to_roman. Gdy Python szukał modułu o nazwie calendar na komputerze lokalnym, najpierw przeszukał katalog aplikacji. Wygląda na to, że Python w Cloud Run najpierw szukał modułów standardowych, a następnie je zaimportował, ale nie znalazł funkcji number_to_roman.

Takie różnice w środowisku są zawsze możliwe. Na szczęście skonteneryzowana aplikacja niesie ze sobą swoje środowisko, więc po uruchomieniu możesz oczekiwać tego samego działania. Gdyby lokalnie uruchomiono tę samą skonteneryzowaną aplikację co Cloud Run, problem byłby taki sam.

Rozwiąż ten problem. Musisz zmienić nazwę modułu kalendarza lokalnego na inną, która nie jest standardową nazwą modułu. Zmień nazwę pliku calendar.py na my_calendar.py, a następnie zmień wiersze import calendar w pliku 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 je lokalnie, przeprowadź testy, a następnie wdróż ponownie:

gcloud run deploy

Teraz to działa:

ed288801c6825eb1.png

Możesz udostępnić ten URL, a każdy, kto potrzebuje narzędzia do konwersji liczb rzymskich, może użyć Twojego.

8. Opcjonalnie: nadaj ładniejszy wygląd

Twoja aplikacja działa prawidłowo i każdy może uzyskać do niej dostęp. Wygląda jednak na to trochę banalnie. Zanim powiesz wszystkim, może poprosić o poprawienie wyglądu Gemini Code Assist?

Otwórz plik templates/index.html. W oknie czatu z Gemini zapytaj:

Make this index.html file use material design.

Odpowiedź polega na dodaniu elementów do bieżącego pliku, co da wynik podobny do tego:

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

Użyj ikony, aby skopiować sugerowany kod i wkleić istniejącą zawartość index.html. W terminalu uruchom python3 main.py i kliknij link, aby otworzyć okno podglądu. Strona jest teraz nieco mniej prosta:

295643ec03fcaafc.png

W razie potrzeby możesz powtórzyć te czynności w pliku convert.html.

Gemini Code Assist zna się na kodzie CSS i pomaga dostosowywać styl stron aplikacji na różne sposoby. To dopiero początek.

Chcesz udostępnić tę aplikację, więc nie zapomnij wdrożyć jej ponownie w Cloud Run:

gcloud run deploy

Możesz przekazać URL osobom, które chcą przekonwertować dane na liczby rzymskie.

9. Gratulacje!

Gratulujemy – udało Ci się już korzystać z Gemini Code Assist, aby dodawać testy do aplikacji, naprawiać w niej błędy i dodawać rozszerzone funkcje.

Gdy skończysz korzystać z skompilowanej aplikacji, możesz ją usunąć z panelu konsoli w chmurze, aby zatrzymać ewentualne przyszłe opłaty.

Dokumentacja...