ما هو اختبار الأداء؟

يفحص اختبار الأداء كيف يتصرف النظام تحت حمل عمل معيّن: مدى سرعة استجابته، وعدد الطلبات التي يستطيع معالجتها، وما إذا كان يبقى مستقراً مع الوقت، وما يحدث عندما يُدفع إلى ما بعد حدوده. الاختبارات الوظيفية تجيب عن «هل يعمل؟»؛ أما اختبارات الأداء فتجيب عن «هل ما زال يعمل في التاسعة صباح يوم الإطلاق مع عشرة آلاف مستخدم؟».

يشرح هذا الدليل أنواع اختبار الأداء ومتى يُستخدم كل منها، والمقاييس التي تُقاس وكيفية قراءتها، وخطة عملية لأول اختبار لواجهة API أو تطبيق ويب، والأدوات التي تولّد الحمل.

أنواع اختبار الأداء

  • اختبار التحميل — الحركة المتوقعة الواقعية (المتوسطة والذروة) للتأكد من أن النظام يحقق أهداف زمن الاستجابة والأخطاء في الظروف الطبيعية.
  • اختبار الضغط — دفع الحركة إلى ما بعد الذروة المتوقعة حتى يتعطل شيء ما، لإيجاد الحد ومعرفة ما إذا كان الفشل رشيقاً (بطء، 503) أم كارثياً (انهيارات، تلف بيانات).
  • اختبار الذروة — قفزة مفاجئة من حركة منخفضة إلى عالية جداً، كما في حملة تسويقية أو تخفيضات خاطفة، لفحص التوسع التلقائي وقوائم الانتظار.
  • اختبار التحمّل — حمل معتدل لساعات أو أيام، لاكتشاف تسرّبات الذاكرة واستنفاد مجمّعات الاتصالات ونمو القرص التي لا تظهرها الاختبارات القصيرة أبداً.
  • اختبار قابلية التوسع — زيادة الحمل على مراحل لمعرفة كيف تتغير الإنتاجية وزمن الاستجابة مع إضافة الموارد.
  • قياس الأداء المرجعي — قياس سريع قابل للتكرار لنقطة نهاية واحدة لمقارنة إصدارين أو تطبيقين.

جرّبها: قياس أداء طلبات HTTP جرّبها: مقارنة أداء API

المقاييس المهمة

  • زمن الاستجابة — يُقاس لكل طلب. أبلغ عن المئينات لا المتوسط: يخبرك p50 (الوسيط) وp95 وp99 بما يختبره معظم المستخدمين وأقلهم حظاً. المتوسط يخفي الذيل البطيء.
  • الإنتاجية — عدد الطلبات في الثانية (أو المعاملات في الثانية) التي يحافظ عليها النظام.
  • معدل الأخطاء — نسبة الطلبات الفاشلة (5xx، انتهاء المهلة، أخطاء الاتصال). يجب أن تبقى قريبة من الصفر عند الحمل المستهدف.
  • التزامن — عدد المستخدمين الافتراضيين أو الاتصالات المفتوحة النشطة في اللحظة نفسها.
  • استخدام الموارد — المعالج والذاكرة واتصالات قاعدة البيانات وعمق قائمة الانتظار في جهة الخادم، مربوطة بالخط الزمني للحمل.
  • Apdex أو الالتزام بـ SLO — حصة الطلبات ضمن الميزانية المتفق عليها (مثلاً 95% تحت 300 مللي ثانية).

جرّبها: محلّل زمن الاستجابة جرّبها: محلّل حجم الاستجابة

التخطيط لأول اختبار أداء

  • حدد الهدف كرقم: «يكتمل إتمام الشراء في أقل من 800 مللي ثانية عند p95 مع 500 مستخدم متزامن وأقل من 0.1% أخطاء».
  • اختر الرحلات الحرجة — تسجيل الدخول، والبحث، والإضافة إلى السلة، وإتمام الشراء، وأهم ثلاث نقاط نهاية في API — بدلاً من كل صفحة.
  • نمذج حركة واقعية: مزيج الرحلات، ووقت التفكير بين الإجراءات، والتصاعد والحالة المستقرة. استخدم تحليلات الإنتاج إن توفرت.
  • جهّز بيانات اختبار على نطاق واسع: آلاف المستخدمين والمنتجات والحمولات المختلفة حتى تتصرف الذاكرة المؤقتة والقيود الفريدة كما في الإنتاج.
  • نفّذ في بيئة تشبه الإنتاج حجماً، أو قِس النتائج بشكل متعمّد. قاعدة بيانات بحجم حاسوب محمول لن تخبرك شيئاً عن قاعدة الإنتاج.
  • أنشئ خط أساس أولاً بمستخدم واحد، ثم صعّد. قارن كل تشغيل لاحق بخط الأساس.
  • راقب جهة الخادم أثناء التشغيل؛ فأرقام جهة العميل وحدها لا تخبرك لماذا أصبح بطيئاً.

جرّبها: مولّد بيانات اختبار التحميل جرّبها: مولّد اختبارات الطلبات المتزامنة

الأدوات: JMeter وk6 وGatling وأدوات المتصفح

Apache JMeter هو الخيار مفتوح المصدر العريق بواجهة رسومية ومسجّلات ومجموعات بيانات CSV؛ وk6 قائم على السكربتات (JavaScript) وخفيف وصديق لـ CI؛ وGatling قائم على Scala/Java بتقارير ممتازة؛ وLocust قائم على Python. وتشغّل الخدمات السحابية (BlazeMeter وGrafana Cloud k6 وAzure Load Testing) السكربتات نفسها من مناطق متعددة.

لا يستطيع المتصفح توليد حمل بحجم الإنتاج، لكن أدوات المتصفح مثالية للخطوات المحيطة باختبار التحميل: قياس توزيع زمن استجابة نقطة نهاية واحدة، ومقارنة نقطتين، وفحص حجم الحمولة والضغط، وتوليد ملفات CSV وJSON التي تستهلكها أدوات التشغيل.

جرّبها: مولّد بيانات اختبار JMeter جرّبها: مولّد CSV لـ JMeter جرّبها: قياس أداء طلبات HTTP

قراءة النتائج

  • ارتفاع زمن الاستجابة مع ثبات الإنتاجية يعني بلوغ عنق زجاجة — المعالج أو قاعدة بيانات أو مجمّع اتصالات أو واجهة API تابعة.
  • تصاعد معدل الأخطاء قبل زمن الاستجابة يعني غالباً حداً (أقصى اتصالات، تحديد معدل) لا بطئاً.
  • p99 أعلى بكثير من p95 يشير إلى توقفات جمع القمامة أو تنافس الأقفال أو تبعية بطيئة تصيب بضعة طلبات.
  • التدهور البطيء أثناء اختبار التحمّل تسرّب: ذاكرة أو مقابض ملفات أو اتصالات.
  • النتيجة التي لا يمكن إعادة إنتاجها في تشغيل ثانٍ ضوضاء؛ أصلح البيئة قبل ضبط الكود.

جرّبها: مقارنة أداء API جرّبها: محلّل ترويسات التخزين المؤقت

الأخطاء الشائعة

  • الاختبار بمعرّف مستخدم واحد أو منتج واحد — كل شيء يصيب الذاكرة المؤقتة والأرقام خيالية.
  • التصعيد إلى الحمل الكامل فوراً ثم لوم النظام على ذروة لم يُصمَّم لها.
  • الإبلاغ عن المتوسطات. أبلغ دائماً عن p95 وp99 مع معدل الأخطاء.
  • تشغيل مولّد الحمل على الجهاز نفسه الذي يعمل عليه النظام قيد الاختبار.
  • تجاهل حجم الحمولة: استجابة JSON بحجم 2 ميجابايت بطيئة مهما كان الخادم سريعاً.
  • الاختبار مرة واحدة قبل الإطلاق ثم عدم تكراره أبداً. يتراجع الأداء التزاماً بعد آخر.

جرّبها: محلّل حجم الاستجابة جرّبها: مولّد بيانات اختبار التحميل

الأسئلة الشائعة

ما الفرق بين اختبار التحميل واختبار الضغط؟

يطبّق اختبار التحميل الحركة المتوقعة للتأكد من تحقيق الأهداف؛ بينما يواصل اختبار الضغط زيادة الحركة إلى ما بعد الذروة المتوقعة لإيجاد نقطة الانهيار ومعرفة كيف يفشل النظام.

ما زمن الاستجابة الجيد لواجهة API؟

يعتمد على الاستخدام، لكن الميزانيات الشائعة هي أقل من 100 مللي ثانية للقراءات المخزّنة مؤقتاً، وأقل من 300 مللي ثانية لاستدعاءات API المعتادة، وأقل من ثانية للعمليات الثقيلة — مقيسة عند p95 لا كمتوسط.

لماذا نستخدم p95 بدلاً من متوسط زمن الاستجابة؟

تخفي المتوسطات الذيل البطيء. يقول p95 إن 95% من الطلبات كانت بهذه السرعة على الأقل، وهو ما يلاحظه المستخدمون؛ ويُظهر p99 أسوأ حالة واقعية.

كم مستخدماً افتراضياً أحتاج؟

اشتقه من الحركة الحقيقية: ذروة الطلبات في الثانية مضروبة في متوسط مدة الطلب تعطي التزامن الذي يجب أن تحافظ عليه. أضف هامشاً من 20–50% للنمو.

هل يمكنني اختبار الأداء من المتصفح؟

يمكنك قياس نقاط نهاية فردية ومقارنة نقطتين، وهو مفيد أثناء التطوير. أما الحمل بحجم الإنتاج فيحتاج إلى أداة مخصصة مثل JMeter أو k6 أو Gatling تعمل على أجهزة منفصلة.

أيهما أفضل: JMeter أم k6؟

لدى JMeter واجهة رسومية ومسجّلات وأكبر منظومة؛ أما k6 فهو قائم على الكود وأخف ويتكامل طبيعياً مع CI. تفضّل الفرق المرتاحة مع JavaScript غالباً k6؛ وتحتفظ الفرق ذات خطط JMeter القائمة بـ JMeter.

الأدوات المذكورة في هذا الدليل

شغّل قياس أداء صغيراً وآمناً على نقطة نهاية عامة (بعدد طلبات وتزامن محدودَين) واحصل على الإنتاجية ومئينيات زمن الاستجابة.

الأداء فتح الأداة

قارن أزمنة الاستجابة والأحجام بين نقطتي نهاية (مثل v1 مقابل v2، أو staging مقابل الإنتاج) جنباً إلى جنب.

الأداء فتح الأداة

أدلة أخرى

أدلة أخرى →
JSON والبيانات

ما هو JSON؟

شرح JSON بلغة مبسّطة: ما هو، وأنواع القيم الست، وقواعد الصياغة التي يخطئ فيها الكثيرون، وكيفية تنسيقه والتحقق منه، ومقارنته بـ XML وYAML.

وقت القراءة 4 دقائق
اختبار واجهات API

ما هو اختبار API؟ وكيف تختبر REST API

شرح اختبار API: ما هو، وما الذي تفحصه في كل طلب واستجابة، وطريقة خطوة بخطوة لاختبار REST API، والأخطاء الشائعة، وأدوات مجانية من متصفحك.

وقت القراءة 5 دقائق
تصميم الاختبارات

كيف تكتب حالات الاختبار (Test Cases)

كيف تكتب حالات اختبار موثوقة: الحقول التي تحتاجها كل حالة، ونموذج جاهز للنسخ، ومثال تسجيل الدخول، وتقنيات التصميم التي تكتشف الأخطاء الحقيقية.

وقت القراءة 4 دقائق
الأمان

ما هو JWT؟ شرح رموز JSON Web Token

شرح مبسّط لـ JWT: الأجزاء الثلاثة للرمز، والمطالبات مثل exp وsub، وكيفية فك ترميزه والتحقق منه، ولماذا فك الترميز ليس تحققاً، وقواعد الأمان.

وقت القراءة 4 دقائق
الترميز

ما هو Base64؟ شرح الترميز

شرح Base64: ما هو وما ليس هو، وكيف يعمل الترميز، ولماذا يكبر الناتج بالثلث، والفرق بين Base64 وBase64URL، وحشو =، وكيفية الترميز وفك الترميز.

وقت القراءة 4 دقائق
أدوات مساعدة

ما هو UUID؟ الفرق بين v4 وv7 وبين UUID وGUID وULID

شرح UUID: صيغة الـ 128 بت، والفرق بين v4 وv7، ولماذا v7 أفضل لمفاتيح قواعد البيانات، ومقارنة UUID بـ GUID وULID، واحتمال التصادم، والتوليد والتحقق.

وقت القراءة 4 دقائق