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

أبو عمر

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

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

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

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

آخر المدونات

الحوسبة السحابية

كانت خوادمنا خاملة 90% من الوقت: كيف أنقذتنا ‘الحوسبة بدون خوادم’ (Serverless) من جحيم التكاليف المهدرة؟

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

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

كانت إجاباتي في المقابلات عشوائية: كيف أنقذتني منهجية STAR من جحيم أسئلة “حدثنا عن موقف…”؟

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

14 مايو، 2026 قراءة المزيد
التوسع والأداء العالي والأحمال

كيف أنقذ ‘موازن الحمل’ خادمنا الوحيد من الانهيار؟ قصة من قلب المعركة

هل يواجه تطبيقك بطئًا وتوقفًا مفاجئًا مع زيادة عدد المستخدمين؟ في هذه المقالة، أشارككم قصتي مع انهيار خادمنا الوحيد وكيف كان 'موازن الحمل' (Load Balancer)...

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

من كشط الشاشة إلى الخدمات المصرفية المفتوحة: كيف أنقذت واجهات الـ API تطبيقاتنا المالية؟

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

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

وداعاً لـ `kubectl apply -f`: كيف حولنا إدارة Kubernetes إلى عملية آلية وموثوقة مع GitOps؟

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

13 مايو، 2026 قراءة المزيد
ادارة الفرق والتنمية البشرية

كانت الأفكار تموت في صمت: كيف أنقذتنا ‘السلامة النفسية’ من جحيم الخوف من الفشل؟

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

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