TDD: كيف غيرت الاختبارات أولاً حياتي كمبرمج (وداعاً للأخطاء المفاجئة!)

استمع للبودكاست حوار شيق بين لمى وأبو عمر
0:00 / 0:00

TDD: قصة البداية المتعثرة والتحول المذهل

بتذكر أول مرة سمعت فيها عن TDD (Test-Driven Development) أو تطوير البرمجيات المدفوع بالاختبار. كنت وقتها في بداية مسيرتي كمبرمج، وكل همي أكتب الكود “ويشتغل”! الاختبارات كانت بالنسبة إلي مضيعة للوقت. كنت أقول لحالي: “ليش أكتب كود عشان أختبر كود تاني؟ ما أكتب الكود الأصلي وخلاص؟”.

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

ما هي منهجية TDD؟

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

دورة TDD: الأحمر، الأخضر، إعادة التنظيم

دورة TDD بتتكون من ثلاث مراحل رئيسية:

  • الأحمر (Red): اكتب اختبارًا يفشل. هذا الاختبار يصف جزءًا صغيرًا من الوظيفة التي تريد تنفيذها.
  • الأخضر (Green): اكتب أقل قدر ممكن من الكود لجعل الاختبار ينجح. لا تقلق بشأن الكمال في هذه المرحلة.
  • إعادة التنظيم (Refactor): حسّن الكود مع التأكد من أن جميع الاختبارات لا تزال ناجحة.

هاي الدورة بتتكرر باستمرار، وكل مرة بتضيف وظيفة جديدة للبرنامج.

مثال عملي: دالة بسيطة للجمع

خلينا نشوف مثال بسيط عشان نفهم كيف TDD بتشتغل. بدنا نكتب دالة بتجمع رقمين.

1. الاختبار (الأحمر)

أول شي، بنكتب الاختبار. في لغة Python، ممكن نستخدم مكتبة `unittest`:


import unittest

def add(x, y):
  pass # لسه ما كتبنا الكود!

class TestAdd(unittest.TestCase):
  def test_add_positive_numbers(self):
    self.assertEqual(add(2, 3), 5)

  def test_add_negative_numbers(self):
    self.assertEqual(add(-2, -3), -5)

  def test_add_positive_and_negative(self):
    self.assertEqual(add(2, -3), -1)

if __name__ == '__main__':
  unittest.main()

إذا شغلنا الاختبار هسة، رح يفشل (لأنه الدالة `add` ما بتعمل إشي).

2. الكود (الأخضر)

هسة بنكتب الكود اللي بخلي الاختبار ينجح:


def add(x, y):
  return x + y

إذا شغلنا الاختبار مرة تانية، رح ينجح!

3. إعادة التنظيم (Refactor)

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

فوائد TDD: ليش لازم تجربها؟

TDD مش بس بتساعدك تتجنب الأخطاء، بل إلها فوائد تانية كتير:

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

نصائح من تجربتي الشخصية

بعد سنين من استخدام TDD، هاي بعض النصائح اللي تعلمتها:

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

الخلاصة

TDD مش حل سحري لكل مشاكل البرمجة، بس هي أداة قوية جدًا بتساعدك تكتب كود أفضل وأكثر موثوقية. صحيح إنها بتحتاج شوية وقت وجهد في البداية، بس المكافآت تستحق العناء. جربها وشوف كيف ممكن تغير طريقة تفكيرك في كتابة الكود. 💪

نصيحة أخيرة: لا تستسلم إذا واجهت صعوبة في البداية. TDD بتحتاج ممارسة، ومع الوقت رح تصير جزء طبيعي من طريقة عملك. بالتوفيق! 👍

أبو عمر

سجل دخولك لعمل نقاش تفاعلي

كافة المحادثات خاصة ولا يتم عرضها على الموقع نهائياً

آراء من النقاشات

لا توجد آراء منشورة بعد. كن أول من يشارك رأيه!

آخر المدونات

برمجة وقواعد بيانات

تحديثات قاعدة البيانات بدون توقف: كيف أنقذنا نمط التوسيع والتعاقد (Expand/Contract) من جحيم التوقفات المجدولة؟

هل سئمت من إيقاف الخدمة مع كل تحديث لهيكلة قاعدة البيانات؟ أشارككم قصة حقيقية وكيف أنقذنا نمط التوسيع والتعاقد (Expand/Contract) من ليالي النشر الطويلة والمُجهدة،...

4 يونيو، 2026 قراءة المزيد
الشبكات والـ APIs

كانت إعادة المحاولة كارثة: كيف أنقذتنا مفاتيح عدم تكرار العمليات (Idempotency Keys) من جحيم الفواتير المزدوجة؟

أشارككم قصة حقيقية من الخنادق البرمجية، يوم كاد خطأ بسيط في إعادة محاولة طلبات الدفع أن يكلفنا سمعتنا وأموال عملائنا. اكتشفوا معنا كيف كانت مفاتيح...

4 يونيو، 2026 قراءة المزيد
الحوسبة السحابية

من التوقف التام إلى النجاة: كيف أنقذتنا استراتيجية “الضوء المرشد” (Pilot Light) يوم انقطعت السحابة؟

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

4 يونيو، 2026 قراءة المزيد
التوظيف وبناء الهوية التقنية

كانت مهمتي البرمجية للاختبار مجرد كود: كيف أنقذني توثيق القرارات من جحيم الصمت بعد المقابلة؟

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

4 يونيو، 2026 قراءة المزيد
التكنلوجيا المالية Fintech

من الانتظار لأيام إلى الدفع في ثوانٍ: كيف أنقذتنا شبكات الدفع الفوري من جحيم التحويلات البنكية؟

أسرد لكم من واقع تجربتي كـ "أبو عمر"، كيف عانينا من بطء وتكلفة التحويلات البنكية الدولية، وكيف جاءت شبكات الدفع الفوري ومعيار ISO 20022 لتكون...

4 يونيو، 2026 قراءة المزيد
البنية التحتية وإدارة السيرفرات

كان كل خادم لدينا ‘ندفة ثلج’ فريدة: كيف أنقذنا ‘الكود كبنية تحتية’ (IaC) من جحيم الانجراف اليدوي؟

في هذه المقالة، أشارككم قصة حقيقية من قلب المعركة التقنية مع "خوادم ندفات الثلج" الفوضوية. سنغوص في مفهوم "الكود كبنية تحتية" (IaC) وكيف أن أدوات...

4 يونيو، 2026 قراءة المزيد
اختبارات الاداء والجودة

كانت تغطية الاختبارات 100% لكن الأخطاء تتسرب: كيف أنقذنا “الاختبار الطفري” من جحيم الثقة الزائفة؟

كنا نظن أن تغطية الاختبار بنسبة 100% هي درعنا الواقي، لكن الأخطاء كانت تتسلل إلى الإنتاج كاللصوص في ليل بهيم. اكتشف كيف أنقذنا "الاختبار الطفري"...

4 يونيو، 2026 قراءة المزيد
البودكاست