"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > متى يكون TDD منطقيًا؟

متى يكون TDD منطقيًا؟

تم النشر بتاريخ 2024-11-01
تصفح:679

When does TDD make sense?

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

عندما يقصر TDD

على الرغم من أن TDD تعد منهجية قوية، إلا أنها ليست دائمًا الأداة المناسبة للمهمة. فيما يلي بعض السيناريوهات التي قد يكون فيها تطبيق TDD أكثر إشكالية من المفيد:

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

  • منطق المجال المنخفض : في الحالات التي تكون فيها قاعدة التعليمات البرمجية مهتمة في الغالب بمعالجة عمليات الإدخال / الإخراج (I / O) أو المهام البسيطة، هناك قيمة قليلة في كتابة الاختبارات أولاً. على سبيل المثال، يعد إنشاء برنامج "Hello World" حالة واضحة حيث يكون TDD مبالغًا فيه. الكود بسيط للغاية، ومستقر للغاية، ولا يحتوي على أي منطق يمكن اختباره. إذا كانت التعليمات البرمجية تتفاعل بشكل كبير مع أنظمة خارجية مثل قواعد البيانات أو أنظمة الملفات أو واجهات برمجة التطبيقات، فقد تكون اختبارات وحدة الكتابة مقدمًا غير مريحة وأقل فعالية. النسبة العالية لرمز الحدود (على سبيل المثال، الإدخال/الإخراج) مقابل منطق المجال الفعلي تعني أن عائد الاستثمار لـ TDD منخفض.

متى يتم استخدام TDD

الآن دعونا نلقي نظرة على الوقت الذي يتألق فيه TDD. من تجربتي الأخيرة، وجدت أن TDD يعمل بشكل أفضل في السيناريوهات حيث:

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

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

لماذا تستخدم TDD

  • التركيز على السلوك : ساعدتني اختبارات الكتابة في البداية على التركيز على السلوك، وليس التنفيذ. يعد هذا تمييزًا أساسيًا، لأنه يمنع الاختبارات من الاقتران بشكل وثيق جدًا بالأعمال الداخلية للكود. وبدلاً من ذلك، تعكس الاختبارات ما يجب أن تفعله التعليمات البرمجية، مما يجعل إعادة الهيكلة أسهل دون كسر الاختبارات دون داعٍ.

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

مثال عملي: إنشاء DSL للتحقق من صحة سطح السفينة المخصص باستخدام TDD

في أحد مشاريعي الأخيرة، قمت بتطبيق TDD لبناء لغة خاصة بالمجال (DSL) للتحقق من صحة مجموعة Hearthstone . كان الهدف هو إنشاء نظام يسمح للمستخدمين بتحديد قواعد بناء سطح السفينة المعقدة بتنسيق يمكن قراءته بواسطة الإنسان. أولاً، قمت بتصميم الشكل الذي ستبدو عليه اللغة، وما هي السيناريوهات التي يجب أن تغطيها. هذا الوضوح في المتطلبات، إلى جانب المنطق المعقد للنظام، جعل منه حالة استخدام مثالية لـ TDD.

يحتوي المشروع على مكونين أساسيين استفادا بشكل كبير من نهج TDD:

  • RuleValidator: هذا المكون مسؤول عن التحقق من صحة إدخال المستخدم للتأكد من أنه يتبع بناء جملة DSL ودلالاته. فهو يقوم بترميز الإدخال، والتحقق من الأخطاء في البنية، وإرجاع قائمة بأخطاء التحقق من الصحة مع رسائل واضحة للمستخدم. إذا كانت القائمة فارغة، فهذا يعني أن الإدخال صالح. يضمن نهج TDD أن جميع سيناريوهات التحقق المحتملة، بما في ذلك حالات الحافة، تم اختبارها أثناء التنفيذ.

    • الاختبارات
    • تطبيق
  • RuleGenerator: بمجرد التحقق من صحة الإدخال، يقوم RuleGenerator بتحويله إلى كود TypeScript الذي يحدد قواعد بناء المجموعة. يقوم أولاً باستدعاء RuleValidator للتأكد من صحة الإدخال. للحصول على إدخال صالح، يقوم بإنشاء دالة تمثل القاعدة، بناءً على السمات وعوامل التشغيل والمعدلات والقيم. يتم بعد ذلك استخدام هذا الرمز الذي تم إنشاؤه بواسطة DeckValidator للتحقق مما إذا كانت البطاقات الموجودة في المجموعة تتبع القواعد المحددة.

    • الاختبارات
    • تطبيق

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

أصبحت فوائد TDD أكثر وضوحًا عندما قمت بإعادة بناء الكود. على سبيل المثال، قمت بتقسيم الوظائف الأكبر إلى وظائف أصغر يمكن إعادة استخدامها، مما أدى إلى تحسين التصميم العام. بالإضافة إلى ذلك، عندما قررت إضافة معدّلات جديدة (> و

خاتمة

TDD هي منهجية قيمة عند استخدامها في السياق الصحيح. إنه يتفوق عندما يكون لديك متطلبات واضحة، ومستوى عالٍ من منطق المجال، وتحتاج إلى طريقة موثوقة لمنع التراجعات بمرور الوقت. ومع ذلك، يمكن أن يبطئك في المراحل الاستكشافية أو في التعليمات البرمجية التافهة ذات الحدود الثقيلة. إن معرفة متى يتم تطبيق TDD ومتى يتم تأجيله هو المفتاح لتحقيق أقصى استفادة منه.

بيان الافراج يتم استنساخ هذه المقالة على: https://dev.to/mateScechetto/when-does-tdd-make-sense-5h16؟1 إذا كان هناك أي انتهاك ، فيرجى الاتصال بـ [email protected] لحذفه.
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3