آشنایی با مفهوم TDD

تعریف TDD (Test-driven development) یا توسعه تست محور:

برنامه نویسی تست محور به تکنیکی از توسعه نرم افزار گفته می شود که در آن توسعه به چرخه های توسعه کوچکتر تقسیم شده و برای هریک از نیازمندی های هر بخش تست های مختلفی نوشته می‌شود.

در این فرآیند ابتدا توسعه دهندگان تستی را می نویسند که این تست با شکست مواجه میشود، سپس با کمترین مقدار تغییرات کدی را که باعث پاس شدن تست می‌شود می‌نویسند و در مرحله آخر کد جدید را با استانداردهای قابل قبول ریفکتور می‌کند.

به بیان دیگر در برنامه نویسی تست محور ما ابتدا برای امکانات مورد نیاز خودمون تست مینویسیم و سپس کد مربوط به پاس کردن این تست ها توسعه داده میشه.

چرخه کلی روش توسعه تست محور شامل گام‌هایی به ترتیب زیر است که بر اساس کتاب Test-Driven Development by Example نوشته شده‌است:


چرخه tdd
چرخه tdd


۱. یک تست جدید بنویس

در روش توسعه تست محور هر ویژگی جدید با افزودن یک تست شروع می‌شود. طبیعی است این تست باید طوری طراحی شود که تنها با افزوده شدن صحیح و کامل ویژگی جدید مطلوب پاس شود.

۲. تمام تست‌ها را اجرا کن و ببین آیا تست جدید پاس می‌شود یا خیر

در این مرحله قصد داریم مطمئن شویم تست جدیدی که افزودیم خطا بدهد، وگرنه با افزودن کد جدید امکان اینکه چک شود ویژگی جدید واقعاً به درستی افزوده شده‌است یا خیر وجود نخواهد داشت.

۳. کد را بنویس

در این گام تنها کد اضافه ای که نیاز هست تا تست جدید پاس شود را می‌نویسیم و به زیاده روی در توسعه نمی‌پردازیم.

۴. مجدداً تست‌ها را اجرا کن

این بار اگر تمام تست‌ها پاس شوند مطمئن می‌شویم که تمام ویژگی‌های قبلی به درستی کار می‌کنند و علاوه بر آن ویژگی جدید نیز به‌طور صحیح اضافه شده‌است.

۵. کد را Refactor کن

روشن است که کد کل برنامه باید هر چند وقت یک بار تمیز و مرتب شود تا از ایجاد کد کثیف اجتناب شود و امکان بهبود مناسب و سریع در آینده فراهم باشد. در این گام قصد داریم دقیقاً همین کار را انجام دهیم. در این گام به‌طور ویژه لازم است به ملاحظات توسعه همانند رعایت وراثت و خوانایی و امکان نگهداری مناسب کد و الگوهای طراحی برنامه توجه داشته باشیم.

۶. گام‌های ۱ الی ۵ را (برای هر ویژگی جدید که اضافه می‌کنی) تکرار کن برای هر ویژگی جدید گام‌های فوق را تکرار می‌کنیم.

از ویژگی‌ها و مزیت‌های دیگر این متدولوژی می‌توان موارد زیر را نام برد:

۱. بررسی کامل‌تر در ابتدا:

این فرایند باعث می‌شود قبل از نوشتن برنامه، به جنبه‌های مختلف نیازمندی‌ها فکر کنیم و مواردی که روش‌های موجود می‌توانند شکست بخورند را بررسی کرده و در داخل آزمون‌ها در نظر بگیریم.

۲. متمرکز کردن اهداف:

برنامه‌نویس هدف خود را با داشتن آزمون‌ها به روشنی می‌داند و می‌توانند صرفاً با تمرکز بر روی همین آزمون‌ها، از یک هدف و نیازمندی مبهم خود را دور کند.

۳. کاهش هزینه‌ها در نهایت:

ممکن است TDD در ابتدا پرهزینه به نظر بیاید، اما به دلیل این که فرایند آزمون مرحله به مرحله و برای بخش‌های مختلف برنامه و بر اساس نیازمندی‌های مورد نیاز است، احتمال وارد شدن هزینه سنگینی که به خاطر عدم تطابق برنامه با نیازها پرداخت خواهد شد کاهش میابد.

۴. توسعه گام به گام:

در بسیاری از موارد پیش آماده که برنامه را کامل نوشتیم و بعد به آزمون آن پرداختیم و به اشکالی برخوردیم، ولی چون از سر منشأ مشکلات به صورت دقیق آگاه نبودیم، نتوانستیم آن‌ها را رفع کنیم. توسعه آزمون محور این مسئله را نیز برای ما برطرف می‌کند.

۵. مستندسازی:

اگر از عملکرد تابعی در برنامه اطمینان نداشته باشیم، می‌توانیم با بررسی آزمون مربوط به آن تابع و پاسخ مد نظر، شهودی از رفتار مورد انتظار آن تابع داشته باشیم.

۶. کدهای مرتب‌تر:

با توجه به این که از رفتار تابع‌ها به صورت مجزا می‌توان اطمینان یافت، می‌توان refactoring را به صورت آنی‌تری انجام داد، همچنین سطح‌های دسترسی توابع (خصوصی و عمومی) را پس از اطمینان از صحت درستی به صورت درجا مشخص کنیم و مجبور نشویم برای تست یک تابع در توابع دیگر این سطح دسترسی‌ها را تغییر دهیم.

خلاصه:

زندگی برنامه نویس ها همیشه با چرخه ها(loop) درگیر هستش. TDD هم یه چرخه توسعه نرم افزار هستش که توی روند توسعه تکرار میشه.

مفهوم TDD یعنی ترکیب سه عمل طراحی،تست (Unit Test) و کدنویسی.

ولی با این تفاوت که بعد از استخراج نیازمندی های پروژه، باید در اولین مرحله، تست های پروژه نوشته بشه و بعد روند توسعه ادامه داده بشه.

یکی از اصلی ترین مزیت های این روش اینه که همین اول مسیر تکلیف خروجی نهایی پروژه مشخص میشه و کاملا واضح هستش که چه انتظاراتی از برنامه دارین و اگر سوال یا ابهامی وجود داره، قبل از شروع کد نویسی رفع میشه.

مزیت بعدی اینه که شمارو مجبور میکنه از SOLID Principles پیروی کنید.