طرق اختبار API مرتّبة بحسب ما تنفرد باكتشافه

اختبار الدخان

  • يكتشف: أن عملية النشر معطّلة.

  • التكلفة: دقائق. شغّله دائمًا. لا شيء آخر يخبرك بهذا بالسرعة نفسها.

الاختبار الوظيفي

  • يكتشف: السلوك الخاطئ في نقطة نهاية واحدة، بما في ذلك المدخلات غير الصالحة.

  • التكلفة: متوسطة. وهو الأساس الذي تفترض وجودَه كل الطرق الأخرى.

الاختبار التكاملي

  • يكتشف: التسلسلات التي تفشل رغم نجاح كل خطوة فيها على حدة.

  • التكلفة: أعلى، بسبب الحالة. وهو الأعلى مردودًا في العثور على الأخطاء التي يراها المستخدم.

الاختبار الانحداري ليس طريقة منفصلة، بل وتيرة تشغيل: إعادة تشغيل ما لديك بالفعل مع كل تغيير. اختبار العقود يكتشف انحراف البنية بين الخدمات التي تُنشر بشكل مستقل. اختبار الحمل يكتشف حدود السعة. الاختبار العشوائي يكتشف الأعطال الناتجة عن المدخلات المشوَّهة. السلوك الأمني يكتشف أخطاء التفويض، وتكلفته أقل بكثير مما توحي به سمعته.

الطريقة التي يُخطئ الناس في تصنيفها

يُدرَج الاختبار الانحداري بوصفه طريقة، ثم يُجدوَل بوصفه نشاطًا، غالبًا قبل الإصدارات. وهنا يكمن الخطأ. الاختبار الانحداري هو ما تفعله اختباراتك القائمة حين تُشغَّل، وقيمتها تكاد تتوقف كليًا على معدّل تكرار ذلك التشغيل. مجموعة اختبارات انحدارية تُشغَّل شهريًا هي مجموعة تكتشف المشكلات متأخرةً شهرًا كاملًا.

كيف تختار دون أن تطبّقها جميعًا

  1. اختبار الدخان مع الاختبار الوظيفي على نقاط النهاية الحرجة. أرخص تغطية مفيدة موجودة.

  2. الاختبار التكاملي على الرحلات الحقيقية. حيث تكمن فعليًا الأخطاء التي يصطدم بها مستخدموك.

  3. فحوص التفويض. رخيصة، وهي الثغرة الأكثر استغلالًا في واجهات API الحقيقية.

  4. اختبار العقود، فقط إذا كانت الخدمات تُنشر بشكل مستقل.

  5. اختبار الحمل والاختبار العشوائي، حين تبرّرهما المخاطر. كلاهما حقيقي، وكلاهما استثمار أول في غير محله.

الصندوق الأسود مقابل الصندوق الأبيض

تمييز صارت أهميته في عمل API أقل مما كانت. الاختبار عبر الواجهة العامة هو الخيار الافتراضي الصحيح، لأنها ما تستخدمه تطبيقات العملاء لديك. أما معرفة الصندوق الأبيض فمفيدة في تحديد ما تختبره، لا في كيفية اختباره.

أين يضلّلك الهرم في حالة API

رُسم هرم الاختبارات لعالم من الوحدات وواجهات المستخدم، وتطبيقه حرفيًا على عمل API يؤدي إلى خطأ شائع.

يقول الهرم إن الاختبارات البطيئة في القمة ينبغي أن تكون قليلة. لكن الطبقة المكلفة في حالة API ليست بديهية: اختبار API أرخص بكثير من اختبار المتصفح، وأغلى بكثير من اختبار الوحدة، وهو يكتشف أشياء لا يكتشفها أيٌّ منهما. فالفرق التي تضع اختبارات API في قمة الهرم الضيقة ينتهي بها الأمر إلى عدد ضئيل جدًا منها، والفرق التي تضعها في القاعدة العريضة ينتهي بها الأمر إلى مجموعة بطيئة مليئة بتأكيدات تافهة.

النموذج الذهني الأفضل للخدمات هو أن تسأل: أي طبقة تستطيع أصلًا الإجابة عن سؤال بعينه؟ صحّة عملية حسابية مكانها اختبار الوحدة. وصحّة تطبيق نقطة النهاية لها مكانها اختبار API. أما وصول المستخدم إليها أصلًا فمكانه فوقهما معًا. عندئذٍ تنبثق النِّسب من منتجك لا من مخطط.

ما تحتاجه كل الطرق في أساسها

أربعة أمور تحدّد ما إذا كانت مجموعة اختبارات API ستصمد في عامها الأول: الجلسات التي تنتهي صلاحيتها، والقيم التي لا توجد إلا في وقت التشغيل، والاستدعاءات التي يعتمد بعضها على بعض، والسجلات التي لا ينظّفها أحد. تعالج TestSprite هذه الأمور عبر Auto-Authentication وDynamic Variables وDependency Chains وAuto-Cleanup، وهي موصوفة في توثيق اختبار API.

الطرفية

npm install -g @testsprite/testsprite-cli
testsprite setup

تغطي لوحة التحكم المجال نفسه لمن لا يريد تثبيتًا محليًا، أما مجموعة الأوامر الكاملة فتوجد في مستودع CLI.

مساران، والاختيار بينهما يتعلق في جوهره بمن يملك خط الإنتاج. فربط GitHub App من لوحة التحكم لا يتطلب أي تغيير في مستودعك إطلاقًا، لأنه يتفاعل مع عملية النشر التي يُصدرها بناؤك أصلًا. أما إضافة خطوة GitHub Actions فتضع الفحص داخل المستودع حيث يُراجَع كسائر مكوّنات البناء.

الطرق التي تغطيها TestSprite

الاختبار الوظيفي والتكاملي، إضافةً إلى الجانب السلوكي من الأمان، وإلى الاختبار الانحداري بوصفه وتيرة تشغيل لا نشاطًا. وتشمل الخطط المولَّدة فئات الوظائف والمخطط والتفويض ومعالجة الأخطاء والحالات الحدّية، وتُنقَّح بلغة عادية.

تُبقي Auto-Authentication الجلسات حيّة طوال التشغيل، وتنقل Dynamic Variables القيم بين الاستدعاءات، وتستنتج Dependency Chains ترتيب التنفيذ مما تحتاجه كل حالة وما تنتجه، وتحذف Auto-Cleanup ما أنشأه التشغيل بالضبط. هذا ما يجعل الاختبار الانحداري مستمرًا فعلًا بدل أن يكون أمرًا يُجدوَل قبل الإصدارات، وهو العامل الأكبر منفردًا في تحديد ما إذا كانت أي طريقة ستعود بقيمة.

ويبقى اختبار العقود واختبار الحمل والاختبار العشوائي أدوات منفصلة. والفائدة أن الطرق الثلاث الأعلى مردودًا تتوقف عن منافسة العمل على الميزات على وقت كتابة الاختبارات، فتصبح التغطية موجودة بدل أن تظل مخططة.

أي طريقة تعثر على أكبر عدد من الأخطاء؟

الاختبار التكاملي، في معظم المنتجات، لأن الأعطال التي يراها المستخدم تنشأ عادةً بين الاستدعاءات لا داخل استدعاء واحد.

هل يستحق اختبار الدخان مجموعة اختبارات منفصلة؟

نعم. فحص مدته دقيقتان يُشغَّل مع كل عملية نشر له وظيفة مختلفة عن مجموعة مدتها عشرون دقيقة، والخلط بينهما يعني ألا يُشغَّل أيٌّ منهما في وقته الصحيح.

هل نحتاج إلى الاختبار العشوائي؟

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

ماذا عن الاختبار الاستكشافي لواجهات API؟

قيّم فعلًا وغير قابل للأتمتة. مارسه حين تكون الواجهة جديدة أو حين تتغيّر تغيّرًا جوهريًا، ثم صُغْ ما وجدته في صورة اختبارات.

كيف تنطبق هذه الطرق على هرم الاختبارات؟

انطباقًا فضفاضًا. فالهرم رُسم لاختبارات الوحدة وUI. أما في حالة API فالمحور المفيد هو ما ينفرد كل فحص باكتشافه، لا الطبقة التي ينتمي إليها.

الخلاصة

اختر بناءً على ما تنفرد كل طريقة باكتشافه.

طرق اختبار API جديرة بأن تُرتَّب بحسب التكلفة مقابل المردود المنفرد، لا بأن تُحفظ. اختبار الدخان والاختبار الوظيفي أولًا، والاختبار التكاملي للأخطاء الحقيقية، وفحوص التفويض لأنها رخيصة، واختبار الحمل أخيرًا.