כלי עומסים – חלק א (Locust)

בסדרת הפוסטים הבאה אני הולך לדבר איתכם על בדיקות עומסים. המושג בעברית עומסים מסתיר בתוכו למעשה מגוון של סוגי בדיקות אשר מקובל יותר להגיד אותם באנגלית: Load, Performance, Stress, Volume… אלו הן כמובן לא אותן הבדיקות, למרות השם הכולל (בעברית): עומסים (ישנם כאלו שמבלבלים וקוראים לעומסים גם ביצועים), רק על המושגים הללו ועל מה בדיוק כל אחד מהסוגים השונים סודק (ולמה אנחנו רוצים לבדוק סוג כזה) ניתן לכתוב פוסט בנפרד, אך בסדרת הפוסטים הבאה אני מעוניין לדבר על הת'כלס, על העבודה עם הכלים הללו שמאפשרים לנו לבצע את בדיקות העומסים \ ביצועים.

לשם כך בחרתי לכתוב על ארבעת הכלים הפופולריים שקיימים היום בשוק בתחום: Locust, Gatling, K6, JMeter

בפוסט זה, חלק א' , אנחנו נתמקד בכלי – Locust

כלי ה-Locust:

ה-Locust הינו כלי בדיקות עומסים פתוח (Open Source) והוא נכתב בשפת פייתון, השם אגב בתרגום לעברית = חגב (אותה חיה קטנה שכולם מפחדים ממנה, אך למעשה אינה מזיקה לנו בני האדם), בעזרת כלי זה נוכל לדעת מהו מקסימום המשתמשים אשר יכולים להתחבר למערכת בו זמנית, לחבר'ה היודעים כבר לקודד בפייתון זהו כלי מצויין עבורם עימו ירגישו ממש כמו בבבית

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

המושג Swarm (בעברית: נחיל) מתאר קבוצה של משתמשים אשר "תוקפות" את המערכת ובכך מדמה את ריבוי חיבורים לשרת

המושג Spawn (בעברית: להשריץ) מתאר את המשתמשים, או יותר נכון את הדמיית המשתמשים שפונים אל המערכת בבקשות

 

התקנה:

למפתחי אוטומציה בפייתון, תהליך ההתקנה יראה מאוד פשוט, מדובר כאן בסה"כ בהתקנת package חדש לפרוייקט, אהה… כן, אחנו נצטרך לפתוח פרוייקט בפייתון קודם כל.

אחרי שפתחנו פרוייקט פייתון חדש, נתקין את Locust ע"י פתיחת הטרמינל והכנסת הפקודה: pip3 install locust

 

ה-Locust מגיע עם מגוון של מחלקות שיעזרו לנו לבצע את הבדיקות שלנו על המערכת, מחלקות כמו: User, HttpUser, TeskSet, SquentialTaskSet, HttpSession, Response ועוד…

 

ה-Hello World שלנו:

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

דוגמא לשימוש עם מחלקת User, ניצור קובץ פייתון (py) חדש (אני קראתי לו – hello_world.py) ונכתוב את קטע הקוד הבא:

from locust import User, task


class HelloWorld(User):
    @task
    def test01(self):
        print("Test 01: Hello World")

    @task
    def test02(self):
        print("Test 02: Goodbye")

מה אנחנו רואים כאן ?

יצרתי 2 מקרי בדיקה (Tasks) , בראשון הדפסתי Hello World ובשני: Goodbye , אלו הם כמובן אינם מקרי בדיקה אמיתיים שכן אין אנו בודקים כאן דבר (רק מדפיסים)

 

הרצה וצפייה בתוצאות:

כדי להריץ את המחלקה שלנו ב-Locust, נפתח שוב את הטרמינל ונריץ את הקובץ שיצרנו ע"י הפקודה הבאה:

locust -f .\Tests\hello_world.py

* ה f- מייצג לנו פרמטר של שם קובץ.
בשלב זה העלנו את שרת ה-Locust ממנו נשלוט ונגדיר את ההרצה שלנו, כעת אנו צריכים לפתוח את ממשק השרת, לבצע את ההגדרות הרצויות ולהריץ, זהו שרת Web ועל כן כדי לצפות בו נפתח את הדפדפן ונכתוב בכתובת: localhost:8089 (שרת מקומי שרץ על פורט ברירת מחדל: 8089)

מה אנחנו רואים כאן ?

השדה הראשון (Number of Users) מאפשר לנו לקבוע כמה משתמשים בו זמנית יריצו את שני ה-Tasks שהגדרנו בקוד, במילים אחרות: מהו גודל ה-Spawn

השדה השני (Spawn Rate) מאפשר לנו להגדיר את קצב שליחת הבקשות (במקרה שלנו: ההדפסות לקונסול)

השדה השלישי מאפשר לנו להגדיר את השרת עליו נרצה לבצע את הקריאות, במקרה שלנו, מכיוון שאנו כעת רק מדפיסים לקונוסול, נשאיר שדה זה ריק

הקשה על כפתור ה-Start swarming תתחיל את ההרצה.

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

* אם אתם שואלים למה Test02 למשל רץ 3 פעמים ורק אח"כ הוא עובר ל-Test01 , זה בסדר גמור, כי לא התייחסנו לנושא הסינכרון (בקוד)

זוהי הרצה שאינה מסתיימת עד אשר נלחץ על כפתור ה-Stop בממשק ה-Locust (בדפדפן):

שימו לב כי אם נרצה כעת לבצע שינויים בקוד, כדי להחיל אותם על שרת ה-Locust נצטרך לסגור ולאתחל אותו שוב, זאת אומרת שבטרמינל נלחץ על Control+C ונריץ שוב את הפקודה: locust -f .\Tests\hello_world.py

 

דוגמא לבדיקה בעולם האמיתי:

אוקיי הדוגמא הקודמת הייתה מאוד בסיסית ולא באמת מייצגת מקרה בדיקה אמיתי, לשם כך, בחרתי להשתמש בשרת ה-API של צ'ק נוריס הגדול ולהיא משם בדיחה רנדומלית (מוזמנים לקרוא בדוקומנטציה באתר כדי להבין איך עובדים מול השרת).

ניצור קובץ פייתון חדש לבדיקות (קראתי לו chuck_norris.py) ונכתוב לנו את הקוד הבא:

from locust import HttpUser, task


class ChuckNorris(HttpUser):
    @task
    def test01(self):
        self.client.get("/jokes/random")

* שימו לב כי השתמשתי פה הפעם במחלקת HttpUser (ממנה אני יורש) ולשם כך קראתי ל-client.get עם ה-resource המיוחל

נריץ את הבדיקה כך (הייתי מאוד עדין כשנתתי לו 1 ו-1 , בעולם האמיתי אתם תעמיסו עליו יותר משתמשים ובקצב גבוה יותר):

 

וכעבור זמן מה נעצור את ההרצה:

בטבלה הנ"ל אנחנו רואים מידע שנוצר לנו ע"י Locust על עבודתו הקשה כמו כמה בקשות נשלחו , כמה מהם נכשלו, רישמות שמתארות את הזמנים ועוד.

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

כמו כן, ה-Locust מאפשר לכם לצפות במידע נוסף אותו תראו בטאבים של הטבלה כמו   Charts, Failures ועוד…

 

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

ישנם עוד פיצ'רים רבים ש-Locust מאפשר לכם, כמו וולידציות, פרמטרים , On Start ו-On Stop ועוד… אך זה כבר לא בפוסט הזה. בפוסט זה הצגנו בפניכם את הכלי Locust ונתנו את נקודת ההתחלה ממנה ניתן להתחיל לעבוד עם הכלי הנהדר הזה, בפוסטים הבאים נמשיך ונדבר על כלי עומסים נוספים אשר פופולרים בתעשייה

 

Scroll to Top
דילוג לתוכן