أتمتة اختبار حِمل API بـ k6 و GitHub Actions — اكشف الـ regression قبل الـ deploy
لو الـ API بتاعك بيرد في 80ms على بيئة dev، وفجأة بعد الـ deploy بقى 600ms في production، إنت عرفت بالموضوع لمّا المستخدم اشتكى. الموضوع كان ممكن يتمسك في الـ PR لو في خطوة k6 جوه الـ workflow بتفشل تلقائيًا أول ما P95 يطلع فوق حد معيّن.
المشكلة باختصار
الـ unit tests بتقولك "الكود بيشتغل صح". مفيش حاجة فيها بتقولك "الكود بيشتغل بسرعة كافية تحت 500 طلب في الثانية". تراجع الأداء بيتسلّل في الـ commit بدون ما حد ياخد باله، وبيظهر في production لمّا يكون فات الأوان. الحل المباشر: حط حاجز k6 جوه الـ CI، يفشل الـ PR لو الأداء وقع تحت threshold محدد.
k6 بمثال للمبتدئين الأول
تخيل إنك صاحب مطعم وعندك طبّاخ واحد. لو دخل عليك زبون واحد، الأكل بيطلع في 5 دقايق وكله مبسوط. لو دخلوا 50 زبون مرة واحدة، إيه اللي بيحصل؟ الطبّاخ بيلخبط، الأطباق بتتأخر، وزبون أو اتنين بيمشوا غضبانين قبل ما الأكل يوصل. إنت لازم تعرف الرقم اللي عنده مطعمك بيقع — هل عند 20 زبون؟ ولا عند 100؟ — قبل ما يحصل في الواقع.
k6 هو "الزبون الوهمي" ده. أداة بتبعت آلاف الطلبات للـ API بتاعك في نفس الوقت، وتقولك بالظبط: "في 50 طلب/ثانية، الـ API بيرد في متوسط X ميلي ثانية، وأبطأ 5% من الطلبات (P95) بياخدوا Y ميلي ثانية".
التعريف العلمي: k6 هي أداة load testing مفتوحة المصدر مكتوبة بـ Go، بتُكتب اختباراتها بـ JavaScript (ES6)، وبتُنتج metrics دقيقة لزمن الاستجابة (latency)، معدل الإنتاجية (throughput)، ونسبة الفشل (error rate) تحت سيناريوهات حِمل متغيرة (constant, ramping, spike).
تعريفات سريعة قبل ما نكمل
- Latency: الزمن من ما الطلب يخرج لحد ما الرد يرجع. بتقاس بالميلي ثانية.
- P95: أبطأ 5% من الطلبات. لو P95 = 400ms، يبقى 95 طلب من كل 100 بيردوا في أقل من 400ms.
- Throughput: عدد الطلبات اللي السيرفر يقدر يخدمها في الثانية (RPS).
- Threshold: الحد الأقصى المقبول. لو الاختبار تخطّاه، k6 بيرجّع exit code 1 والـ pipeline بتفشل.
تركيب k6 محليًا في 60 ثانية
# على macOS
brew install k6
# على Ubuntu/Debian
sudo gpg -k
sudo gpg --no-default-keyring \
--keyring /usr/share/keyrings/k6-archive-keyring.gpg \
--keyserver hkp://keyserver.ubuntu.com:80 \
--recv-keys C5AD17C747E3415A3642D57D77C6C491D6AC1D69
echo "deb [signed-by=/usr/share/keyrings/k6-archive-keyring.gpg] https://dl.k6.io/deb stable main" \
| sudo tee /etc/apt/sources.list.d/k6.list
sudo apt-get update && sudo apt-get install k6
# تأكيد التركيب
k6 version