ما الذي يُتقنه اختبار API باستخدام Cypress فعلًا
التهيئة والتفكيك. إنشاء الحالة التي يحتاج إليها اختبار UI عبر API بدلًا من النقر عبر خمس شاشات. أسرع وأكثر موثوقية، وهو الاستخدام الصحيح لهذه الإمكانية.
عمليات التحقق العابرة للطبقات. نفّذ شيئًا في الواجهة، ثم تأكّد من أن الواجهة الخلفية سجّلته بشكل صحيح. هذه فئة حقيقية ويتعامل معها Cypress بأناقة.
حفنة من عمليات التحقق من نقاط النهاية. حين يكون سطح API صغيرًا، يظل إبقاؤه في المجموعة نفسها مقايضة معقولة في مقابل البساطة.
المشكلات الأربع التي تأتي مع التوسّع
عمر الجلسة
تنتهي صلاحية الرموز في منتصف المجموعة، فتبدو الإخفاقات كأنها عيوب في المنتج.
وينتهي الأمر بكتابة منطق التجديد يدويًا في ملف دعم.
القيم بين الاستدعاءات
يجب أن يصل معرّف ناتج عن استدعاء إنشاء إلى استدعاء الحذف، وتسلسل الأوامر في Cypress يجعل ذلك صعبًا عبر الاختبارات.
فيلجأ الناس إلى تثبيت القيم صراحةً، فتنجح المجموعة مرة واحدة.
الترتيب
تغطية API الحقيقية رسم بياني، بينما ملفات الاختبار قائمة. وترميز هذا الرسم يدويًا هو المكان الذي تذهب إليه أعمال الصيانة.
والمشكلة الرابعة هي التنظيف. تتراكم السجلات، وتبدأ قيود التفرّد بالانطلاق، وتنحرف عمليات التحقق الخاصة بالتقسيم إلى صفحات مع نمو البيانات.
لماذا ليست هذه في حقيقتها مشكلات Cypress
صُمِّم Cypress حول دورة حياة اختبار يقودها المتصفح. وكل ما سبق يتعلق بحالة تعيش خارج الاختبار الواحد وخارج التشغيل الواحد. يمكنك حل ذلك كله في ملفات الدعم، فيتحول الحل إلى إطار عمل صغير يتعين على أحدهم صيانته، وهي التكلفة التي لا يخطط لها أحد.
ما الذي تتكفل به طبقة API مبنية لهذا الغرض بدلًا من ذلك
أربعة أمور تحدد ما إذا كانت مجموعة اختبارات API ستصمد سنتها الأولى، أيًا كانت الأداة التي تستخدمها: جلسات تنتهي صلاحيتها، وقيم لا توجد إلا في وقت التشغيل، واستدعاءات يعتمد بعضها على بعض، وسجلات لا ينظفها أحد. تسمّي TestSprite هذه الأمور Auto-Authentication وDynamic Variables وDependency Chains وAuto-Cleanup، كما أنّ وثائق اختبار API تشرح آليات العمل.
حين يتحول ملف الدعم إلى إطار عمل
ثمة نقطة يمكن تمييزها تتوقف عندها مجموعة اختبارات API داخل Cypress عن كونها بضعة طلبات وتصبح بنية تحتية، ويستحق الأمر تسميتها كي تقرر عن عمد بدلًا من أن تنجرف.
يبدأ الأمر بأمر تسجيل دخول في ملف الدعم. ثم ذاكرة مؤقتة للرمز، لأن تسجيل الدخول في كل اختبار بطيء. ثم منطق تجديد، لأن الذاكرة المؤقتة تتقادم في منتصف التشغيل. ثم دالة مساعدة تخزّن المعرّفات المُنشأة كي تجدها الاختبارات اللاحقة، ثم أعراف للترتيب في أسماء الملفات، ثم مهمة تنظيف تعمل بعد المجموعة وتعرف كل ذلك.
لا خطأ في أي من هذه الخطوات، وكل واحدة منها هي الخطوة التالية البديهية. والنتيجة بضع مئات من الأسطر من إطار عمل يقيم في دليل الدعم، يفهمه شخص واحد، وخارج المشغّل الذي بُني عليه. وإدراك هذا المسار مبكرًا هو كل قيمة وصفه.
التقسيم الذي يستحق التبنّي
أبقِ على cy.request للتهيئة والتفكيك وعمليات التحقق العابرة للطبقات التي تحتاج فعلًا إلى الجانبين في اختبار واحد. وانقل تغطية نقاط النهاية والتكامل المستقلة إلى طبقة تتعامل مع هذه المشكلات الأربع بوصفها جزءًا من عملها لا واجبًا عليك.
لا تحتاج المجموعتان إلى معرفة إحداهما بالأخرى، ويمكن تشغيلهما من خط الأنابيب نفسه.
المُحفِّز أهم من الآلية. فتوجيهه إلى حدث النشر لديك يعني فحص كل تغيير دون أن يقرر ذلك أحد؛ إذ يفعل GitHub App ذلك من لوحة التحكم، بينما خطوة GitHub Actions تفعله من داخل سير عملك. التفاصيل في مستودع CLI.
ما الذي تتوقف عن صيانته
إطار عمل ملف الدعم الموصوف أعلاه هو ما تحل TestSprite محله. يتكفل Auto-Authentication بعمر الجلسة. وتنقل Dynamic Variables معرّفًا من استدعاء الإنشاء إلى استدعاء الحذف. وتشتق Dependency Chains ترتيبًا آمنًا مما تحتاجه كل حالة وما تنتجه. ويزيل Auto-Cleanup ما أنشأه التشغيل بالضبط، وهو ما يجعل التنفيذ المتوازي آمنًا.
كما تتوقف التغطية عن الاعتماد على من لديه وقت. تُولَّد الخطط من مواصفة أو من جولة اكتشاف على الخدمة العاملة، بما في ذلك مسارات الخطأ والقيم الحدّية التي لا تُكتب يدويًا أبدًا، ثم تُنقَّح بلغة بسيطة.
ويحتفظ Cypress بما يُتقنه: التهيئة والتفكيك وعمليات التحقق العابرة للطبقات حيث تحتاج فعلًا إلى المتصفح وAPI في اختبار واحد. وتعمل المجموعتان من خط الأنابيب نفسه دون أن تعرف إحداهما بالأخرى.
هل استخدام cy.request ممارسة سيئة؟
على الإطلاق لا. إنه الأداة الصحيحة للتهيئة ولعمليات التحقق العابرة للطبقات. الحد هو التوسّع، لا الصحة.
هل يمكننا إبقاء كل شيء داخل Cypress؟
يمكنك ذلك، وستنتهي إلى صيانة إدارة الجلسات والتقاط القيم والترتيب والتنظيف بنفسك. يستحق الأمر مع سطح صغير، ويصبح مكلفًا بعد ذلك.
ماذا عن اختبار المكوّنات في Cypress؟
لا يتأثر بشيء من هذا. تجيب اختبارات المكوّنات عن سؤال مختلف، والأفضل إبقاؤها حيث هي.
كيف نتجنب ازدواج التغطية؟
قسّم حسب السؤال. يجيب Cypress عمّا إذا كان التدفق الظاهر للمستخدم يعمل. وتجيب طبقة API عمّا إذا كانت نقاط النهاية تتصرف كما ينبغي. وإذا كان اختبار ما سينجح في الموضعين، فهو ينتمي إلى الأرخص منهما.
هل تحتاج طبقة API إلى شيفرتنا المصدرية؟
لا. تعمل مقابل الخدمة العاملة، مستعينة بمواصفة أو بجولة اكتشاف لمعرفة ما هو موجود.
أبقِ cy.request للتهيئة، لا لمجموعة اختبارات API بأكملها.
اختبار API باستخدام Cypress ممتاز للبيانات الأولية ولعمليات التحقق العابرة للطبقات. وحالما تنمو تغطية API المستقلة، تتحول الجلسات والقيم الملتقطة والترتيب والتنظيف إلى إطار عمل تصونه يدويًا، وتلك هي اللحظة المناسبة لنقل تلك الطبقة إلى مكان مبني لها.