ConstructiCat Logo
CodeBust.
Browse section ▾

Test Smells.

Recurring problems in test code — how to recognize each one, why it hurts, how to fix it, and the lint rules that detect it.

Refactoring Mascot
روليت التحقق

يجمع اختبار واحد العديد من التحققات (assertions) غير الموثقة في طريقة واحدة، بحيث عندما يفشل لا يمكنك تحديد أي من التحققات قد فشل أو لماذا - مما يضطرك للمقامرة لمعرفة ذلك.

001
Antipatterns Mascot
الاختبار المتلهف

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

002
Design Patterns Mascot
التأكيد الزائد

التأكيد الزائد هو تأكيد يقارن قيمة بنفسها أو بقيمة حرفية مساوية لها بالبناء، فتكون نتيجته محددة مسبقاً ولا يمكنه أن يفشل أو يكتشف انحداراً.

003
Architectural Patterns Mascot
الاختبار المجهول

طريقة اختبار تقوم بتشغيل الكود ولكنها لا تحتوي على أي تحقق (assertion)، وبالتالي تنجح طالما لم يتم إلقاء أي استثناء — مما يترك الغرض الفعلي منها وما تتحقق منه مجهولاً.

004
Design Patterns Mascot
التحقق المكرر

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

005
Architectural Patterns Mascot
المساواة الحساسة

يقوم الاختبار بالتحقق من السلوك من خلال مقارنة التمثيل النصي للكائن (toString()، أو JSON.stringify()، أو HTML المصيّر) بسلسلة نصية حرفية متوقعة، مما يربط الاختبار بتنسيقات عرضية بدلاً من القيم المهمة بالفعل.

006
Antipatterns Mascot
الاختبار الغامض

الاختبار الغامض هو اختبار لا يمكن للقارئ أن يحدد من خلال طريقة الاختبار بمفردها ما هو السيناريو المجهز، وما هو السلوك الذي تم تشغيله، وما هي النتيجة المتوقعة — لأن الغرض مدفون في الكثير من التفاصيل، أو قلة السياق، أو منطق مخفي في مكان آخر.

011
Refactoring Mascot
منطق الاختبار الشرطي

اختبار يستخدم `if`/`switch`/ternaries أو الحلقات أو `try`/`catch` لتحديد ما سيتم تشغيله أو التحقق منه، بحيث يعتمد سلوكه — وما إذا كان يتحقق من أي شيء على الإطلاق — على الفرع الذي يتم تنفيذه في وقت التشغيل.

012
Antipatterns Mascot
تكرار كود الاختبار

يحدث تكرار كود الاختبار عندما يتم نسخ ولصق نفس كود الإعداد (setup) أو الإجراء (action) أو التحقق (assertion) عبر اختبارات متعددة، مما يعني أن تغييراً واحداً يفرض تعديلات في أماكن عديدة وتتحول الاختبارات إلى نسخ هشة متطابقة تقريباً.

013
Antipatterns Mascot
اختبار الأرقام السحرية

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

014
Architectural Patterns Mascot
الاختبار المسهب

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

015
Refactoring Mascot
الاختبار غير المستقر (المتقلب)

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

016
Architectural Patterns Mascot
الاختبار النائم

يقوم الاختبار النائم بإيقاف التنفيذ مؤقتاً باستخدام تأخير ثابت مشفر (`Thread.sleep`، أو `setTimeout`، أو `cy.wait(2000)`، أو `page.waitForTimeout`) لانتظار انتهاء العمل غير المتزامن بدلاً من انتظار الشرط الفعلي نفسه.

017
Code Smells Mascot
حرب تشغيل الاختبارات

تحدث حرب تشغيل الاختبارات (Test Run War) عندما تنجح الاختبارات لشخص واحد ولكنها تفشل عشوائياً بمجرد قيام عدة أشخاص أو مهام تكامل مستمر (CI) بتشغيل مجموعة الاختبارات في نفس الوقت، وذلك بسبب تصادم الاختبارات على هيكل اختبار مشترك ومستمر.

018
Antipatterns Mascot
الاعتماد على ترتيب الاختبارات

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

019