בזמן האחרון אני עובד על סרביס חדש אצלנו, וזו הפעם הראשונה בה אנחנו עובדים עם SaaS.
אז קודם כל זה מרגש, שנותנים לי להיות שותף בהרמה של פרויקט כזה גדול.
אבל מעבר לזה, זה נותן לי המון אופציות להכיר טכנולוגיות חדשות.
אחת הטכנולוגיות האלו היא ספריית Locust, אשר משמשת לביצוע של Load Test
מהו Load Test
לפני שנצלול פנימה אל הספרייה עצמה, אני רוצה להציג קודם קצת מה זה Load Test
Load Test זה סוג של בדיקת ביצועים (performance test) אשר בודק את התנהגות המערכת תחת עומס כבד.
המטרה ב-load test היא למדוד את ביצועי המערכת תחת לחץ ולנסות למצוא צווארי בקבוק.
במקרה של סרביס שהוא HTTP server עם API (כמו הסרביס שאני בניתי),
אנחנו נמדוד כמה זמן לוקח לסרביס לענות כאשר אנחנו שמים אותו תחת לחץ
וכמה בקשות במקביל הוא מסוגל לטפל
בואו נכיר את Locust
Locust היא ספריית פייתון אשר נועדה לביצוע של performance tests.
מאוד קל לכתוב בה, והיא גם ניתנת להרחבה (אם אתם צריכים עוד פונקציונליות).
באמצעות Locust
אתם יכולים להגדיר את ההתנהגות הצפויה של היוזרים שלכם באמצעות פייתון.
איך מתקינים?
על מנת להשתמש ב-Locust
אתם צריכים שיהיה לכם פייתון מותקן (גרסת 3.7 ומעלה).
לאחר מכן אפשר להתקין את Locust
pip3 install locust
אם ההתקנה נכשלת לכם, אתם יכולים להסתכל בדף ויקי על מנת לראות מה יכולה להיות הבעיה.
אחרי שההתקנה עוברת בהצלחה, אפשר לוודא אותה על ידי הרצה של הפקודה הבאה
locust -V
הפלט צריך להיות דומה לזה:
locust 2.15.1 from /usr/local/lib/python3.11/site-packages/locust (python 3.11.3)
הטסט הראשון
כמו שכבר אמרתי, כשאר אנחנו כותבים ב-Locust
, אנחנו בעצם משתמשים בסינטקסט של פייתון.
בואו נסתכל על דוגמה
from locust import HttpUser, task
class HelloWorldUser(HttpUser):
@task
def hello_world(self):
self.client.get("/hello")
self.client.get("/world")
מה שעשינו פה הוא בעצם יצרנו יוזר והגדרנו לו את ההתנהגות שלו.
היוזר הזה ישלח שתי בקשות GET, אחת עבור /hello
ואחת עבור /world
איך להריץ את הטסט
דרך הממשק הגרפי
קחו את הקוד שכתבנו, ושימו אותו בתוך קובץ שנקרא locustfile.py
.
מאותו נתיב שבו נמצא הקובץ תריצו את הפקודה:
locust
אתם תראו פלט כזה
[2023-06-06 15:15:58,187] /INFO/locust.main: Starting web interface at http://0.0.0.0:8089 (accepting connections from all network interfaces)
[2023-06-06 15:15:58,205] /INFO/locust.main: Starting Locust 2.15.1
בדפדפן שלכם לכו לכתובת http://localhost:8089 ואתם אמורים לראות משהו כזה
בשדה Host
אתם צריכים לשים את ה-host של האפליקציה אותה אתם רוצים לבדוק ולחצו על Start swarming
.
מה שיקרה עכשיו הוא ש-Locust
תיצור יוזר בודד, והוא ישלח כל שניה את הבקשות /hello
ואת /world
.
אתם אמורים לראות מסך דומה לזה: אשר מראה את התוצאות של הריצה
פה אתם יכולים לראות עבור כל סוג של בקשה, כמה כאלה בוצעו, כמה נכשלו, ומה הסטטיסטיקות של הביצוע
כמובן של-UI יש עוד יכולות יפות, ואני ממליץ בחום לקחת את הזמן עכשיו והלסתכל על מה כל טאב נותן לכם.
דרך ה-CLI
כל זה נחמד ויפה, אבל רוב הסיכויים שאתם לא תריצו את Locust
ידנית דרך ה-UI.
הרי זוהי אוטומציה. ואוטומציה צריכה לדעת לרוץ דרך כלים אוטומטיים כחלק מה-CI/CD שלנו.
אז איך אפשר להריץ את Locust
בלי UI?
אנחנו יכולים להריץ את הפקודה הבאה:
locust --headless -u 10 -r 1 -H http://your-server.com
כאשר אנחנו מעבירים ל-Locust
את הפלאג --headless
, היא יודעת שהיא לא צריכה להרים את ה-UI.
אבל עכשיו, אנחנו צריכים להעביר כמה יוזרים אנחנו רוצים שיהיה לנו, כמה יוזרים נוצרים כל שניה, ומה ה-host של האפליקציה שלנו.
מקודם אנחנו העברנו את זה דרך ה-UI. עכשיו אנחנו מעבירים את זה באמצעות פרמטרים:
-u
(אפשר גם--users
) – כמה מקסימום יוזרים יש לנו בריצה הנוכחית.-r
(אפשר גם--spawn-rate
) – כמה יוזרים נוצרים כל שניה-H
(אפשר גם--host
) – מה הURL של האפליקציה
הפעם הפלט שלנו יראה כך
Type Name # reqs # fails | Avg Min Max Med | req/s failures/s
--------|----------------------------------------------------------------------------|-------|-------------|-------|-------|-------|-------|--------|-----------
GET /hello 47 47(100.00%) | 106 103 158 103 | 6.00 6.00
GET /world 45 45(100.00%) | 104 103 107 103 | 5.50 5.50
--------|----------------------------------------------------------------------------|-------|-------------|-------|-------|-------|-------|--------|-----------
Aggregated 92 92(100.00%) | 105 103 158 103 | 11.50 11.50
כל שניה תודפס שורה כזאת אשר תייצג את מה שקרה באותה שניה.
כמובן שיש עוד הרבה קונפיגורציות אשר אפשר להריץ את locust
איתן, ועוד דברים אשר אפשר להגדיר בקוד עצמו
סיכום
אז הפעם הכרנו ספרייה אשר משמשת ל-Performance Tests, שנקראת Locust
ראינו איך מתקינים, איך כותבים טסט, ואיך מריצים דרך ה-UI ודרך ה-CLI.