1. מבוא
בשיעור ה-Lab הזה, תשתמשו ב-Gemini Code Assist, כלי מבוסס-AI לשיתוף פעולה ב-Google Cloud, כדי להוסיף בדיקות לאפליקציית אינטרנט קיימת ב-Python, ולמצוא ולתקן שגיאות באפליקציה שמתגלות בבדיקות. לאחר מכן, תוכלו להשתמש ב-Code Assist כדי ליצור בדיקות לפונקציונליות חדשה וליצור קוד שיעבור את הבדיקות האלה וירחיב את האפליקציה.
מה עושים...
- תשתמשו ב-Cloud Shell Editor כדי להוריד קוד של אפליקציית אינטרנט קיימת.
- תשתמשו ב-Gemini Code Assist Chat ב-Cloud Shell Editor כדי לשאול שאלות כלליות על Google Cloud.
- תשתמשו בעזרה בכתיבת קוד ישירות ב-Gemini Code Assist ב-Cloud Shell Editor כדי ליצור בדיקות לאפליקציה, להריץ את הבדיקות, למצוא ולתקן שגיאות, ואז להרחיב את הפונקציונליות של האפליקציה.
מה תלמדו...
- איך להשתמש ב-Gemini Code Assist למשימות שונות של מפתחים, כמו יצירת בדיקות ויצירת קוד.
- איך משתמשים ב-Gemini Code Assist כדי לקבל מידע על Google Cloud.
מה צריך...
- דפדפן האינטרנט Chrome
- חשבון Gmail
- פרויקט ב-Cloud עם חיוב מופעל
- Gemini Code Assist מופעל בפרויקט שלכם ב-Cloud
שיעור ה-Lab הזה מיועד למפתחים בכל הרמות, כולל מתחילים. אף על פי שאפליקציית הדוגמה כתובה בשפת Python, לא צריך להכיר את התכנות ב-Python כדי להבין מה קורה. המיקוד שלנו יהיה בהיכרות עם היכולות של Gemini Code Assist למפתחים.
2. הגדרה
כדי להשתמש במעבדה הזו, צריך שיהיה לכם פרויקט ב-Cloud עם חיוב מופעל. עכשיו נפעיל את Gemini API בפרויקט שלנו ב-Google Cloud. כך עושים את זה:
- נכנסים לכתובת https://console.cloud.google.com ומוודאים שבחרתם את הפרויקט ב-Google Cloud שבו אתם מתכננים לעבוד במעבדה הזו. לוחצים על הסמל של Gemini בפינה השמאלית העליונה.

- חלון Gemini במסוף Cloud ייפתח בצד שמאל של המסוף. אם הכפתור הפעלה מופיע למטה, לוחצים עליו. אם לא מופיע הלחצן הפעלה ומופיע במקומו ממשק של Chat, סימן שכבר הפעלתם את Gemini for Cloud בפרויקט ואפשר לעבור ישירות לשלב הבא.

- אחרי שמפעילים אותו, אפשר לשאול את Gemini שאילתה או שתיים כדי להתנסות בו. מוצגות כמה דוגמאות לשאילתות, אבל אפשר לנסות שאילתה כמו What is Cloud Run?

Code Assist יגיב עם התשובה לשאלה שלכם. אפשר ללחוץ על הסמל
בפינה השמאלית העליונה כדי לסגור את חלון הצ'אט של Code Assist.
הפעלת Gemini ב-Cloud Shell Editor
Gemini Code Assist זמין ומתנהג באופן דומה בכמה סביבות פיתוח משולבות (IDE) פופולריות. ב-codelab הזה תשתמשו ב-Google Cloud Shell Editor, שפועל באופן מלא בדפדפן האינטרנט. כדי להפעיל ולהגדיר את Gemini בכלי לעריכת Cloud Shell, צריך לבצע את השלבים הבאים:
- מפעילים את Cloud Shell באמצעות הסמל שמוצג למטה. יכול להיות שייקח דקה או שתיים עד שהמכונה של Cloud Shell תופעל.

- לוחצים על Editor או על Open Editor (בהתאם למקרה) ומחכים עד ש-Cloud Shell Editor יופיע. אם מופיע הלחצן רוצה לנסות את כלי העריכה החדש?, לוחצים עליו.

- לוחצים על הלחצן Cloud Code - Sign in (קוד בענן – כניסה) בשורת הסטטוס התחתונה, כמו שמוצג. נותנים הרשאה לפלאגין לפי ההוראות. אם בשורת המצב מופיע הכיתוב Cloud Code - no project, בוחרים באפשרות הזו ואז בוחרים את הפרויקט הספציפי ב-Google Cloud שרוצים לעבוד איתו.

- אם סמל Gemini לא מופיע בשורת המצב בפינה השמאלית התחתונה, צריך להפעיל אותו ב-Cloud Code. לפני שממשיכים, צריך לוודא ש-Gemini (שנקרא בעבר Duet AI למפתחים) מופעל בסביבת הפיתוח המשולבת. לשם כך, עוברים אל Cloud Code Extension → Settings ומזינים את הטקסט Duet AI: Enable כמו שמוצג בהמשך. מוודאים שהתיבה מסומנת. צריך לטעון מחדש את סביבת הפיתוח המשולבת. הפעולה הזו תפעיל את Gemini ב-Cloud Code, וסרגל הסטטוס של Gemini יופיע בסביבת הפיתוח המשולבת (IDE).

- לוחצים על הלחצן Gemini בפינה השמאלית התחתונה כמו שמוצג, ובוחרים את הפרויקט הנכון ב-Google Cloud שבו הפעלנו את Cloud AI Companion API.

- אחרי שבוחרים את הפרויקט ב-Google Cloud, מוודאים שהוא מופיע בהודעת הסטטוס של Cloud Code בסרגל הסטטוס, וגם ש-Gemini מופעל בצד שמאל בסרגל הסטטוס, כמו שמוצג בהמשך:

Gemini Code Assist מוכן לשימוש!
3. הורדה ובדיקה של האפליקציה
בחלון הטרמינל, מריצים את הפקודה כדי לשכפל את המאגר עם קוד ההתחלה, ואז עוברים לספרייה החדשה (אם חלון הטרמינל לא פתוח יותר, לוחצים על הלחצן Terminal או Open Terminal כדי לשחזר אותו):
git clone https://github.com/GoogleCloudPlatform/testing-with-duet-ai-codelab.git
cd testing-with-duet-ai-codelab
פותחים את main.py בעורך, ואז פותחים את החלון של Gemini Chat על ידי לחיצה על סמל Gemini Chat בצד ימין של העורך. חלון Gemini Chat הזה נמצא בתוך סביבת הפיתוח המשולבת (IDE), והקוד בסביבת הפיתוח המשולבת זמין כהקשר לדיון. מזינים את ההנחיה Explain this (הסבר על זה) ורואים את התשובה:

אפשר לגלול בחלון הצ'אט כדי לראות את התשובה המלאה. בהסבר כתוב שאפשר להריץ את התוכנית הזו באופן מקומי באמצעות הפקודה python3 main.py בחלון הטרמינל.
4. הרצה באופן מקומי
אם צריך, עוברים לספריית המאגר באמצעות cd ~/testing-with-duet-ai-codelab ומזינים את הפקודה python3 main.py בחלון המסוף:

לוחצים על הקישור http://127.0.0.1:8080 כדי לפתוח כרטיסייה חדשה בדפדפן לדף הבית של האפליקציה:

האפליקציה פועלת באופן מקומי. למעשה, Cloud Shell Editor ביצע כאן קצת קסם. האפליקציה פועלת ב-Cloud Shell, ולא במחשב שלכם. כשלוחצים על הקישור, הוא פותח כרטיסייה שלא מובילה לכתובת המקומית בפועל http://127.0.0.1:8080, אלא לשרת proxy שהוגדר למטרה הזו בלבד על ידי Cloud Shell. ההשפעה זהה לזו שהייתה מתקבלת אם הייתם מריצים את הקוד באופן מקומי.
רוצה לנסות? מזינים 25 ולוחצים על המרת קובץ.

נכון, 25 הוא XXV בספרות רומיות! כאן מסתיים התהליך.
אולי כדאי לבדוק עוד כמה מספרים. המספר 25 עבד, מה לגבי 24?

יכול להיות שהיינו קצת נמהרים כשחשבנו שהכול בסדר. האם XXIIII הוא ההמרה הנכונה של 24? לא צריך להיות XXIV?
אפשר לטעון שהתשובה XXIIII נכונה, אבל זה לא מה שאנשים בדרך כלל מצפים לו. אבל מכיוון שזה לא באמת לא נכון (שימו לב שבשעונים רבים הספרה 4 מוצגת כ-IIII בספרות רומיות), נשאיר את הבעיה הזו לשיפור עתידי.
רוצה לנסות מספרים שליליים? אפס? אין דרך לייצג את המספרים האלה בספרות רומיות. לא נראה שהמשתמש מקבל תשובה, וזו שגיאה שצריך לטפל בה.
בדיקות יכולות לעזור לנו למצוא ולתקן שגיאות, ו-Gemini Code Assist יכול לעזור לנו לכתוב ולהשתמש בבדיקות.
5. הוספת בדיקות
חוזרים לחלון של Gemini Chat ושואלים
How can I test the number_to_roman function?
קוראים את התשובה, שצריכה לכלול דיון במודול unittest ובמודול pytest.
אולי תרצו ש-Gemini Code Assist יכתוב את הבדיקות האלה בשבילכם. פותחים את calendar.py, שבו נמצא קוד ההמרה בפועל, בעורך, חוזרים לחלון של Gemini Chat ושוב שואלים
How can I test the number_to_roman function?
התשובה עכשיו יותר ספציפית, והיא כוללת אפילו מודול של בדיקת יחידה שאפשר להעתיק או להוסיף לקובץ חדש:
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")
יכול להיות שתראו קוד שונה מהדוגמה שלמעלה. המודלים הבסיסיים של Gemini Code Assist מתעדכנים מעת לעת, ולכן התשובות לא תמיד יהיו זהות. אם מופיע קוד אחר, אתם יכולים להחליט אם להמשיך עם הדוגמאות שמוצגות ב-codelab הזה על ידי העתקת הקוד שמוצג כאן, או לנסות את התשובה החלופית ש-Gemini Code Assist נותן לכם עכשיו. אם יש לכם זמן, אתם יכולים לנסות את שתי הדרכים. Gemini Code Assist הוא עוזר לתכנות שאתם יכולים להשתמש בו איך שנוח לכם.
אפשר ללחוץ על החץ הכפול בפינה השמאלית העליונה של חלון Gemini Chat כדי ליצור קובץ חדש שמכיל את קוד בדיקת היחידה, או להשתמש ב-IDE כדי ליצור קובץ חדש ולהדביק את הקוד שמוצג במעבדה הזו. מקישים על CTRL-S או על CMD-S בחלון הזה כדי לשמור אותו, וקוראים לקובץ השמור calendar-unittest.py.
חוזרים לטרמינל ומקישים על CTRL-C כדי לעצור את שרת האינטרנט שהשארתם פועל קודם, ומקבלים הנחיית מעטפת. מזינים את הפקודה
python3 calendar-unittest.py
כדי להריץ את הבדיקות החדשות.
לא מוצגת פלט. זה לא מה שציפיתי. האם הכול עבר בשקט? חשוב לדעת את זה בוודאות. חוזרים לתשובה מ-Gemini Code Assist שכללה את קוד הבדיקה. מתחת לקוד היה מידע נוסף על אופן ההרצה של תרחיש הבדיקה:

מנסים להריץ את הפקודה המומלצת:
python -m unittest discover
יכול להיות שיש בעיה אם המחשב לא יוצר כינוי לפקודה python3 לפקודה python. במקרה כזה, מריצים את הפקודה:
python3 -m unittest discover
הפקודה מופעלת, אבל מחזירה Ran 0 tests in 0.000s. המודול מכיל כמה בדיקות. מה קורה?
זו המילה האחרונה בפקודה, discover. מאיפה זה הגיע? נראה ש-Gemini Code Assist ציפה שקוד הבדיקה יישמר בקובץ בשם discover או discover.py, אבל לא ציין שזה מה שצריך לעשות. מכיוון ששמרת את הקובץ ב-calendar-unittest.py, נסה להריץ את הפקודה:
python3 -m unittest calendar-unittest
עכשיו מוצג פלט ארוך שמתחיל במשהו כזה:
$ 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
בשורה הראשונה מוצג משך הזמן של כל בדיקה שעברה, וסימן F לכל בדיקה שנכשלה. רוב הבדיקות נכשלות. לאחר מכן מוצגת רשימה של הבדיקות שנכשלו, עם הפלט הצפוי והפלט בפועל. לא ברור באיזה סדר הבדיקות האלה הופעלו. הסדר היה אלפביתי לפי שם הבדיקה, ולא לפי הסדר שבו הבדיקות מופיעות בקובץ. לכן, המשתנה test_convert_1 רץ ראשון, אחר כך test_convert_1990, אחר כך test_convert_2023 וכן הלאה. רק מקרי הבדיקה של 1 ושל 2023 עברו בהצלחה.
כשניסיתם את הקוד הזה בפעם הראשונה, שמתם לב שהוא המיר את 24 ל-XXIIII. זה לא היה שגוי לגמרי, אבל זו לא הצורה הנפוצה שבה IIII מומר ל-IV. כל הבדיקות שנכשלו היו למקרים דומים. כשנרשמה הבעיה הזו לראשונה, במעבדה אמרו: "מכיוון שזה לא באמת לא נכון (שימו לב שהרבה שעונים מציגים את 4 כספרה רומית IIII), נשאיר את הבעיה הזו לשיפור עתידי".
אפשר לשנות את תרחישי הבדיקה כך שיצפו לתשובות 'לא ממש שגויות' שהקוד מספק ויקבלו אותן, או להשלים עם העובדה שהגיע הזמן ל'שיפור עתידי'. לכן השלב הבא הוא לתקן את הקוד בעזרת Gemini Code Assist, כדי שהתשובות יהיו מקובלות יותר בהתאם למה שמצופה במבחנים.
6. שיפור הקוד
נזכיר שתשובות כמו XXIIII ל-24, במקום XXIV הנפוצה יותר, נחשבו כ'לא ממש שגויות' והטיפול בהן נדחה לשיפור עתידי. העתיד הזה הוא עכשיו. התשובות האלה ש "לא ממש שגויות" עדיין מעצבנות.
הכלל הראשון לגבי ספרות חוזרות בספרות רומיות הוא: בכל פעם שיש ארבע ספרות זהות ברצף, צריך להחליף אותן באחת מהספרות ואחריה בספרה הבאה הגבוהה יותר. לכן צריך להחליף את XXIIII ב-XXIV. באופן דומה, צריך לשנות את XXXX ל-XL ואת CCCC ל-CD.
אפשר לבקש מ-Gemini Code Assist לשנות את הערך של המשתנה roman באופן הזה ממש לפני שהוא מוחזר על ידי 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?
ההצעה היא להוסיף קוד מסוים בסוף:

מעתיקים ומדביקים את השורות האלה בעורך או מקלידים אותן, ואז בודקים מה קורה:

Gemini Code Assist הוסיף עוד שורות כדי לטפל במקרים שבהם יכול להיות שתיתקלו אחרי שתבצעו את קבוצת ההחלפות הראשונה. לדוגמה, המספר 19 יומר ל-XVIIII, אחר כך ל-XVIV, ולבסוף ל-XIX הנכון.
אם Gemini Code Assist הציע הצעות שנראות שימושיות, מקישים על Tab כדי לאשר את ההמלצות, שומרים את הקובץ ומריצים שוב את שרת האינטרנט. אחרת, מוסיפים את השורות שמופיעות בדוגמה באופן ידני ושומרים את הקובץ. כדאי לנסות המרה קשה: 1999:

זה נכון.
מריצים מחדש את הבדיקות. כולם עוברים!
נראה שאפליקציית האינטרנט מוכנה להעברה לייצור.
7. פריסה ב-Cloud Run
Cloud Run יריץ בשבילכם אפליקציה בקונטיינר באינטרנט. באפליקציות שנכתבו באמצעות מסגרות נפוצות, כמו Flash, הפקודה gcloud run deploy אפילו תיצור את הקונטיינר בשבילכם לפני הפריסה. מריצים את הפקודה:
gcloud run deploy
בטרמינל. כשמופיעה בקשה לציון המיקום של קוד המקור, מקישים על Enter כדי לאשר את המיקום הנכון שמוצע. באופן דומה, כשמתבקשים להזין שם שירות, מקישים על Enter כדי לאשר את ההצעה.
יכול להיות שהפקודה תיכשל כי gcloud לא יכול לקבוע באיזה פרויקט להשתמש. במקרה כזה, מריצים את הפקודה:
gcloud config set core/project <project-id>
מחליפים את במזהה הפרויקט, שיכול להיות זהה לשם שלו. ואז מריצים מחדש את הפקודה gcloud run deploy.
- הפקודה תציג הודעה שנדרשים ממשקי API מסוימים ושעדיין לא הפעלתם אותם. מזינים y כדי להפעיל אותם.
- כשמתבקשים לבחור אזור, בוחרים אזור שנוח לכם. הזנת המספר שמתאים ל-
us-central1היא בחירה בטוחה. - כשמוצגת השאלה אם אתם רוצים להמשיך, מקישים על Y.
- מומלץ לאפשר הפעלות לא מאומתות של שירות Cloud Run הזה. אפשר להשתמש באפשרות האימות שבה משתמש Cloud Run בתוכניות שקוראות לשירות. מכיוון שמדובר באתר, לא תשתמשו באימות.
Google Cloud יבנה את הקונטיינר, יפרוס אותו, ינתב אליו תנועה ויגדיר מדיניות גישה, ואז יציג לכם את הקישור לדף הבית:

אתם יכולים ללחוץ על הקישור הזה כדי לגשת לאפליקציה.

מזינים מספר ומקישים על Enter.

מה?!
זה עבד במחשב שלך! למה זה לא הסתיים?
אולי נברר? יש לך שאלה ל-Gemini Code Assist?
Why am I getting an internal server error on cloud run?

כנראה ש-Gemini Code Assist יכול לקרוא את קובץ היומן, שכתוב בו משהו דומה. נשאל את Gemini Code Assist איך אפשר לעיין ביומני הרישום בעצמנו:

אפשר לעשות את זה. מחפשים שורות עם סימני שגיאה אדומים !! כמו בדוגמה הבאה:

אחרי זה מופיעות הרבה שורות עם פרטים על סטאק הביצוע שהובילה לכאן, אבל אז מופיע הקטע הבא:

כשמסתכלים על הקובץ calendar.py, רואים את הפונקציה number_to_roman. אתם יודעים שהיא נכונה כי היא פעלה במחשב שלכם. מה יכול להיות שונה ב-Cloud Run?
התשובה מסובכת. יש מודול סטנדרטי שכלול ב-Python3 שנקרא calendar, בדיוק כמו קובץ calendar.py שבו מוגדרת הפונקציה number_to_roman. במחשב המקומי, כש-Python חיפש מודול בשם calendar, הוא חיפש קודם בספריית האפליקציה. כנראה ש-Python ב-Cloud Run חיפש קודם מודולים רגילים, ייבא אותם ולא מצא פונקציה בשם number_to_roman.
תמיד יכולים להיות הבדלים כאלה בין סביבות. למזלנו, כשמכניסים אפליקציה לקונטיינר, היא כוללת את הסביבה שלה, כך שאפשר לצפות לאותו אופן פעולה בכל מקום שבו מריצים אותה. אם הייתם מריצים באופן מקומי את אותה אפליקציה בקונטיינר שמופעלת ב-Cloud Run, הייתם נתקלים באותה בעיה.
תקן בעיה זו. צריך לשנות את השם של מודול היומן המקומי למשהו שלא משמש גם כשם של מודול רגיל. משנים את השם של הקובץ calendar.py ל-my_calendar.py, ואז משנים את השורות import calendar בקבצים main.py ו-calendar-unittest.py ל-import my_calendar. לבסוף, משנים את השורה
roman = calendar.number_to_roman(number)
עד
roman = my_calendar.number_to_roman(number)
כדאי לנסות את הפריסה באופן מקומי, להריץ את הבדיקות ואז לפרוס מחדש:
gcloud run deploy
ועכשיו זה עובד:

אתם יכולים לשתף את כתובת ה-URL הזו, וכל מי שצריך כלי להמרת מספרים רומיים יוכל להשתמש בכלי שלכם.
8. אופציונלי: שיפור המראה
האפליקציה פועלת בצורה תקינה וכל אחד יכול לגשת אליה באינטרנט. אבל הוא נראה קצת פשוט. לפני שמשתפים את הקוד עם כולם, כדאי לבקש מ-Gemini Code Assist לשפר את המראה שלו.
פותחים את הקובץ templates/index.html. בחלון הצ'אט עם Gemini, שואלים:
Make this index.html file use material design.
התשובה היא להוסיף לקובץ הנוכחי, כך שהתוצאה תהיה דומה לזו:
<!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>
משתמשים בסמל כדי להעתיק את הקוד המוצע ומדביקים אותו במקום התוכן הקיים של index.html. בטרמינל, מריצים את הפקודה python3 main.py ולוחצים על הקישור כדי לפתוח חלון תצוגה מקדימה. הדף קצת פחות פשוט עכשיו:

אם רוצים, אפשר לחזור על הפעולה הזו עם הקובץ convert.html.
Gemini Code Assist מכיר הרבה CSS, ואפשר להיעזר בו כדי לעצב את דפי האפליקציה במגוון דרכים. זו רק ההתחלה.
מכיוון שאתם רוצים לשתף את האפליקציה הזו, אל תשכחו לפרוס אותה מחדש ב-Cloud Run:
gcloud run deploy
אתם יכולים להעביר את כתובת ה-URL לאנשים שצריכים להמיר למספרים רומיים.
9. מעולה!
מזל טוב – השתמשת ב-Gemini Code Assist כדי להוסיף בדיקות לאפליקציה, לתקן שגיאות ולהוסיף פונקציונליות משופרת.
אחרי שמסיימים להשתמש באפליקציה שיוצרים, אפשר למחוק אותה מלוח הבקרה במסוף Cloud כדי למנוע חיובים עתידיים.