Test Driven Development یا به اختصار TDD پارادایمی در توسعهٔ نرمافزار است که کاملاً مبتنی بر یونیت تست است بدین شکل که تیمهای نرمافزاری در این سَبک برنامهنویسی قبل از آنکه اقدام به کدنویسی کنند، دست نوشتن تستها میزنند!
در عین حال، توجه داشته باشیم که Unit Testing با TDD یکسان نیست. در حقیقت، زمانی که اقدام به نوشتن کدهای اصلی اپلیکیشن کرده سپس تستهایی برای اطمینان حاصل کردن از صحت عملکرد آنها مینویسیم، چنین رویکردی Unit Testing نامیده میشود اما TDD حاکی از آن است که ابتدا به ساکن اقدام به نوشتن یکسری یونیت تست نموده سپس دست به نوشتن کدهای اصلی اپلیکیشن بزنیم به گونهای که در نهایت باید منجر به پاس شدن کلیهٔ تستها شوند که در ادامه با ذکر یکسری مثال فرضی، سعی خواهیم نمود تا این تفاوتها را بهتر نشان دهیم.
فرض کنیم که قصد داریم برای نرمافزارمان یک یونیت تست بنویسیم و به عنوان یک واحد کوچک از نرمافزار داریم:
function calculateLoan(int $amount, int $months, double $interestRate)
{
// some code
}
همانطور که میبینیم، فانکشنی نوشتهایم که سه پارامتر ورودی گرفته سپس بر اساس دیتای ورودی این وظیفه را دارا است تا یک عدد برگرداند. حال تست چنین فانکشنی به صورت زیر خواهد بود:
function testCalculateLoan()
{
calculateLoan(10000, 12, 10.5);
}
در واقع، فانکشنی نوشتهایم تحت عنوان ()testCalculateLoan
که این وظیفه را دارا است تا صحت عملکرد فانکشن ()calculateLoan
را بسنجد و همانطور که میبینیم، آرگومانهایی بر اساس تایپ مشخصشده در فانکشن اصلی در نظر گرفتهایم که در چنین شرایطی تست به راحتی پاس میگردد.
حال برسیم به بررسی به مقولهٔ توسعهٔ نرمافزار تستمحور یا اصطلاحاً TDD که در آن دقیقاً عکس مراحل فوق رخ خواهد داد به طوری که ابتدا به ساکن تستها نوشته میشوند به طوری که مثلاً داریم:
function testCalculateLoan()
{
calculateLoan(10000, 12, 10.5);
}
نتیجهٔ اجرای فوق مسلماً Fail است چرا که اساساً چنین فانکشنی وجود خارجی ندارد. حال اقدام به نوشتن فانکشن ()calculateLoan
میکنیم و آنقدر آن بسته به نیازهای تست خود توسعه میدهیم تا در نهایت تست مذکور Pass شود.