November 29, 2025 (5mo ago) — last updated January 20, 2026 (3mo ago)

دليل Red‑Green‑Refactor في TDD

دليل عملي لدورة Red‑Green‑Refactor في TDD مع أمثلة React/TypeScript ونصائح لخفض الأخطاء وتسريع الصيانة.

← Back to blog
Cover Image for دليل Red‑Green‑Refactor في TDD

تعلّم كيفية تطبيق دورة Red‑Green‑Refactor في TDD لكتابة كود أعلى جودة وسهل الصيانة. هذا الدليل العملي يشرح المراحل، أمثلة React/TypeScript، ونصائح لدمج TDD في فريقك.

Red-Green-Refactor TDD: دليل عملي

الملخص: اتقن دورة Red‑Green‑Refactor في التطوير الموجه بالاختبارات (TDD) مع سير عمل عملي، أمثلة، وفوائد تجارية لبناء كود أنظف وسهل الصيانة.

المقدمة

تُعد دورة Red‑Green‑Refactor في التطوير الموجه بالاختبارات (TDD) طريقة منظمة لتصميم البرمجيات والحد من المخاطر. ابدأ باختبار يفشل (أحمر)، اكتب أقل كود ممكن لتمريره (أخضر)، ثم نظّف التنفيذ (إعادة التشكيل). تكرار هذه الدورة يحوّل المتطلبات المعقّدة إلى خطوات صغيرة قابلة للتحقق ويحسّن قابلية الصيانة.

إيقاع التطوير الموجه بالاختبارات

رسم توضيحي مرسوم باليد يبيّن دورة Red-Green-Refactor لسير عمل التطوير الموجه بالاختبارات (TDD).

TDD ليس مجرد كتابة اختبارات؛ إنه تمرين تصميمي يجعل الفريق يفكّر في كيفية استخدام الكود قبل بنائه. العمل بهذه الدورة يقلل التخمين ويشجّع تقدّمًا متدرجًا يمكن التحقق منه. اعتماد هذا الإيقاع يساعد الفرق على التحرك بثقة ومنهجية داخل مشاريعها، مع اختلاف نمط الاعتماد والنتائج حسب السوق والمنظمة1.

فهم المراحل الثلاث

لكل مرحلة غرض واضح وتضمن أن يبقى العمل صغيرًا وقابلًا للاختبار:

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

تخطّي خطوة إعادة التشكيل يجمع دينًا تقنياً ويجعل التغييرات المستقبلية أكثر صعوبة.

لمحة سريعة عن Red‑Green‑Refactor

المرحلةالهدف الرئيسيهدف المطوّر
الأحمرتعريف المطلب والتحقق من الاختباركتابة اختبار صغير يفشل
الأخضرتلبية المطلبإضافة أقل كود لتمرير الاختبار
إعادة التشكيلتحسين الجودة الداخليةإزالة التكرار وتوضيح النية

اعتماد هذا الإيقاع يساعد الفرق على التخطيط والتنفيذ بثبات، مع قابلية للتكيف حسب السياق الداخلي والخارجي1.

استعراض دورة TDD عمليًا

رسم توضيحي مكتوب باليد يبيّن تدفق عملية مع أيقونة قلب أحمر، مربع نص، وأيقونة دائرة خضراء.

لنطبق الدورة على مثال عملي: مكوّن LikeButton باستخدام TypeScript وReact وJest. يوضّح المثال كيف يُوجِّه TDD التصميم مع الحفاظ على سلوك متوقّع.

مرحلة الأحمر: تحديد المتطلب الأول

المتطلب الأبسط: المكوّن يعرض دون تعطل ويظهر كلمة “Like”. نكتب الاختبار قبل الكود:

// LikeButton.test.tsx
import React from "react";
import { render, screen } from "@testing-library/react";
import LikeButton from "./LikeButton";

describe("LikeButton", () => {
  it("renders a button with the initial text \"Like\"", () => {
    render(<LikeButton />);
    const likeButton = screen.getByRole("button", { name: /like/i });
    expect(likeButton).toBeInTheDocument();
  });
});

تشغيل الاختبار يفشل لأن المكوّن غير موجود بعد. هذا هو الهدف من الأحمر — التحقق من أن الاختبار صحيح.

مرحلة الأخضر: ما يكفي لتمرير الاختبار

أنشئ المكوّن الأدنى لإرضاء الاختبار:

// LikeButton.tsx
import React from "react";

const LikeButton = () => {
  return <button>Like</button>;
};

export default LikeButton;

شغّل الاختبارات مرة أخرى؛ ستمرّ. المهمة لهذه الدورة أنجزت.

مرحلة إعادة التشكيل: تلميع التنفيذ

بعد التأكد من المرور، أضِف الأنواع ونمطًا قابلًا للتوسع:

// LikeButton.tsx (refactored)
import React, { FC } from "react";

type LikeButtonProps = {};

const LikeButton: FC<LikeButtonProps> = () => {
  return <button>Like</button>;
};

export default LikeButton;

الاختبارات لا تزال تمرّ. تتيح شبكة الاختبارات تحسين الكود بثقة.

مثال تكرار: النقر على الزر

متطلب جديد: عند النقر يتغير النص إلى “Liked” ويُعطّل الزر لمنع النقرات المتعددة. نبدأ باختبار يفشل:

// LikeButton.test.tsx
it("changes text to \"Liked\" and becomes disabled when clicked", () => {
  render(<LikeButton />);
  const likeButton = screen.getByRole("button", { name: /like/i });
  fireEvent.click(likeButton);
  expect(likeButton).toHaveTextContent("Liked");
  expect(likeButton).toBeDisabled();
});

ثم ننفّذ أقل سلوك لتمرير الاختبار:

// LikeButton.tsx
import React, { FC, useState } from "react";

type LikeButtonProps = {};

const LikeButton: FC<LikeButtonProps> = () => {
  const [liked, setLiked] = useState(false);
  const handleClick = () => setLiked(true);
  return (
    <button onClick={handleClick} disabled={liked}>
      {liked ? "Liked" : "Like"}
    </button>
  );
};

export default LikeButton;

شغّل جميع الاختبارات؛ الكل أخضر. كرّر: متطلب واحد صغير في كل دورة، محمي بالاختبارات.

الحالة التجارية لجودة الكود

مقياس مرسوم باليد يقارن تطوير البرمجيات بدون TDD (أخطاء كثيرة، ثقيل) مع مع TDD (مشكلات أقل، أخف).

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

تقليل العيوب بعد الإصدار وتكاليف الصيانة

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

تسريع دمج المطورين الجدد وتحسين التوقعية

مجموعة اختبارات شاملة تعمل كتوثيق عملي. يمكن للمطورين الجدد تشغيل الاختبارات ليتعرّفوا على سلوك النظام بدلًا من الاعتماد على وثائق قديمة. هذا يقصّر وقت التأقلم ويقلّل العبء على المهندسين المتمرسين.

ممارسات TDD المتسقة تجعل التقديرات والتتبع أكثر موثوقية، ما يساعد في التخطيط والتواصل مع الجهات المعنية3.

مواطن شائعة في TDD وكيفية تجنّبها

إتقان TDD يتطلب تدريبًا. الأنماط المضادة التالية شائعة ويمكن أن تقوّض الفائدة:

اختبارات تكامل بملابس اختبار وحدة

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

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

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

اختبار التنفيذ بدلًا من السلوك

المشكلة: اعتماد الاختبارات على التفاصيل الداخلية يجعلها سهلة الكسر عند إعادة التشكيل.

الإصلاح: اختبر الواجهة العامة والسلوك المرصود. ركّز على المدخلات والمخرجات والآثار الجانبية المرئية للمستخدم.

تخطي خطوة إعادة التشكيل

المشكلة: بعد الوصول للأخضر، يتخطى المطوّرون تنظيف الكود.

الإصلاح: عامل إعادة التشكيل كخطوة إلزامية. مع مرور الاختبارات، يمكن إحداث تحسينات صغيرة تتراكم إلى قاعدة كود قابلة للصيانة.

دمج TDD في فريقك وكود قديم

رسم توضيحي مرسوم باليد يظهر مطورين يعملون على كود قديم مع اختبارات توصيفية وCI/CD.

اعتماد TDD يحتاج تغييرًا ثقافيًا وتقنيًا. شجّع التعلم العملي، اجعل الاختبارات جزءًا من تعريف الإنجاز، واحتفل بانتصارات صغيرة مدفوعة بالاختبارات.

الترويج لـ TDD داخل الفريق

طرق فعّالة لبناء الزخم:

  • البرمجة الزوجية لتوجيه الزملاء عبر دورة Red‑Green‑Refactor.
  • جلسات مشتركة لحل المشكلات الصعبة مع تدوير القائد لتعزيز المعرفة.
  • جلسات "غداء وتعلم" تعرض أمثلة TDD من قاعدة الشيفرة الخاصة بك.

ابدأ بميزة صغيرة وادمجها في سير العمل كحالة إثبات.

ترويض الكود القديم باختبارات توصيف

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

أتمتة الجودة عبر CI/CD

شغّل مجموعة الاختبارات على كل كوميت في قنوات CI. هذا يوفر ملاحظات فورية ويجعل مرور الاختبارات شرطًا للدمج، ما يحافظ على حلقة ملاحظات سريعة وموثوقة3.

أهم أسئلتك عن TDD — مُجَابٌ عليها

هل يحل TDD محل أنواع الاختبارات الأخرى؟

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

كيف أستخدم TDD مع قواعد البيانات أو APIs خارجية؟

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

هل يستحق اختبار مكوّنات واجهة المستخدم البسيطة؟

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

أسئلة شائعة — موجز عملي

س: كم يستغرق حتى يرى فريقي قيمة من TDD؟

A: غالبًا تظهر فوائد تقليل الانحدارات وتسريع تصحيح الأخطاء خلال بضعة سبرنتات، اعتمادًا على الانضباط وحجم الفريق.

س: ما أصغر خطوة أولى لتبني TDD؟

A: ابدأ بميزة جديدة واحدة: اكتب اختبارًا يفشل قبل التنفيذ، ثم اجعل إعادة التشكيل جزءًا من الدورة.

س: كيف أقنع الجهات المعنية بالاستثمار في الاختبارات؟

A: اعرض وفورات التكلفة على المدى الطويل: حوادث إنتاج أقل، صيانة أقل، وتسليم أسرع؛ استخدم أمثلة حقيقية من مشروعكم كدليل.

روابط داخلية موصى بها

  • دليل مفصّل لاختبارات الوحدة: [/guides/unit-testing]
  • أفضل ممارسات CI/CD للأتمتة: [/guides/ci-cd]
  • مقدّمة في تصميم المكوّنات مع React: [/guides/react-components]
1.
Digital.ai، “State of Agile Report”، Digital.ai، https://digital.ai/resource-center/state-of-agile-report
2.
Basili, Victor R.، وآخرون، “An Empirical Study on the Effects of Test-Driven Development”، https://link.springer.com/article/10.1007/s10664-015-9378-2
3.
Google Cloud، “State of DevOps Report”، https://cloud.google.com/devops/state-of-devops
4.
Martin Fowler، “TestDrivenDevelopment”، https://martinfowler.com/bliki/TestDrivenDevelopment.html
← Back to blog
🙋🏻‍♂️

الذكاء الاصطناعي يكتب الكود.
أنت تجعله يدوم.

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