Test Driven Development یا به اختصار TDD یک متدولوژی توسعه نرم افزار است که از طریق تکنیک test first به ما در تست و توسعه هرچه سریعتر و باکیفیت تر نرم افزار کمک می کند. TDD در حقیقت تشکیل شده از یک چرخه بی نهایت تکراری (Iterative) شامل مراحل Red ,Green و Refactor که به شکل زیر نمایش داده می شود:
چرخه تست نرم افزار Test Driven Development
:TDD Steps
Red:Write failing test
Green: Write code to pass failing test
Refactor: Improve the code quality
شاید در نگاه اول کمی گیج کننده باشد. اما با حل یک مسئله آن را راحت تر می کنیم. قصد داریم از ساخته شدن کلاسی به اسم Hero و مقدار دهی صحیح به Property های Name, Health و Damage اطمینان حاصل کنیم. برای این کار، مراحل چرخه TDD را یکبار مرور می کنیم:
قانون اول: هیچ کد عملیاتی (Production Code) نوشته نمی شود تا زمانی که یک Failing Test برای آن نوشته شده باشد.
Red Step مرحله اول TDD به ما می گوید که تستی بنویسیم که Fail شود. به قطعه کد زیر دقت کنید.
ابزارهای تست
دقت داشته باشید برای نوشتن تست ها از XUnit.net Test Framework استفاده میکنیم. همچنین از ابزار NCrunch برای Continuous Testing استفاده می کنیم.
Failing Test
همانطور که در عکس بالا مشاهده می کنید، Compile Error داریم. کامپایلر #C به ما می گوید که کلاسی به اسم Hero اصلا وجود ندارد!
از این توضیحات قانون دوم نتیجه می شود: نوشتن تست را تا زمانی ادامه می دهیم که تست Fail شود. به محض اینکه Fail شد دیگر تکمیل آن تست را ادامه نمی دهیم و به سراغ Production Code می رویم.
Green Step مرحله دوم چرخه TDD به ما می گوید که کدی بنویسیم که تست را Pass کند.
قانون سوم: تنها باید به اندازه Pass شدن این تست کد بنویسیم و نه بیشتر. پس کلاس Hero به همراه Constructor آن را پیاده سازی می کنیم به کد زیر دقت کنید:
Write Just Enough Code To Make Test Pass
با اضافه کردن این قطعه کد، Failing Test ما تبدیل به Passing Test شده، از حالت Red به Green تغییر وضعیت می دهد. در این لحظه می توانیم به تکمیل تست بپردازیم. می خواهیم چک کنیم که آیا مقدار Hero.Name (ویژگی Name از کلاس Hero) همان مقداری است که به Constructor پاس داده ایم یا خیر.
;(Assert.Equal(name,hero.Name)
با اضافه کردن این قطعه کد، دوباره به حالت Red بازگشتیم و تست Fail شد چون Name وجود ندارد پس به Production Code برمی گردیم و به همان اندازه ای که این تست (Pass (Green شود کد می نویسیم. Name را به کلاس Hero می افزاییم و مقدار آن را در Constructor مساوی مقدار پاس داده شده قرار می دهیم:
;{public string Name { get; private set
و تست با موفقیت Pass شد. همین مراحل را برای مقادیر Health و Damage نیز انجام می دهیم. تست نهایی به شکل زیر خواهد بود:
تست کامل شده
همچنین کلاس Hero به شکل زیر کامل خواهد شد:
کد کلاس Hero
نتیجه گیری: از بحث فوق و مراحلی که تا کنون طی کرده ایم به 3 قانون TDD می رسیم. تمام این اصول به شما در جهت دریافت Feedback سریع از کد، افزایش سرعت توسعه، قابل استفاده مجدد بودن کدها (Reusability)، تمیزی کدها و خوانا بودن آن برای توسعه دهندگان بعدی و … کمک خواهد کرد که رعایت آنها نهایتا منجر به ایجاد یک نرم افزار با کیفیت (High Quality) خواهد شد.