هرم أتمتة الاختبار

هرم أتمتة الاختبار (Test Automation Pyramid) نموذج يصف الشكل المناسب لحزمة الاختبارات الآلية. تُجمَع الاختبارات في طبقات بحسب حجمها: اختبارات كثيرة صغيرة وسريعة ومعزولة في القاعدة، واختبارات أقل لأجزاء تعمل معاً في الوسط، وعدد قليل فقط من الاختبارات الشاملة من البداية إلى النهاية (End-to-End) في القمة. قدّمه مايك كون (Mike Cohn) بثلاث طبقات: اختبارات الوحدة (Unit) والخدمة (Service) وواجهة المستخدم (UI)، ويستخدمه منهج ISTQB للمستوى التأسيسي ⁦v4.0⁩ ليبيّن أن أهداف الاختبار المختلفة تخدمها مستويات مختلفة من الأتمتة.

قرّر درس «ما الذي تؤتمته وما الذي لا تؤتمته» هل يستحق الفحص الأتمتة؛ أما الهرم فيقرر على أي مستوى. ففي رمز ترويجي (Promo Code) يعني ذلك نحو اثني عشر اختبار وحدة لقواعد الخصم والتواريخ، وبضعة اختبارات API لخدمة السلة وقاعدة بياناتها، واختباراً واحداً من البداية إلى النهاية في المتصفح يطبّق الرمز ويدفع.

لماذا يهم

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

وبالنسبة إلى المختبِر، فالهرم هو اللغة التي يُعبَّر بها عن قرارات تتكرر في كل سبرنت: أي الفحوص تُؤتمت عبر الواجهة البرمجية بدلاً من واجهة المستخدم، وما الذي يُطلب من المطورين تغطيته باختبارات الوحدة، ولماذا تُعدّ حزمة اختبارات واجهة تتضخم بسرعة خطراً يُبلَّغ عنه لا إنجازاً يُحتفى به.

الطبقات وما يتغيّر بينها

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

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

عند طبقة «اختبارات من البداية إلى النهاية / الواجهة»: اختبارات أقل: أقرب إلى الواقع وأبطأ وأوسععند طبقة «اختبارات الوحدة / المكوّنات»: اختبارات أكثر: أسرع ومعزولة ودقيقة

  1. 1اختبارات من البداية إلى النهاية / الواجهةقليلة · ⁦1⁩ في المثالرحلة مستخدم كاملة عبر الواجهة الحقيقية وكل خدمة خلفها

    ثوانٍ أو دقائق لكل اختبار؛ وقد يأتي الفشل من أي جزء

  2. 2اختبارات التكامل / APIأقل · ⁦5⁩ في المثالمكوّنات أو خدمات معاً عبر واجهة حقيقية: واجهة HTTP برمجية، أو قاعدة بيانات، أو طابور رسائل

    ثوانٍ لكل اختبار؛ تكشف عيوب الواجهات التي لا تراها اختبارات الوحدة

  3. 3اختبارات الوحدة / المكوّناتكثيرة · ⁦12⁩ في المثالدالة أو صنف أو مكوّن واجهة واحد، مع بدائل اختبار لاعتمادياته

    أجزاء من الثانية لكل اختبار؛ والفشل يسمّي الوحدة المعطوبة

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

القاعدة: اختبر في أدنى مستوى يستطيع كشف العيب

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

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

وكثيراً ما يمكن اختبار مكوّن في الواجهة الأمامية مقابل استجابة API محاكاة (Mock) بدلاً من الخادم الحقيقي، فينتقل الفحص من قمة الهرم إلى قاعدته.

جرّبها: مولّد استجابات API وهمية

مثال تطبيقي: توزيع فحوص رمز ترويجي

المتطلب: «الرمز SAVE10 يمنح خصماً ⁦10%⁩ على الطلبات بقيمة ⁦200.00⁩ ريال فأكثر، بحدّ أقصى ⁦50.00⁩ ريالاً، من ⁦1⁩ إلى ⁦31⁩ مارس 2027 بتوقيت الرياض، ومرة واحدة لكل عميل». هذا هو رمز SAVE10 من درس اختبار المكوّنات مع قاعدة العمل كاملة. يعطيك تحليل القيم الحدّية القيم، ويقرر الهرم أين يعمل كل فحص.

تذهب الفحوص الاثنا عشر للمبالغ والتواريخ والاستخدام السابق إلى اختبارات الوحدة، فهي قواعد صرفة، ومعظم فحوصها قيم حدّية. وتضيف طبقة API ما لا تستطيع الدالة وحدها إظهاره: البحث عن الرمز في قاعدة البيانات الحقيقية، وتسجيل الاستخدام الأول كي يُرفض الثاني، وحفظ الخصم على الطلب. أما الاختبار الوحيد من البداية إلى النهاية فلا يعيد فحص أي حدّ، بل يثبت أن الحقل والسلة والدفع والتأكيد موصولة ببعضها من منظور العميل. ولو كُتبت هذه الفحوص ثمانية عشر اختبار متصفح، لسجّل كل منها الدخول وملأ السلة، ولقالت رسالة الفشل «العنصر غير موجود» بدلاً من «⁦500.10⁩ أعطى ⁦50.01⁩».

Rule: SAVE10 = 10% off orders from 200.00 SAR, at most 50.00 SAR off,
      valid 1 to 31 March 2027 (Riyadh time), once per customer

UNIT: discount and validity functions, test doubles for the rest     12 tests
  199.99 -> 0.00      200.00 -> 20.00     333.33 -> 33.33
  499.90 -> 49.99     500.00 -> 50.00     500.10 -> 50.00 (cap)
  28 Feb 23:59:59 -> invalid            1 Mar 00:00:00 -> valid
  31 Mar 23:59:59 -> valid              1 Apr 00:00:00 -> invalid
  first use -> valid                    earlier use by this customer -> invalid

API / INTEGRATION: cart service with its real database                5 tests
  apply SAVE10 to a 250.00 cart     -> accepted, discount 25.00
  apply an expired code             -> rejected, PROMO_EXPIRED
  apply an unknown code             -> rejected, PROMO_UNKNOWN
  same customer applies it again    -> rejected, PROMO_ALREADY_USED
  place the order                   -> discount 25.00 saved on the order

END-TO-END: browser, all services, test payment                       1 test
  log in, add 250.00 SAR of items, apply SAVE10, see -25.00,
  pay with a test card, confirmation shows 225.00

جرّبها: مولّد مجموعات الأرقام الحدّية جرّبها: مولّد حالات اختبار من OpenAPI

النمط المضاد: مخروط الآيس كريم

مخروط الآيس كريم (Ice-Cream Cone) هو الهرم مقلوباً: رأس ضيق من اختبارات الوحدة، وقليل من اختبارات التكامل، وشريحة عريضة من اختبارات الواجهة الآلية، وفي الأعلى كرة كبيرة من اختبار الانحدار اليدوي. نشر أليستر سكوت (Alister Scott) هذا الاسم، ويحذّر مقال «The Practical Test Pyramid» من أن حزمة كهذه صعبة الصيانة وتستغرق وقتاً أطول بكثير مما ينبغي.

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

أعراض تراها في خط أنابيب الفريق:

  • تشغيل الانحدار يستغرق ساعات، فيعمل ليلاً بدلاً من أن يعمل مع كل تغيير.
  • معظم حالات الفشل انتهاء مهلة أو عنصر مفقود، ويعيد الناس تشغيل الحزمة بدلاً من التحقيق في السبب.
  • تغيير واحد في صفحة يكسر عشرات الاختبارات دفعة واحدة.
  • ما زال الانحدار اليدوي قبل كل إصدار يستغرق أياماً، لأن أحداً لا يثق بالأتمتة.

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

شكل آخر: كأس الاختبار

الهرم ليس النموذج الوحيد. فقد اقترح كِنت سي. دودز (Kent C. Dodds) كأس الاختبار (Testing Trophy) لتطبيقات الويب المكتوبة بلغة JavaScript: في القاعدة التحليل الساكن (Static Analysis)، أي فحص الأنواع والتدقيق الآلي للشيفرة (Linting)، ثم اختبارات الوحدة، ثم اختبارات التكامل بوصفها أكبر طبقة، ثم قمة صغيرة من الاختبارات من البداية إلى النهاية. وحجته أن الاختبار كلما أشبه طريقة استخدام البرمجية منح ثقة أكبر، وأن اختبارات التكامل تحقق أفضل توازن بين هذه الثقة وكلفة تشغيل الاختبارات وصيانتها.

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

الهرم ومخروط الآيس كريم وكأس الاختبار جنباً إلى جنب: أي طبقة تضم معظم الاختبارات، وما حجم طبقة البداية إلى النهاية، وكيف تعمل معظم الفحوص.

هرم الاختبارالنموذج

اختبارات وحدة كثيرة، واختبارات تكامل أقل، واختبارات قليلة من البداية إلى النهاية

أكبر طبقة:
اختبارات الوحدة
طبقة البداية إلى النهاية:
صغيرة
معظم الفحوص تعمل بوصفها:
اختبارات وحدة معزولة، في أجزاء من الثانية
صاحب التسمية:
Mike Cohn

مخروط الآيس كريمنمط مضاد

اختبارات وحدة قليلة، واختبارات واجهة كثيرة، وكرة كبيرة من الانحدار اليدوي في الأعلى

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

كأس الاختبارصيغة بديلة

التحليل الساكن في القاعدة، ومعظم الاختبارات تكامل، واختبارات قليلة من البداية إلى النهاية

أكبر طبقة:
اختبارات التكامل
طبقة البداية إلى النهاية:
صغيرة
معظم الفحوص تعمل بوصفها:
مكوّنات تُختبر معاً، غالباً مقابل واجهة API محاكاة
صاحب التسمية:
كِنت سي. دودز، لتطبيقات الويب بلغة JavaScript

أخطاء شائعة

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

من منظور ضمان الجودة

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

وراقب شكل الحزمة مع الوقت. ومن الإشارات المفيدة: الزمن من الإيداع (Commit) حتى ظهور النتيجة، وعدد حالات الفشل التي سببها البيئة أو التوقيت لا العيوب، والعيوب المتسرّبة إلى الإنتاج التي كان اختبار أدنى سيكشفها. اعرض هذه الإشارات في الاجتماع الاستعادي (Retrospective)، وحين تقترح اختبار واجهة جديداً كن مستعداً لتقول ما الذي يكشفه ولا يستطيع أي اختبار أدنى كشفه.

تمرين عملي

أعِد تشكيل حزمة دفع تحوّلت إلى مخروط آيس كريم

المطلوب

في حزمة الانحدار الخاصة بصفحة الدفع لدى أحد الفرق اختبارا وحدة، وثلاثة اختبارات API، واختبارات المتصفح العشرة أدناه؛ واختبارات المتصفح وحدها تستغرق نحو ⁦40⁩ دقيقة في كل تشغيل وكثيراً ما تفشل بسبب انتهاء المهلة. القواعد: التوصيل مجاني إذا كان إجمالي المنتجات قبل ضريبة القيمة المضافة ⁦150.00⁩ ريال فأكثر، وإلا فرسومه ⁦15.00⁩ ريالاً؛ وتُحسب ضريبة القيمة المضافة بنسبة ⁦15%⁩ على المنتجات والتوصيل؛ ولا يُعرض الدفع عند الاستلام إلا لإجمالي طلب لا يتجاوز ⁦1,000.00⁩ ريال.

أعِد تشكيل الحزمة على هيئة هرم: ضع كل فحص في أدنى طبقة تستطيع كشف عيبه، وقرر أي رحلات من البداية إلى النهاية تبقى، واكتب ما تحتاج إلى سؤال المطورين عنه.

المادة
checkout.spec (browser): each test logs in, fills a cart, opens checkout

B1   item total 149.99            -> delivery fee 15.00
B2   item total 150.00            -> free delivery
B3   item total 150.01            -> free delivery
B4   items 100.00 + delivery 15.00 -> VAT 17.25
B5   items 200.00, free delivery  -> VAT 30.00
B6   order total 1,000.00         -> cash on delivery offered
B7   order total 1,000.01         -> cash on delivery not offered
B8   pay by test card             -> order confirmed
B9   choose cash on delivery      -> order confirmed, "awaiting payment"
B10  delivery service unavailable -> error message on the checkout page
الخطوات
  1. اكتب لكل اختبار متصفح العيبَ الذي يُقصد أن يكشفه.
  2. اختر أدنى طبقة تستطيع رؤية ذلك العيب: الوحدة، أو API والتكامل، أو من البداية إلى النهاية.
  3. أبقِ اختبارات البداية إلى النهاية للرحلات التي يمكن أن تنكسر بين المتصفح والخادم فقط، ودع الرحلة الواحدة تغطي عدة تأكيدات.
  4. اكتب الأسئلة الموجهة إلى المطورين ومالك المنتج.
إظهار الإجابة النموذجية
الإجابة النموذجية

الوحدة: الاختبارات من B1 إلى B7 قواعد على أرقام، والعيوب التي تستهدفها: حدّ خاطئ للتوصيل المجاني (B1 إلى B3)، وضريبة محسوبة خطأً أو غير مفروضة على التوصيل (B4 وB5)، وحدّ خاطئ للدفع عند الاستلام (B6 وB7). انقلها إلى اختبارات وحدة لدوال رسوم التوصيل والضريبة وخيارات الدفع، حيث تصبح إضافة حدود أخرى رخيصة، مثل ⁦0.01⁩، وإجمالي تحتاج ضريبته إلى تقريب لتثبيت قاعدة التقريب.

API والتكامل: اختبار واحد يتحقق من أن واجهة الدفع البرمجية تعيد الرسوم والضريبة وخيارات الدفع لسلة معينة، ليثبت أنها تستخدم تلك الدوال (تكفي قيمة واحدة لكل منها)، واختبار للحالة B10 تُستبدل فيه خدمة التوصيل ببديل (Stub) يعيد خطأ، للتحقق من أن الدفع يجيب بخطأ محدد بدلاً من أن ينهار. أما الرسالة على الصفحة فيغطيها اختبار مكوّن لصفحة الدفع مع استجابة خطأ محاكاة (Mock).

من البداية إلى النهاية: أبقِ B8 وB9، أي رحلتي البطاقة والدفع عند الاستلام، لأن كلاً منهما يعبر المتصفح وخدمات إتمام الشراء والمدفوعات والطلبات. واجعل كلاً منهما يتحقق أيضاً من الإجمالي في صفحة التأكيد، فتُفحص النتيجة التي يراها المستخدم من الحساب مرة واحدة.

النتيجة: نحو عشرة اختبارات وحدة ومكوّنات (الفحوص السبعة المنقولة، والحدّان الجديدان، واختبار المكوّن لرسالة الخطأ)، واختبارا API، واختبارا رحلة من البداية إلى النهاية بدلاً من عشرة اختبارات متصفح. الأسئلة: هل تغطي اختبارات الوحدة الحالية أياً من هذه القواعد؟ هل تُحسب الرسوم والضريبة في الخادم أم في المتصفح (فإن كانت في المتصفح لزم اختبار وحدة أو مكوّن للواجهة الأمامية أيضاً)؟ هل حدّ ⁦1,000.00⁩ ريال قبل الضريبة أم بعدها؟ هل تستطيع بيئة الاختبار محاكاة تعطّل خدمة التوصيل؟

أسئلة شائعة

هل توجد نسبة صحيحة بين اختبارات الوحدة والتكامل ومن البداية إلى النهاية؟

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

هل كتابة اختبارات الوحدة من عمل المختبِر؟

يكتبها المطورون عادةً مع الشيفرة، كما في درس اختبار المكوّنات. ويراجع المختبِر ما تغطيه، ويقترح حالات حدّية وسلبية، ويتجنب تكرارها في الطبقات الأعلى. وفي بعض الفرق يكتبها المختبِرون أيضاً.

أين يقع الاختبار اليدوي والاستكشافي من الهرم؟

خارج الهرم الآلي. وبعض الصيغ المعروفة ترسم الاختبار اليدوي أو الاستكشافي سحابةً فوق الهرم: فالأتمتة تفحص ما توقعتَه، والاستكشاف يجد ما لم تتوقعه. وما يقلّصه الهرم هو التكرار اليدوي لفحوص الانحدار المكتوبة.

الهرم أم الكأس: أيهما يعتمد فريقي؟

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

المراجع

تدرّب بأدوات متقن

ولّد استجابات API وهمية كاملة (الحالة والترويسات وجسم JSON) لحالات النجاح والقوائم والتفاصيل والأخطاء والنتائج الفارغة.

المحاكاة

للتعمّق أكثر

تقدّمك في هذا الموضوع

جزء من مسار تعلم ضمان الجودة