1. Wprowadzenie
Przedstawiamy w nim zasady programowania opartego na testach ( Test Driven Development), w których trzeba pisać testy przed wdrożeniem kodu. Aby zapoznać się z tą metodą, stworzymy prostą aplikację kalkulatora w języku Ruby.
Dowiesz się też, jak korzystać z Gemini jako asystenta kodowania. Gemini pomoże przyspieszyć cykl TDD, generując przypadki testowe i sugerując implementacje kodu, a nawet objaśniając jego treść.
Na koniec zobaczysz, jak wdrożyć aplikację kalkulatora w Cloud Functions – w pełni zarządzanej bezserwerowej platformy Google, dzięki której Twoja aplikacja stanie się bardziej dostępna.
2. Wymagania wstępne
- Projekt Google Cloud z włączonymi płatnościami
- Przeglądarka
Tworzenie projektu
- W konsoli Google Cloud na stronie selektora projektów wybierz lub utwórz projekt Google Cloud.
- Sprawdź, czy w projekcie Cloud włączone są płatności. Dowiedz się, jak sprawdzić, czy w projekcie są włączone płatności.
Włączanie Gemini API
- Otwórz Gemini Marketplace, aby włączyć interfejs API. Interfejs API możesz też włączyć za pomocą polecenia gcloud:
gcloud services enable cloudaicompanion.googleapis.com --project PROJECT_ID
- Otwórz stronę Gemini i kliknij „Rozpocznij rozmowę”.
- Ważne: wykonaj kroki 1 i 2 z tego ćwiczenia z programowania, aby zacząć korzystać z Gemini i włączyć Gemini w Cloud Shell IDE.
Włącz Cloud Functions API
- W konsoli Google Cloud na stronie selektora projektów wybierz lub utwórz projekt Google Cloud.
- Aby włączyć ten interfejs API, otwórz stronę interfejsu Cloud Functions API. Interfejs API możesz też włączyć za pomocą polecenia gcloud:
gcloud services enable cloudfunctions.googleapis.com --project PROJECT_ID
Aktywowanie Cloud Shell
- Użyjesz Cloud Shell – środowiska wiersza poleceń działającego w konsoli Google Cloud, które ma zainstalowane wymagane języki. W konsoli Cloud kliknij Aktywuj Cloud Shell w prawym górnym rogu:
- Po nawiązaniu połączenia z Cloud Shell powinno pojawić się potwierdzenie, że użytkownik jest już uwierzytelniony, a projekt jest ustawiony na identyfikator Twojego projektu. Aby potwierdzić, że jesteś uwierzytelniony, uruchom to polecenie w Cloud Shell:
gcloud auth list
- Uruchom to polecenie w Cloud Shell, aby sprawdzić, czy polecenie gcloud zna Twój projekt:
gcloud config list project
- Jeśli Twój projekt nie jest skonfigurowany, ustaw go za pomocą tego polecenia:
gcloud config set project <YOUR_PROJECT_ID>
Więcej informacji o poleceniach i sposobie korzystania z gcloud znajdziesz w dokumentacji.
Otwórz edytor
- W tym ćwiczeniu w Codelabs użyjemy wbudowanego edytora Cloud. W oknie Cloud Shell kliknij przycisk Otwórz edytor w prawym górnym rogu. Otworzy się edytor VSCode.
Dodaj rozszerzenie Ruby
- W menu po lewej stronie kliknij ikonę rozszerzeń
, w pasku wyszukiwania wpisz
vscode ruby
i zainstaluj rozszerzenie VSCode Ruby.
3. Rozgrzewka Gemini
LLM nie są deterministyczne. Dlatego gdy wypróbowujesz te prompty, otrzymana odpowiedź może wyglądać inaczej niż na zrzutach ekranu załączonych w ramach ćwiczeń z programowania.
Najpierw zapytajmy Gemini, czym jest TDD. Aby rozpocząć rozmowę z Gemini w tym samym edytorze Cloud Shell, wykonaj te czynności:
- W lewej części strony znajdź ikonę Gemini
. Spowoduje to otwarcie okna czatu po lewej stronie.
- Możesz zacząć pisać w polu tekstowym
Enter a prompt here
Prompt:
What is Test Driven Development?
Odpowiedź:
Test-driven development (TDD) is a software development methodology that requires developers to write automated tests before writing any production code. This helps ensure the code is correct and meets the requirement. ....
Znajdziesz w nim krótkie wprowadzenie do programu TDD i jego zalet.
Zapytajmy Gemini, czym jest Ruby:
Prompt:
What is Ruby?
Odpowiedź:
Ruby is a general-purpose, interpreted, object-oriented programming language. It is designed to be easy to read and write. Ruby is dynamically typed, meaning that the type of a variable is not declared and can change during execution. ....
Wyjaśnia, czym jest Ruby i jakie są korzyści z używania tego języka.
4. Konfiguracja projektu
Zacznijmy od utworzenia prostej aplikacji Sinatra.
- Utwórzmy pusty folder. Możesz ją nazwać w dowolny sposób. Na potrzeby tego ćwiczenia z programowania będziemy nosić nazwę
gemini-tdd
. W edytorze chmury po lewej stronie na karcie Eksplorator utwórz folder pod/home/<YOUR-USERNAME>/
- Otwórzmy utworzony przed chwilą folder. W pierwszym menu po lewej stronie kliknij kolejno ikonę
, Plik -> Otwórz folder.
- Utwórz w tym folderze głównym nowy plik Ruby, który będzie służyć jako punkt wyjścia dla aplikacji. Możesz go nazwać w dowolny sposób. W tym ćwiczeniu nazwijmy go
app.rb
. - Dodajmy też
Gemfile
w folderze głównym. Dobrze będzie też zapytać Gemini o urządzenieGemfile
. - Utworzymy też plik
app_test.rb
, w którym będą pisane przypadki testowe.
5. Implementacja oparta na Gemini
Zacznijmy od przedstawienia Gemini informacji o tym, co próbujemy zrobić, i poproś o wygenerowanie dla niego przypadków testowych. Skopiuj ten prompt w prompcie na czacie z Gemini.
Prompt:
Answer as a software engineer with Ruby expertise. We want to build a Ruby calculator application with a test driven development approach. Let's start by writing some tests for the calculator app using minitest gem.
Odpowiedź:
Here is a simple test for a calculator app that adds two numbers:
require "minitest/autorun"
describe "Calculator" do
it "should add two numbers" do
calculator = Calculator.new
assert_equal 5, calculator.add(2, 3)
end
end
This test uses the assert_equal method to verify that the result of the add method is correct. .....
Przedstawiamy przykładowy przypadek testowy aplikacji Kalkulator, tj. dodanie 2 liczb. Zaimportował też na potrzeby testów wymaganą zależność minitest/autorun
. Skopiujmy treść do usługi app_test.rb
. Uruchommy ten test teraz. nie mamy żadnego zapisanego kodu, więc na pewno się nie uda.
Zapytajmy Gemini, jak przeprowadzić ten test.
Prompt:
How do we run the tests written in app_test.rb using ruby command?
Odpowiedź:
To run the tests written in app_test.rb using the ruby command, you can use the following steps: 1.Make sure that you are in the same directory as the app_test.rb file. 2.Open a terminal window. 3.Type the following command:
ruby app_test.rb
This will run all of the tests in the app_test.rb file and report the results.
Wykonajmy teraz test. Kliknij prawym przyciskiem myszy app_test.rb
na karcie Eksplorator i wybierz „Otwórz w zintegrowanym terminalu”
Jeśli nie jesteś w tym samym folderze co plik app_test.rb, sprawdź, czy nie używasz go przy użyciu polecenia cd. W terminalu uruchom polecenie zwrócone przez Gemini:
ruby app_test.rb
Wyświetli się ten błąd:
NameError: uninitialized constant Calculator
Zapytajmy Gemini, jak naprawić ten błąd bezpośrednio w edytorze. Kliknij ikonę czatu w panelu nawigacji edytora Cloud Shell i zapytaj o ten prompt:
Prompt:
NameError: uninitialized constant Calculator. Give me Calculator class code.
Odpowiedź:
The error you are getting is because you have not defined the Calculator class. You need to define the Calculator class before you can use it in your tests. Here is the code for the Calculator class:
Class Calculator
def add(a, b)
a + b
end
end
Once you have defined the Calculator class, you can run the tests again and they will pass. .....
Gemini informuje, że nie mamy klasy o nazwie Calculator
i że musimy ją utworzyć. Dostarczył nam też kod do tworzenia klasy Calculator
. Użyjmy tego kodu. Otwórz plik app.rb
na karcie Eksplorator i skopiuj kod podany przez Gemini. Podczas modyfikowania treści w pliku app.rb możesz zobaczyć sugestie z Gemini w ramach autouzupełniania. musisz nacisnąć tab
, jeśli chcesz zaakceptować, lub Esc
, jeśli nie chcesz.
Wykonajmy teraz test jeszcze raz. Wpisz to polecenie w zintegrowanym terminalu:
ruby app_test.rb
Nadal jednak wystąpi ten sam błąd „NameError: uninitialized constant Calculator
”. Zapytajmy Gemini, jak to naprawić.
6. Iteracyjne TDD z Gemini
Prompt:
I am still getting this error: "NameError: uninitialized constant Calculator".
Odpowiedź:
The error you are getting is because you have not defined the Calculator class. You need to define the Calculator class before you can use it in your tests. Here is the code for the Calculator class:
class Calculator
def add(a, b)
a + b
end
def subtract(a, b)
a - b
end
def multiply(a, b)
a * b
end
def divide(a, b)
a / b
end
end
....
Otrzymaliśmy od niego odpowiedź. Możliwe, że nie jest taka sama jak powyżej. Poinformujmy Gemini bezpośrednio, że klasę Kalkulatora mamy zdefiniowaną w pliku app.rb .
Prompt:
Calculator class is defined in app.rb already.
Odpowiedź:
I see that the Calculator class is defined in the app.rb file. However, you are getting the NameError error because you are trying to use the Calculator class in the app_test.rb file without requiring the app.rb file. To fix this, you need to add the following line to the top of the app_test.rb file:
require_relative "app"
Otrzymaliśmy od Gemini odpowiedź z prośbą o zaimportowanie pliku app.rb, w którym mamy zdefiniowaną klasę Kalkulatora. Czasami uzyskanie właściwej odpowiedzi może wymagać 2–3 kolejnych iteracji, ale gdy już się nauczysz, będzie coraz lepiej. W odpowiedzi Gemini możesz też zobaczyć komunikat wymagać „./app”. Dodajmy go do pliku app.rb w pliku app_test.rb i ponownie uruchom ten sam test.
Upewnij się, że na tym etapie plik app_test.rb wygląda tak:
require "minitest/autorun"
require "./app"
describe "Calculator" do
it "should add two numbers" do
calculator = Calculator.new
assert_equal 5, calculator.add(2, 3)
end
end
Uruchom poniższe polecenie w terminalu Cloud Shell w folderze projektu:
ruby app_test.rb
Jeśli wszystko pójdzie dobrze, test powinien zostać zaliczony. Dlatego opracowaliśmy bardzo prostą aplikację w języku Ruby w stylu TDD i skorzystaliśmy z pomocy Gemini. Odpowiedzi na prompty nie będą zawsze takie same. Jest to możliwe w modelach LLM. Możesz generować więcej operacji z Kalkulatora z Gemini, ale ogólnie rzecz biorąc, ten sam proces powinien działać.
7. Wdrażanie aplikacji w Cloud Functions
Poproś Gemini o wdrożenie tej funkcji w Cloud Functions:
Prompt:
Let's deploy this app to Cloud Functions
Odpowiedź:
To deploy your app to Cloud Functions, you can use the following steps: 1.Create a new Cloud Functions project. 2.Create a new Cloud Function. 3.Set the trigger for the Cloud Function to be an HTTP request. 4.Set the entry point for the Cloud Function to be the app method in the app.rb file. 5.Deploy the Cloud Function. Once you have deployed the Cloud Function, you can test it by sending an HTTP request to the function's URL. ....
Gemini wyjaśnia, jak wdrożyć go ręcznie za pomocą interfejsu użytkownika Cloud Functions. Ale ja nie chcę tego robić. Poproś Gemini o podanie polecenia gcloud
, które mogę uruchomić bezpośrednio ze zintegrowanego terminala.
Prompt:
How do I deploy this app to Cloud Functions gen2 using the gcloud command?
Odpowiedź:
... Here are the specific commands you can use to deploy your app to Cloud Functions using the gcloud command: gcloud functions deploy calculator --runtime ruby32 --trigger-http --entry-point app This command will create a new Cloud Function called calculator that is triggered by an HTTP request and uses the app method in the app.rb file as the entry point. Once the Cloud Function is deployed, you can test it by sending an HTTP request to the function's URL. For example, you can use the following command to send a request to the function: curl -X POST -H "Content-Type: application/json" -d '{"a": 2, "b": 3}' https://REGION-PROJECT_ID.cloudfunctions.net/calculator
Wykonajmy w terminalu polecenie gcloud podane przez Gemini.
gcloud functions deploy calculator --runtime ruby32 --trigger-http --entry-point app
Wyświetli się ten błąd:
„ERROR: (gcloud.functions.deploy) OperationError: code=3, message=Build failed: Could not find Gemfile.lock file in your app. Please make sure your bundle is up to date before deploying.; Error ID: 7916f05c
”
Skorzystajmy z pomocy Gemini, aby naprawić ten błąd.
Prompt:
ERROR: (gcloud.functions.deploy) OperationError: code=3, message=Build failed: Could not find Gemfile.lock file in your app. Please make sure your bundle is up to date before deploying.; Error ID: 7916f05c
Odpowiedź:
It looks like you're trying to deploy a function to Cloud Functions, but you don't have a Gemfile.lock file in your app. To fix this, run the following command in your app directory:
bundle install
This will create a Gemfile.lock file that lists all of the gems that your app uses. ...
Uruchommy w terminalu polecenie bundle install
, które utworzy Gemfile.lock
. Po uruchomieniu tego polecenia otwórz kartę Eksplorator. Zobaczysz na niej Gemfile.lock
.
Spróbujmy ponownie wdrożyć usługę w Cloud Functions. Wykonaj to samo polecenie wdrożenia w terminalu:
gcloud functions deploy calculator --runtime ruby32 --trigger-http --entry-point app
Wyświetli się kolejny błąd:
„ERROR: (gcloud.functions.deploy) OperationError: code=3, message=Build failed: unable to execute functions-framework-ruby; please ensure a recent version of the functions_framework gem is in your Gemfile; Error ID: 89ae7dda
”
8. Platforma funkcji dla języka Ruby
Zapytaj Gemini o ten błąd:
Prompt:
ERROR: (gcloud.functions.deploy) OperationError: code=3, message=Build failed: unable to execute functions-framework-ruby; please ensure a recent version of the functions_framework gem is in your Gemfile; Error ID: 89ae7dda
Odpowiedź:
It looks like you're trying to deploy a function to Cloud Functions, but the build is failing because the functions_framework gem is not in your Gemfile. To fix this, add the following line to your Gemfile: gem "functions_framework" Then, run the following command to install the gem: bundle install Once the gem is installed, you can try deploying your function again. ....
W naszej aplikacji brakuje klejnotu features_framework. Dodajmy ten wiersz w pliku Gemfile:
gem "functions_framework"
Teraz uruchom polecenie bundle install
w terminalu. Może się wyświetlić błąd „Brak jawnego zasobu globalnego w Gemfile” , W takim przypadku upewnij się, że w pierwszym wierszu pliku gemfile znajduje się następujący wiersz:
source "https://rubygems.org"
Następnie ponownie uruchom polecenie bundle install
z terminala. Teraz ponownie uruchom polecenie wdrożenia:
gcloud functions deploy calculator --runtime ruby32 --trigger-http --entry-point app --project PROJECT_ID
Wyświetli się ten błąd:
„ERROR: (gcloud.functions.deploy) OperationError: code=3, message=Build failed: failed to verify function target "app" in source "app.rb": Undefined function: "app"; Error ID: e12ab0f9
”
Aby rozwiązać ten problem, wypróbujmy Generate Code
funkcję Gemini. Otwórzmy plik app.rb na karcie Eksplorator, gdzie jest już kod aplikacji Kalkulator. W pierwszym wierszu app.rb zacznij wpisywać FunctionsFramework
, a następnie wpisz „.
”. Niektóre sugestie są zaznaczone szarą czcionką :
Aby zaakceptować sugestię, naciśnij Tab. Gdy to zrobisz, zobaczysz więcej sugestii podobnych do tych:
Aby zaakceptować dalsze sugestie, naciśnij Tab. Twój plik app.rb powinien więc wyglądać tak:
( Zmień nazwę funkcji z add na app).
require "functions_framework"
FunctionsFramework.http "app" do |request|
a = request.params["a"].to_i
b = request.params["b"].to_i
Calculator.new.add(a, b)
end
class Calculator
def add(a, b)
a + b
end
end
Właśnie utworzyliśmy punkt wejścia dla aplikacji Cloud Functions i dowiedzieliśmy się, jak korzystać z sugestii kodu Gemini w edytorze. Spróbujmy wdrożyć tę aplikację ponownie.
gcloud functions deploy calculator --runtime ruby32 --trigger-http --entry-point app --project PROJECT_ID
Jeśli wszystko pójdzie dobrze, wdrożenie powinno się zakończyć i powinno być widoczne adres URL, pod którym jest hostowana aplikacja. Świetnie. Zmodyfikujmy plik app.rb, by uzyskać wynik dodawania. Ostateczny plik app.rb powinien wyglądać tak:
require "functions_framework"
FunctionsFramework.http "app" do |request|
a = request.params["a"].to_i
b = request.params["b"].to_i
calculator = Calculator.new
add = calculator.add(a, b)
"Result: #{add}"
end
class Calculator
def add(a, b)
a + b
end
end
9. Kompleksowe testowanie
Otwórz adres URL i przekaż parametry zapytania a
oraz b
, jak pokazano poniżej:
https://[APP-URL]/?a=2&b=3
Odpowiedź powinna być widoczna jako : "Result: 5"
. Kalkulator wykonuje wiele operacji. Możesz rozszerzyć tę aplikację, aby również je realizować, i skorzystać w tym z pomocy Gemini.
10. Podsumowanie
Omówiliśmy już dziś, jak stworzyć aplikację w języku Ruby przy użyciu metody TDD z pomocą Gemini. Gemini może podawać różne wyniki, ale z pewnością przyspieszy proces programowania w języku, którego nie znasz, i nadal będzie wyświetlać funkcje lub fragmenty, aby przyspieszyć naukę.
Każdy deweloper ( niezależnie od wersji) może skorzystać z pomocy Gemini w procesie programowania. Jeśli nie zajmujesz się programowaniem, możesz użyć Gemini do wyjaśnienia istniejącego kodu lub poprosić go o wygenerowanie testów istniejącego kodu, który jest dla mnie najnudniejszy 🙂
Udanego kodowania z Gemini!