1. Wprowadzenie
W tym laboratorium dowiesz się o zasadach programowania sterowanego testami ( TDD), w którym testy piszesz przed zaimplementowaniem kodu. Utworzymy prostą aplikację kalkulatora w Ruby, aby zaprezentować to podejście.
Dowiesz się też, jak korzystać z Gemini jako asystenta programowania. Gemini przyspieszy cykl TDD, generując przypadki testowe, sugerując implementacje kodu, a nawet dostarczając wyjaśnienia kodu.
Na koniec dowiesz się, jak wdrożyć aplikację kalkulatora w funkcji w Cloud Functions, w pełni zarządzanej platformie bezserwerowej Google, aby była dostępna.
2. Wymagania wstępne
- projekt Google Cloud z włączonymi płatnościami;
- przeglądarki internetowej,
Tworzenie projektu
- W konsoli Google Cloud na stronie wyboru projektu wybierz lub utwórz projekt Google Cloud.
- Sprawdź, czy w projekcie w chmurze włączone są płatności. Dowiedz się, jak sprawdzić, czy w projekcie są włączone płatności.
Włączanie interfejsu Gemini API
- Aby włączyć interfejs API, przejdź do Gemini Marketplace. Interfejs API możesz też włączyć za pomocą gcloud:
gcloud services enable cloudaicompanion.googleapis.com --project PROJECT_ID
- Odwiedź stronę Gemini i kliknij „Rozpocznij czat”.
- Ważne: aby rozpocząć korzystanie z Gemini i włączyć Gemini w środowisku IDE Cloud Shell, wykonaj kroki 1 i 2 w tym samouczku.
Włącz Cloud Functions API
- W konsoli Google Cloud na stronie wyboru projektu wybierz lub utwórz projekt Google Cloud.
- Aby włączyć interfejs API, otwórz stronę Cloud Functions API. Interfejs API możesz też włączyć za pomocą gcloud:
gcloud services enable cloudfunctions.googleapis.com --project PROJECT_ID
Aktywowanie Cloud Shell
- Będziesz używać Cloud Shell, czyli środowiska wiersza poleceń działającego w konsoli Google Cloud, które ma już zainstalowane wymagane języki. W konsoli Cloud kliknij Aktywuj Cloud Shell w prawym górnym rogu:

- Po połączeniu z Cloud Shell zobaczysz, że uwierzytelnianie zostało już przeprowadzone, a projekt jest już ustawiony na Twój identyfikator projektu. Aby potwierdzić, że uwierzytelnianie zostało przeprowadzone, uruchom w Cloud Shell to polecenie:
gcloud auth list
- Aby potwierdzić, że polecenie gcloud zna Twój projekt, uruchom w Cloud Shell to polecenie:
gcloud config list project
- Jeśli projekt nie jest ustawiony, użyj tego polecenia, aby go ustawić:
gcloud config set project <YOUR_PROJECT_ID>
Informacje o poleceniach gcloud i ich użyciu znajdziesz w dokumentacji.
Otwórz edytor
- W tym ćwiczeniu użyjemy wbudowanego edytora Cloud. W oknie Cloud Shell kliknij przycisk Otwórz edytor w prawym górnym rogu. Otworzy się edytor VSCode.

Dodawanie rozszerzenia Ruby
- W bocznym menu kliknij ikonę rozszerzeń
, w pasku wyszukiwania wpisz vscode rubyi zainstaluj rozszerzenie VSCode Ruby.

3. Rozgrzewka Gemini
Modele LLM nie są deterministyczne. Dlatego podczas testowania tych promptów otrzymana odpowiedź może wyglądać inaczej niż te na zrzutach ekranu dołączonych do codelabu.
Najpierw zapytajmy Gemini, czym jest TDD. Aby rozpocząć rozmowę z Gemini w tym samym edytorze Cloud Shell, w którym jesteśmy, wykonaj te czynności:
- Po lewej stronie strony znajdź ikonę Gemini
. Otworzy ona okno czatu po lewej stronie. - Możesz zacząć pisać w polu tekstowym z napisem
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 TDD i jego zalet.
Zapytajmy teraz 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ą zalety używania tego języka.
4. Konfiguracja projektu
Zacznijmy od utworzenia prostej aplikacji Sinatra.
- Utwórzmy pusty folder. Możesz mu nadać dowolną nazwę. Na potrzeby tego ćwiczenia będziemy go nazywać
gemini-tdd. W edytorze w chmurze po lewej stronie na karcie Eksplorator utwórz folder w/home/<YOUR-USERNAME>/.

- Otwórzmy folder, który właśnie utworzyliśmy. W menu po lewej stronie kliknij ikonę
, a następnie kolejno Plik –> Otwórz folder. - Utwórzmy w tym folderze głównym nowy plik Ruby, który będzie punktem wyjścia dla aplikacji. Możesz mu nadać dowolną nazwę. W tym ćwiczeniu będziemy go nazywać
app.rb.
- Dodajmy też
Gemfilew folderze głównym. Warto też zapytać Gemini oGemfile. - Utworzymy też plik
app_test.rb, w którym będziemy zapisywać nasze przypadki testowe.
5. Wdrożenie oparte na Gemini
Zacznijmy od podania Gemini kontekstu tego, co chcemy zrobić, i poprośmy o wygenerowanie przypadków testowych. Skopiuj poniższy prompt do rozmowy 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. .....
Zawiera on przykładowy przypadek testowy dla aplikacji Kalkulator, czyli dodawanie 2 liczb. Zaimportowano też wymaganą zależność minitest/autorun na potrzeby testów. Skopiujmy treść do pliku app_test.rb. Spróbujmy teraz uruchomić ten test. Ponieważ nie mamy napisanego żadnego kodu, na pewno się nie powiedzie.
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.
Przeprowadźmy test. Kliknij prawym przyciskiem myszy ikonę app_test.rb na karcie Eksplorator i wybierz „Otwórz w zintegrowanym terminalu”.

Upewnij się, że jesteś w tym samym folderze co plik app_test.rb. Jeśli nie, użyj polecenia cd, aby się tam przenieść. W terminalu uruchom polecenie zwrócone przez Gemini:
ruby app_test.rb
Pojawi się ten błąd:
NameError: uninitialized constant Calculator
Zapytajmy Gemini, jak to naprawić, bezpośrednio w edytorze. W panelu nawigacyjnym edytora Cloud Shell kliknij ikonę czatu i wpisz poniższy 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 zajęć o nazwie Calculator i musimy je utworzyć. Wygenerował też kod do utworzenia klasy Calculator. Użyjmy tego kodu. Otwórz app.rb na karcie Eksplorator i skopiuj do niego kod podany przez Gemini. Podczas modyfikowania treści w pliku app.rb możesz otrzymywać sugestie od Gemini w formie automatycznego uzupełniania. Jeśli chcesz je zaakceptować, naciśnij tab, a jeśli nie – Esc.
Teraz uruchommy test ponownie. Wpisz w zintegrowanym terminalu to polecenie:
ruby app_test.rb
Nadal jednak będzie się pojawiać ten sam błąd „NameError: uninitialized constant Calculator”. Zapytajmy Gemini, jak go 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
....
Odpowiedź, która może być taka sama jak powyżej. Powiedzmy więc Gemini wprost, że klasa Calculator jest zdefiniowana 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 odpowiedź od Gemini, aby zaimportować plik app.rb, w którym zdefiniowana jest klasa Calculator. Czasami uzyskanie odpowiedniej odpowiedzi może wymagać 2–3 powtórzeń promptów, ale z czasem będzie to łatwiejsze. W odpowiedzi Gemini możesz też zobaczyć require "./app". Dodajmy to do pliku app.rb w pliku app_test.rb i ponownie uruchommy ten sam test.
Upewnij się, że w tym momencie 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 to polecenie w terminalu Cloud Shell w folderze projektu:
ruby app_test.rb
Jeśli wszystko pójdzie dobrze, test powinien zakończyć się powodzeniem. Dlatego opracowaliśmy bardzo prostą aplikację w Ruby, korzystając z podejścia TDD i pomocy Gemini. Odpowiedzi na prompty nie będą zawsze takie same, co wynika z charakteru modeli LLM. Gemini może wykonywać więcej działań w Kalkulatorze, ale ogólnie powinna działać ta sama procedura, którą właśnie zastosowaliśmy.
7. Wdrażanie aplikacji w Cloud Functions
Teraz poproś Gemini o wdrożenie tego 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 Cloud Functions. Ale nie chcę tego robić. Poprośmy Gemini o podanie polecenia gcloud, które możemy uruchomić bezpośrednio w zintegrowanym terminalu.
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
Uruchom w terminalu polecenie gcloud podane przez Gemini.
gcloud functions deploy calculator --runtime ruby32 --trigger-http --entry-point app
Pojawi 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”
Poproś Gemini o pomoc w rozwiązaniu tego problemu.
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 plik Gemfile.lock . Po uruchomieniu polecenia sprawdź kartę eksploratora. Powinien być widoczny znak Gemfile.lock.
Spróbujmy ponownie wdrożyć funkcję w Cloud Functions. Wykonaj to samo polecenie wdrażania w terminalu:
gcloud functions deploy calculator --runtime ruby32 --trigger-http --entry-point app
Pojawi 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 Ruby
Zapytajmy 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 więc gemu functions_framework. Dodajmy ten wiersz do pliku Gemfile:
gem "functions_framework"
Teraz uruchom w terminalu polecenie bundle install. Może pojawić się błąd „No explicit global resource in Gemfile” (Brak jawnego zasobu globalnego w pliku Gemfile). Jeśli tak się stanie, upewnij się, że pierwszy wiersz pliku Gemfile zawiera:
source "https://rubygems.org"
Następnie ponownie uruchom bundle install w terminalu. Teraz uruchom ponownie polecenie wdrażania:
gcloud functions deploy calculator --runtime ruby32 --trigger-http --entry-point app --project PROJECT_ID
Pojawi 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óbuj funkcję Generate Code Gemini. Otwórzmy plik app.rb na karcie Eksplorator, gdzie mamy już kod aplikacji Kalkulator. W pliku app.rb w pierwszym wierszu zacznij pisać FunctionsFramework, a potem wpisz „.”. Zobaczysz kilka sugestii w szarym tekście :

Aby zaakceptować sugestię, naciśnij Tab. Gdy to zaakceptujesz, zobaczysz więcej sugestii, takich jak te poniżej:

Aby zaakceptować kolejne sugestie, naciśnij Tab. Plik app.rb powinien 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 aplikacji Cloud Functions i dowiedzieliśmy się, jak korzystać z sugestii kodu Gemini w edytorze. Teraz spróbujmy ponownie wdrożyć aplikację.
gcloud functions deploy calculator --runtime ruby32 --trigger-http --entry-point app --project PROJECT_ID
Jeśli wszystko przebiegnie pomyślnie, wdrożenie powinno się zakończyć i powinien wyświetlić się adres URL, pod którym jest hostowana Twoja aplikacja. Świetnie. Zmodyfikujmy nieco plik app.rb, aby zwracał wynik dodawania. Końcowy 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. Testowanie kompleksowe
Otwórz adres URL i przekaż parametry zapytania a i b w sposób pokazany poniżej:
https://[APP-URL]/?a=2&b=3
Odpowiedź powinna wyglądać tak : "Result: 5". Kalkulator wykonuje wiele operacji. Możesz rozszerzyć tę aplikację, aby wykonywała te czynności, i skorzystać w tym celu z pomocy Gemini.
10. Podsumowanie
Dziś zobaczyliśmy, jak za pomocą Gemini opracować aplikację w Ruby, stosując podejście TDD. Jak widzisz, Gemini może podawać różne wyniki, ale z pewnością może przyspieszyć proces programowania w języku, którego możesz nie znać najlepiej, a także pokazywać funkcje lub fragmenty kodu, aby przyspieszyć naukę.
Każdy deweloper ( niezależnie od doświadczenia) może korzystać z pomocy Gemini w procesie tworzenia aplikacji. Jeśli nie chcesz używać Gemini do programowania, możesz poprosić go o wyjaśnienie istniejącego kodu lub wygenerowanie testów do tego kodu. To dla mnie najnudniejsze zadanie 🙂
Miłego kodowania z Gemini!