ایده اولیه TDD به سالهای دور و کتابهای قدیمی برنامهنویسی بازمیگردد. در آن زمان، پیشنهاد میشد که برنامهنویس خروجی مورد انتظار خود را بهصورت دستی وارد کند و سپس تا زمانی که کد به آن خروجی برسد، به اصلاح آن ادامه دهد.
با این حال، مفهوم مدرن TDD در سال ۱۹۹۹ به عنوان بخشی از متدولوژی Extreme Programming (XP) دوباره متولد شد. توسعهدهندگان از این روش نهتنها برای پروژههای جدید، بلکه برای بهبود و بازسازی (Refactoring) کدهای قدیمی که با متدولوژیهای سنتی نوشته شده بودند، استفاده کردند. ابداع فریمورکهای xUnit (مانند JUnit برای جاوا) نقطه عطفی بود که باعث شد TDD از یک ایده تئوری به یک ابزار عملی و قدرتمند تبدیل شود.
توسعه تستمحور (TDD) روشی در مهندسی نرمافزار است که در آن تستهای خودکار (Automation Tests) پیش از نوشتن کدهای اصلی برنامه نوشته میشوند.
در روشهای سنتی، ابتدا کد نوشته میشود و سپس برای آن تست طراحی میگردد (یا اصلاً تستی نوشته نمیشود!). اما در TDD، تمرکز بر چرخههای توسعه بسیار کوتاه و تکرارشونده است. به زبان ساده، TDD یعنی:
ابتدا تستی بنویسید که شکست میخورد.
کد کافی برای پاس شدن تست بنویسید.
کد را تمیز و بهینه کنید.
این فرآیند باعث میشود تستها و کدهای اصلی به هم گره بخورند و نرمافزار به تدریج و با اطمینان کامل رشد کند.
فرآیند TDD بر پایه تکرار یک چرخه سهمرحلهای استوار است که به آن چرخه قرمز-سبز-بازآرایی میگوییم:
۱. مرحله قرمز (Red)
۲. مرحله سبز (Green)
۳. مرحله بازآرایی (Refactor)
کدهای تکراری حذف میشوند.
نامگذاریها اصلاح میگردند.
ساختار کد بدون تغییر در رفتار آن، بهبود مییابد.
پس از هر تغییر، دوباره تستها اجرا میشوند تا اطمینان حاصل شود که بازآرایی باعث خرابی چیزی نشده است.
دو مکتب اصلی در اجرای TDD وجود دارد که هر کدام طرفداران خود را دارند:
۱. رویکرد درون به بیرون (Inside-Out)
این رویکرد که به مکتب دیترویت (Detroit School) یا کلاسیک نیز معروف است، بر تست کردن کوچکترین واحدهای کد (توابع و متدها) تمرکز دارد.
ویژگیها: معماری نرمافزار به مرور و با نوشتن تستها شکل میگیرد.
مزایا: برای مبتدیان راحتتر است و استفاده از اشیاء بدلی (Mocks) را به حداقل میرساند.
۲. رویکرد بیرون به درون (Outside-In)
این رویکرد که به مکتب لندن (London School) یا Mockist معروف است، از لایههای بیرونی (رابط کاربری یا نیازهای کاربر) شروع شده و به سمت جزئیات داخلی پیش میرود.
ویژگیها: وابستگی زیادی به Mocks و Stubs دارد تا رفتارهای بیرونی را شبیهسازی کند.
مزایا: تضمین میکند که کد دقیقاً مطابق با نیازهای تجاری (Business Requirements) ساخته شود.
جالب است بدانید که فلسفه TDD فقط محدود به کدنویسی نیست. تیمهای محصول و خدمات نیز میتوانند از این منطق برای مدیریت کارهای خود استفاده کنند. در این حالت، به جای "تست" از واژه "چکلیست" یا "تاییدیه" استفاده میشود:
| گام در برنامهنویسی (TDD) | گام در کار تیمی (TDW) |
| اضافه کردن یک تست | اضافه کردن یک معیار پذیرش (Check) |
| اجرای تستها و شکست خوردن | بررسی معیارها و تایید عدم انجام کار |
| نوشتن کد | انجام کار واقعی |
| اجرای مجدد تستها | بررسی مجدد معیارها برای تایید موفقیت |
| بازآرایی کد | تمیزکاری و بهینهسازی خروجی کار |
| ویژگی | توسعه تستمحور (TDD) | تست سنتی |
| زمان نوشتن تست | قبل از نوشتن کد اصلی | بعد از اتمام کدنویسی |
| دامنه تست | بخشهای بسیار کوچک و مجزا | کل سیستم یا بخشهای بزرگ |
| عیبیابی (Debugging) | بسیار آسان (خطا بلافاصله پیدا میشود) | دشوار (پیدا کردن منشا خطا در کد حجیم) |
| تکرار | گامهای بسیار کوتاه و مداوم | یک مرحله بزرگ تست پس از توسعه |
| هدف اصلی | طراحی بهتر و جلوگیری از باگ | پیدا کردن باگهای موجود |
بازخورد سریع: توسعهدهنده در هر لحظه میداند که آیا کدش کار میکند یا خیر.
کاهش باگها: نوشتن تست قبل از کد، مانند یک تور ایمنی عمل کرده و از ورود خطاهای منطقی جلوگیری میکند.
طراحی بهتر: TDD برنامهنویس را مجبور میکند به نحوه استفاده از کد (Interface) فکر کند، که منجر به کدهای تمیزتر و ماژولارتر میشود.
مستندسازی زنده: خودِ تستها به عنوان مستنداتی عمل میکنند که نشان میدهند کد چگونه باید رفتار کند.
افزایش حجم کد: نوشتن تستها به معنای نوشتن کدهای بیشتر است که باید نگهداری شوند.
زمانبر بودن در ابتدا: یادگیری و اجرای TDD در شروع پروژه زمان بیشتری نسبت به کدنویسی مستقیم میگیرد.
حس امنیت کاذب: اگر تستها ضعیف نوشته شوند، پاس شدن آنها به معنای بینقص بودن برنامه نیست.
نیاز به محیط تست: راهاندازی و نگهداری محیطهای تست (Test Environments) و دادههای اولیه میتواند پیچیده باشد.
توسعه تستمحور (TDD) فراتر از یک روش تست کردن ساده است؛ این یک متدولوژی برای ساخت نرمافزارهای باکیفیت، قابل نگهداری و منعطف است. با استفاده از چرخه قرمز-سبز-بازآرایی، توسعهدهندگان میتوانند با اعتماد به نفس بیشتری کد بزنند و اطمینان حاصل کنند که هر تغییر جدید، باعث خرابی بخشهای قبلی نمیشود. اگرچه TDD هزینه زمانی اولیه را افزایش میدهد، اما در طولانیمدت با کاهش هزینههای عیبیابی و بازنویسی، به نفع هر تیم نرمافزاری خواهد بود.
0 نظر
هنوز نظری برای این مقاله ثبت نشده است.