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

أبو عمر

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

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

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

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

آخر المدونات

تجربة المستخدم والابداع البصري

من الكنباية في بالي إلى الكنباية في صالوني: رحلتي مع الواجهات الفضائية والواقع المعزز

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

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

التصميم التوقعي والواجهات غير المرئية: كيف تجعل تطبيقاتك تقرأ أفكار المستخدمين؟

من منظور مطور برمجيات، أغوص في عالم التصميم التوقعي والواجهات غير المرئية (Zero UI). نستكشف كيف يمكن للتطبيقات أن تتنبأ باحتياجاتك قبل أن تطلبها، مع...

13 يناير، 2026 قراءة المزيد
من لمسة يد إلى همسة صوت: كيف تبني الواجهات متعددة الأنماط جيلاً جديداً من التجارب الرقمية
تجربة المستخدم والابداع البصري

من لمسة يد إلى همسة صوت: كيف تبني الواجهات متعددة الأنماط جيلاً جديداً من التجارب الرقمية

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

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

واجهتك تعرفك أكثر منك: كيف يصنع الذكاء الاصطناعي تجربة مستخدم فريدة لكل شخص؟

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

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

الذكاء الاصطناعي الصوتي في البنوك: من طوابير الانتظار إلى معاملات فورية بصوتك

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

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

المالية المفتوحة: كيف تستعيد ملكية بياناتك المالية وتصنع مستقبلك؟

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

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