لماذا "الاختبارات أولاً" ليست مازوخية بل قوة خارقة
\n\nتخيل: أنت تكتب كودًا، كل شيء يعمل. أنت سعيد. بعد شهر تعود إلى المشروع، تغير سطرًا واحدًا - وكل شيء ينهار. مألوف؟ مرحبًا بك في نادي المطورين الذين لا يكتبون اختبارات. والآن تخيل واقعًا آخر: تغير الكود، تشغل الاختبارات - وبعد 10 ثوانٍ تعرف أن شيئًا لم ينكسر. هذا ليس سحرًا، هذا TDD (Test-Driven Development) - التطوير القائم على الاختبار.
\n\nفي هذه المقالة سنشرح TDD باستخدام C#. بدون نظرية مملة. فقط ممارسة، كود وحالات واقعية. إذا كنت تعتقد أن TDD مخصص لـ "المهندسين المعماريين النقيين" أو "وحوش المؤسسات" - فستتفاجأ. إنها أداة ستنقذ كودك وأعصابك.
\n\nما هو TDD وكيف يعمل Red-Green-Refactor
\n\nTDD ليس عن الاختبار. إنه عن التصميم. أنت لا تكتب اختبارات بعد الكود، بل العكس: أولاً الاختبار، ثم الحد الأدنى من الكود الذي ينجح فيه، وبعد ذلك فقط إعادة الهيكلة. هذه الدورة تسمى Red-Green-Refactor:
\n\n- \n
- Red - نكتب اختبارًا سيفشل بالتأكيد (أحمر). \n
- Green - نكتب الحد الأدنى من الكود ليجتاز الاختبار (أخضر). \n
- Refactor - نحسن الكود دون تغيير سلوكه. \n
يبدو غريبًا؟ دعنا نرى مثالاً. لنفترض أننا بحاجة إلى آلة حاسبة بطريقة الجمع. عادة نكتب الكلاس، ثم الاختبار. في TDD - العكس.
\n\nالخطوة 1: Red - نكتب اختبارًا سيفشل
\n\nusing NUnit.Framework;\n\n[TestFixture]\npublic class CalculatorTests\n{\n [Test]\n public void Add_ShouldReturnSumOfTwoNumbers()\n {\n // Arrange\n var calculator = new Calculator();\n \n // Act\n var result = calculator.Add(2, 3);\n \n // Assert\n Assert.AreEqual(5, result);\n }\n}\n\nنشغله - الاختبار يفشل، لأن كلاس Calculator غير موجود. الأحمر طبيعي. الآن مهمتنا هي جعله أخضر.
\n\nالخطوة 2: Green - الحد الأدنى من الكود ليجتاز الاختبار
\n\npublic class Calculator\n{\n public int Add(int a, int b)\n {\n return a + b; // الحد الأدنى من التنفيذ\n }\n}\n\nالاختبار أخضر. مرحى. لكن الكود لا يزال قبيحًا. ننتقل إلى الخطوة 3.
\n\nالخطوة 3: Refactor - نحسن دون كسر
\n\nفي هذه المرحلة يمكننا إضافة تحقق، معالجة استثناءات أو تغيير البنية. الأهم - يجب أن تبقى الاختبارات خضراء.
\n\npublic class Calculator\n{\n public int Add(int a, int b)\n {\n if (a < 0 || b < 0)\n throw new ArgumentException("يُسمح فقط بالأرقام الموجبة");\n return a + b;\n }\n}\n\nهل سيفشل الاختبار؟ نعم. إذًا يجب تحديث الاختبار أو تغيير المنطق. في TDD، إعادة الهيكلة هي دائمًا حوار مع الاختبارات.
\n\nكيف تختار إطار العمل لـ TDD في C#: NUnit vs xUnit
\n\nفي C# هناك ثلاثة أطر عمل شائعة: NUnit و xUnit و MSTest. سننظر في الأولين لأنهما الأكثر مرونة.
\n\n| المعيار | \nNUnit | \nxUnit | \n
|---|---|---|
| السمات | \n[Test], [SetUp] | \n[Fact], [Theory] | \n
| المعلمات | \n[TestCase] | \n[InlineData] | \n