Load Test עם Locust

בזמן האחרון אני עובד על סרביס חדש אצלנו, וזו הפעם הראשונה בה אנחנו עובדים עם 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

Bash
pip3 install locust


אם ההתקנה נכשלת לכם, אתם יכולים להסתכל בדף ויקי על מנת לראות מה יכולה להיות הבעיה.

אחרי שההתקנה עוברת בהצלחה, אפשר לוודא אותה על ידי הרצה של הפקודה הבאה

Bash
locust -V


הפלט צריך להיות דומה לזה:

Bash
locust 2.15.1 from /usr/local/lib/python3.11/site-packages/locust (python 3.11.3)

הטסט הראשון

כמו שכבר אמרתי, כשאר אנחנו כותבים ב-Locust, אנחנו בעצם משתמשים בסינטקסט של פייתון.
בואו נסתכל על דוגמה

Python
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.
מאותו נתיב שבו נמצא הקובץ תריצו את הפקודה:

Bash
locust


אתם תראו פלט כזה

Bash
[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 ואתם אמורים לראות משהו כזה

ממשק גרפי של Locust
ממשק גרפי של Locust

בשדה Host אתם צריכים לשים את ה-host של האפליקציה אותה אתם רוצים לבדוק ולחצו על Start swarming.
מה שיקרה עכשיו הוא ש-Locust תיצור יוזר בודד, והוא ישלח כל שניה את הבקשות /hello ואת /world.
אתם אמורים לראות מסך דומה לזה: אשר מראה את התוצאות של הריצה

תוצאות ריצה

פה אתם יכולים לראות עבור כל סוג של בקשה, כמה כאלה בוצעו, כמה נכשלו, ומה הסטטיסטיקות של הביצוע
כמובן של-UI יש עוד יכולות יפות, ואני ממליץ בחום לקחת את הזמן עכשיו והלסתכל על מה כל טאב נותן לכם.

דרך ה-CLI

כל זה נחמד ויפה, אבל רוב הסיכויים שאתם לא תריצו את Locust ידנית דרך ה-UI.
הרי זוהי אוטומציה. ואוטומציה צריכה לדעת לרוץ דרך כלים אוטומטיים כחלק מה-CI/CD שלנו.
אז איך אפשר להריץ את Locust בלי UI?

אנחנו יכולים להריץ את הפקודה הבאה:

Bash
locust --headless -u 10 -r 1 -H http://your-server.com


כאשר אנחנו מעבירים ל-Locust את הפלאג --headless, היא יודעת שהיא לא צריכה להרים את ה-UI.
אבל עכשיו, אנחנו צריכים להעביר כמה יוזרים אנחנו רוצים שיהיה לנו, כמה יוזרים נוצרים כל שניה, ומה ה-host של האפליקציה שלנו.
מקודם אנחנו העברנו את זה דרך ה-UI. עכשיו אנחנו מעבירים את זה באמצעות פרמטרים:

  • -u (אפשר גם --users) – כמה מקסימום יוזרים יש לנו בריצה הנוכחית.
  • -r (אפשר גם --spawn-rate) – כמה יוזרים נוצרים כל שניה
  • -H (אפשר גם --host) – מה הURL של האפליקציה

הפעם הפלט שלנו יראה כך

Bash
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.

השאר תגובה

Scroll to Top