תארו לעצמכם: האתר שלכם עובד מצוין עם 100 מבקרים, אבל קורס ב-1000. 50% מהמשתמשים עוזבים אם עמוד נטען יותר מ-3 שניות. למסחר אלקטרוני, השבתה יכולה לעלות עד 10,000 דולר לשעה. אנחנו צוות מהנדסים עם 10 שנות ניסיון בבדיקות עומס. אנו מפתחים בדיקות עומס באמצעות Locust כדי לזהות צווארי בקבוק לפני שהם משפיעים על העסק שלכם. התרחישים שלנו מחקים התנהגות משתמש אמיתית: התחברות, צפייה במוצרים, ביצוע הזמנות. אנו מריצים בדיקות ב-CI/CD—אתם לומדים על בעיות במהלך הפיתוח, לא לאחר העלייה לאוויר. יותר מ-100 פרויקטים מוצלחים למסחר אלקטרוני, SaaS ומדיה. אנו מבטיחים שהאתר שלכם יעמוד בכל עומס לאחר הבדיקות שלנו.
לפי תיעוד Locust, "Locust הוא כלי בדיקת עומס בקוד פתוח שנכתב ב-Python." זה מסביר את הגמישות שלו: תרחישים נכתבים ב-Python, ומאפשרים כל לוגיקה—מבקשות GET פשוטות ועד זרימות אימות מורכבות עם טוקנים.
כיצד אנו בונים בדיקות עומס עם Locust
השוואה: Locust מול JMeter
Locust משתמש ב-Python לגמישות בלוגיקה מורכבת (לדוגמה, אימות מבוסס טוקן, יצירת נתונים דינמית). JMeter משתמש ב-XML, שפחות קריא. Locust מתרחב בקלות: הוסיפו 10 מכונות כדי לדמות 100,000 משתמשים. בבדיקות שלנו, Locust מייצר עומס פי 3 מהר יותר על אותה חומרה.
| כלי | שפת סקריפטים | מדרגיות | ממשק אינטרנט |
|---|---|---|---|
| Locust | Python | גבוהה | כן |
| JMeter | XML | בינונית | כן |
| k6 | JavaScript | גבוהה | לא |
למה לבחור ב-Locust?
יתרונות מרכזיים: קוד פתוח, קהילה פעילה, תמיכה במצב מבוזר, וממשק אינטרנט מובנה לניטור בזמן אמת. השתמשנו ב-Locust במשך יותר מ-8 שנים ואנו רואים בו את הבחירה הטובה ביותר לבדיקות עומס גמישות.
אילו תרחישים אנו כותבים?
תרחישים טיפוסיים כוללים:
- אימות וניהול סשנים
- חיפוש וסינון בקטלוג
- צפייה בעמודי מוצר
- הוספה לסל ותשלום
- קריאות API לשירותים חיצוניים
כל תרחיש כולל בדיקות על סטטוס, זמן תגובה ומבנה נתונים. אנו משתמשים במשקלים כדי לדמות תדירויות פעולה שונות.
דוגמה לתרחיש בסיסי
# locustfile.py
from locust import HttpUser, task, between
import random
class WebsiteUser(HttpUser):
wait_time = between(1, 3)
def on_start(self):
self.client.post("/api/auth/login", json={
"email": f"user{random.randint(1,1000)}@test.com",
"password": "testpassword"
})
@task(3)
def browse_products(self):
self.client.get(f"/api/products?page={random.randint(1,10)}")
@task(2)
def view_product(self):
self.client.get(f"/api/products/{random.randint(1,500)}")
@task(1)
def create_order(self):
self.client.post("/api/orders", json={
"product_id": random.randint(1,100),
"quantity": random.randint(1,3)
})הקוד הזה הוא הבסיס לבדיקה. אנו מוסיפים מדדים וספים.
מדדים ובדיקות
from locust import events
from locust.runners import MasterRunner
@events.request.add_listener
def on_request(request_type, name, response_time, response_length, response, context, exception, start_time, url, **kwargs):
if exception:
print(f"Request failed: {name} - {exception}")
elif response_time > 2000:
print(f"Slow request: {name} - {response_time}ms")
@events.quitting.add_listener
def assert_stats(environment, **kwargs):
stats = environment.runner.stats
total = stats.total
if total.fail_ratio > 0.01:
print(f"FAIL: Error rate {total.fail_ratio:.2%} > 1%")
environment.process_exit_code = 1
if total.avg_response_time > 500:
print(f"FAIL: Avg response time {total.avg_response_time:.0f}ms > 500ms")
environment.process_exit_code = 1
p99 = total.get_response_time_percentile(0.99)
if p99 > 2000:
print(f"FAIL: p99 {p99:.0f}ms > 2000ms")
environment.process_exit_code = 1אנו אוספים מדדים עבור כל בקשה ומגדירים ספים: שיעור שגיאות ≤1%, זמן תגובה ממוצע ≤500ms, אחוזון 99 ≤2s. חריגה עוצרת את הבדיקה עם קוד שגיאה.
הרצת בדיקות
# Headless режим для CI/CD
locust -f locustfile.py --headless --users 100 --spawn-rate 10 --run-time 5m --host https://staging.example.com --html report.html
# Distributed mode (несколько машин)
# Master
locust -f locustfile.py --master --expect-workers=3
# Workers
locust -f locustfile.py --worker --master-host=192.168.1.100ממשק האינטרנט זמין בכתובת # locustfile.py from locust import HttpUser, task, between import random class WebsiteUser(HttpUser): wait_time = between(1, 3) def on_start(self): self.client.post("/api/auth/login", json={ "email": f"user{random.randint(1,1000)}@test.com", "password": "testpassword" }) @task(3) def browse_products(self): self.client.get(f"/api/products?page={random.randint(1,10)}") @task(2) def view_product(self): self.client.get(f"/api/products/{random.randint(1,500)}") @task(1) def create_order(self): self.client.post("/api/orders", json={ "product_id": random.randint(1,100), "quantity": random.randint(1,3) }) לשליטה ידנית.
כיצד לשלב בדיקות עומס ב-CI/CD
דוגמה ל-GitHub Actions
---
- name: Run Locust Load Test
run: |
locust -f locustfile.py --headless --users 50 --spawn-rate 5 --run-time 3m --host ${{ vars.STAGING_URL }} --html load-report.html
continue-on-error: false
- name: Upload Report
uses: actions/upload-artifact@v3
with:
name: load-test-report
path: load-report.html
---בדיקות רצות אוטומטית בכל עלייה לאוויר. אם הספים נחצים, ה-pipeline נכשל—אתם יודעים על הבעיה לפני העלייה לאוויר.
תהליך ותוצאות
שלבי העבודה
- ניתוח – לימוד הארכיטקטורה, זיהוי פעולות קריטיות, איסוף לוגים אמיתיים של משתמשים.
- עיצוב – כתיבת תרחישים עם משקלים, הוספת בדיקות.
- יישום – יצירת
from locust import events from locust.runners import MasterRunner @events.request.add_listener def on_request(request_type, name, response_time, response_length, response, context, exception, start_time, url, **kwargs): if exception: print(f"Request failed: {name} - {exception}") elif response_time > 2000: print(f"Slow request: {name} - {response_time}ms") @events.quitting.add_listener def assert_stats(environment, **kwargs): stats = environment.runner.stats total = stats.total if total.fail_ratio > 0.01: print(f"FAIL: Error rate {total.fail_ratio:.2%} > 1%") environment.process_exit_code = 1 if total.avg_response_time > 500: print(f"FAIL: Avg response time {total.avg_response_time:.0f}ms > 500ms") environment.process_exit_code = 1 p99 = total.get_response_time_percentile(0.99) if p99 > 2000: print(f"FAIL: p99 {p99:.0f}ms > 2000ms") environment.process_exit_code = 1, הגדרת מצב מבוזר ו-CI/CD. - ביצוע – הרצת בדיקות על staging וייצור.
- דוח – מתן גרפים של בדיקות עומס, אחוזונים, המלצות אופטימיזציה.
מה כלול בתוצאה
| רכיב | תיאור |
|---|---|
| תרחישים | 3–5 קבצי # Headless режим для CI/CD locust -f locustfile.py --headless --users 100 --spawn-rate 10 --run-time 5m --host https://staging.example.com --html report.html # Distributed mode (несколько машин) # Master locust -f locustfile.py --master --expect-workers=3 # Workers locust -f locustfile.py --worker --master-host=192.168.1.100 עם סוגי משתמשים שונים |
| תצורה | הגדרות למצב headless, מבוזר, CI/CD (GitHub Actions/GitLab CI) |
| תיעוד | תיאורי תרחישים, הוראות הרצה, פירוש דוחות |
| תמיכה | 30 ימי ייעוץ אופטימיזציה לאחר המסירה |
לוח זמנים ותמחור
פיתוח בדיקות עומס אורך בין 2 ל-5 ימים תלוי במורכבות. התמחור אישי—צרו קשר להערכה. ההשקעה מחזירה את עצמה במניעת השבתות: כשל בודד בעונת שיא יכול לעלות על 100,000 דולר בהפסדים.
טעויות נפוצות בבדיקות עומס
- תרחישים אחידים – כל המשתמשים עושים אותו דבר, לא משקפים התנהגות אמיתית.
- ללא בדיקות – הבדיקה "עוברת" גם עם 50% שגיאות.
- בדיקות רק על staging – הייצור עשוי להתנהג אחרת בגלל תצורה או עומס.
- מכונות לא מספיקות – שרת אחד לא יכול לספק עומס מספק ל-10,000 משתמשים.
- התעלמות ממטמונים – יש להריץ בדיקות על מטמון "קר".
דוגמה מפורטת להגדרת מצב מבוזר
במצב מבוזר, ה-master מחלק את העומס בין ה-workers. השתמשו במכונות ענן כדי להתרחב עד 100,000 משתמשים.סיכום
בדיקות עומס עם Locust עוזרות למנוע השבתות ואובדן לקוחות. נעריך את הפרויקט שלכם תוך יום אחד—צרו קשר לייעוץ. ההכנסות האבודות מאתר לא פעיל יכולות להגיע ל-50,000 דולר ליום—אל תסתכנו בכך.







