Tdd چیست

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

تست نرم افزار به دو قسمت کلی تقسیم میشود :

؛ Functional testing :‌ تست قسمت های پروژه که می توان شامل متدها و توابع باشد-انواع Functional testing به شکل زیر می باشند

  • Unit testing
  • Integration testing
  • End-to-end testing
  • Smoke testing ...

؛ Non-functional testing:‌ تست قسمت Non-functional سیستم است که می توان شامل performance, reliability, usability, security باشد

  • Performance testing
  • Security testing
  • Load testing ....

در این مقاله به Functional testing و Unit Testing خواهیم پرداخت.

؛ Unit Testing : یک نوع دیگر از تست نرم افزار است که پروژه را به واحد های کوچک(Unit) تقسیم کرده و قابلیت تست بر روی هر واحد رو فراهم میکند.Unit Test یک تست است که یک نیاز مشخص برای یک متد مشخص را آزمایش می‌کند.

در unit test ما دو رویکرد پیش رو داریم

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

2- اول تست را بنویسیم بعد کد را پیاده سازی کنیم : در رویکرد دوم اول تست را می نویسیم بعد پیاده سازی را انجام میدهیم به این روش TDD گفته میشود که در این مقاله ما این روش را پیش خواهیم برد! شاید یکم گنگ بنظر برسد که بدون وجود هیچ کدی چطور تست نوشته میشود!در ادامه بیشتر TDD را بررسی خواهیم کرد.

؛ TDD : مخفف کلمه Test Driven Development یک روش برای تست نرم افزار می باشد.نکته مهمی که در TDD وجود دارد برخلاف حالا معمول اول ما تست را پیاده سازی می کنیم بعد از pass شدن تست و برآورد نیاز ها تست سراغ کد نویسی میرویم.

در تصویر زیر می توان TDD life cycle را مشاهده کرد

life cycle
life cycle


اگر به تصویر بالا دقت کنید در سه مرحله Red, Green ,Refactor انجام میشود.

  • Red — think about what you want to develop
  • Green — think about how to make your tests pass
  • Refactor — think about how to improve your existing implementation

؛ Red : این ناحیه نقطه شروع شما خواهد بود شما در ناحیه قرمز باید کدی بنویسید ک fail شود یعنی کد شما وقتی درست است که fail شود! فرض کنید میخواهید یک تابع داشته باشید به نام () sortArry که یک آرایه ورودی گرفته و آن را sort میکند.شما در کلاس تست یک تابع نوشته و ورودی ها را بهش پاس میدهید و قصد دارید خروجی شما اعداد Sort شده باشد.بعد نوشتن تست و اجرا تست خطایی مبنی بر وجود نداشتن تابع دریافت خواهید کرد!!ا می توان گفت این خطا به درستی کار شما دلالت دارت چون ما هنوز تابعی به نام sort نداریم که بخواهیم فراخوانی کنیم و


؛ Green : این ناحیه فاز دوم شما خواهد بود که باید تست های fail شده در ناحیه قرمز را pass کنید.در این مرحله شما باید حداقل کدی که برای رفع تست و pass شدت الان لازم است بنویسید.ادامه مثال بالارو پیش میگریم،برای رفع خطایی که در مرحله قبل ساختم قبل از هر چیز تابع رو پیاده سازی کرده . مجددا تست را فراخوانی می کنیم توجه کنید نباید کامل کد رو پیاده سازی کنید!شما فقط باید کدی بنویسید که تست فعلی را pass کند نه بیشتر…!

؛ Refactor : در این فاز بدین معنی هست شما هنوز در Green هستید و باید کدهای تان رو به تمیز ترین شکل دوباره بازسازی کنید.تمیز بودن کد می توان شامل بهینه کردن الگوریتم ،بهبود خوانایی کد و … باشد نکته دیگر که در TDD مهم است طبق encapsulate کردن کدها ما فقط Public API را تست می کنیم و به مکانیزم داخل و متدهای private کاری نداریم

مزایا TDD :

؛ Modular programming code : چون قبل از پیاده سازی هر بخش از پروژه باید تست آن نوشته شود،این روش به ماژولار بودن برنامه کمک میکند .در غیر این صورت نمی توانیم تست درستی داشته باشیم.اگر میخواهیم یک کد تست پذیر داشته باشیم باید حتما ماژولار کد بنویسیم

؛ Easy refactoring and code maintenance : چون TDD قبل از نوشتن کد برنامه نویس را وادار به نوشتن تست میکند،و تست های شما هر بار fail و pass میشوند و بارها رو کد refactor انجام می شود در نتیجه کد های شما بعد از هر بار refactor کردن بهینه تر خواهد شد.وقتی کد ها ماژولار باشند تست گرفتن آسان تر خواهد بود.

؛ Fruitful team collaboration : اگه کد شما تست پذیر باشند می توان یک کار تیمی داشت.چون کدهایی که توسط برنامه نویس های دیگر نوشته شده است بلافاصله بعد از تغییر بر روی پروژه نمایان خواهد شد

؛ Bugs prevention : اگه طبق تعریف TDD قبل از پیاده سازی کد ،تست را پیاده سازی کنیم در طول پیاده سازی ماژول به خطایی برخورد نخواهیم کرد!چون هنگام نوشتن کد قبل از آن تست آن بار ها خطایابی میشود

؛ Requirements clarification : وقتی از TDD استفاده می کنیم هنگام کد نویسی نیازمندی ها و وابستگی های پروژه معلوم میشود و کمک میکند با دقت بیشتر نوشت

البته چند مورد بالا تنها بخشی از مزایا TDD میباشد.یکی از مزایا دیگری که TDD شما را وادر به رعایت کردن ان میکند رعایت SOLID در کدهایتان است.

اگه بخواهیم در باره معایب TDD صحبت کنیم باید گفت بحث Unit Test در پروژه های بزرگ لازم و ضروری است و نمیتوان گفت که معایب دارد.در برخی از سایت ها تایمی را که برنامه نویس بابت نوشتن تست صرف میکند را از معایب Unit test به حساب اوردن!ولی واقعت این است اگه پروژه بدون تست نوشته شود همان تایم مجدد صرف خطا یابی خواهد شد.

در مقاله بعدی پیاده سازی TDD را در یک پروژه ساده پیاده سازی خواهیم کرد

اگه از مقاله راضی بودید میتونید از لینک زیر برام قهوه بخرید : )

https://www.coffeete.ir/sobhan