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 بتحتاج ممارسة، ومع الوقت رح تصير جزء طبيعي من طريقة عملك. بالتوفيق! 👍

أبو عمر

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

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

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

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

آخر المدونات

نصائح برمجية

كانت أرقامي السحرية طلاسم لا تُقرأ: كيف أنقذتنا ‘الثوابت المسماة’ من جحيم ‘ماذا يعني هذا الرقم؟’

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

25 مايو، 2026 قراءة المزيد
​معمارية البرمجيات

تحديث المونوليث كجراحة قلب مفتوح: كيف أنقذنا نمط الخانق (Strangler Fig) من جحيم “إياك أن تلمس هذا الكود”؟

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

25 مايو، 2026 قراءة المزيد
تسويق رقمي

ما وراء الكلمات المفتاحية: كيف حولنا بيانات Schema.org إلى أسلحة سرية في حرب نتائج البحث؟

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

25 مايو، 2026 قراءة المزيد
صورة المقال
تجربة المستخدم والابداع البصري

كانت شاشاتنا الفارغة مقبرة للتفاعل: كيف أنقذتنا ‘الحالات الفارغة الذكية’ من جحيم ‘وماذا الآن؟’

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

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

كانت استعلاماتنا تزحف: كيف أنقذتنا فهارس قواعد البيانات من جحيم البحث البطيء؟

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

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

من جحيم الـ Polling إلى نعيم الـ Webhooks: كيف أنقذت “خطافات الويب” تطبيقاتنا من السؤال المستمر “هل من جديد؟”

أروي لكم قصة من واقع تجربتي كمبرمج، كيف انتقلنا من طريقة الاستطلاع المستمر (Polling) المرهقة للخوادم، إلى الاعتماد على "خطافات الويب" (Webhooks) الذكية. مقالة عملية...

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