TDD چیست و چرا اهمیت دارد؟!

What is TDD ??‍♂️
What is TDD ??‍♂️

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


TDD چیست؟


همانطور که میدانید، TDD مخفف Test Driven Development هست، و نوعی روند توسعه نرم افزار به حساب میاد، خیلی ها فکر میکنند که TDD یعنی تست نویسی، بله درسته، ما به واسطه TDD تست هم مینویسیم ولی خود TDD همونطور که گفتیم بک روند توسعه نرم افزاره، در ساده ترین تعریف، "ما کدی مینوسیم که نرم افزارمان را به صورت کاملا اتوماتیک تست کند"، منظورم از تست چیه؟! یعنی خروجی هایی که، بخش نرم افزاری که در حال تست آن هستیم با خروجی هایی که انتظار داریم برابر باشند.
به طور مثال، شما انتظار دارید اگر به فانکشن sum دو عدد 3 و 4 را دادید، مقدار 7 را بازگرداند، شما تستی مینویسید و مشخص میکنید، که خروجی باید حتما عدد باشد و مقدار 3 و 4 را به فانکشن پاس میدهید و مجددا انتظار دارید که خروجی 7 باشد.
ما الان یک تست نوشتیم، به این نوع تست UnitTest میگویند، که کوچک ترین اجزا نرم افزار مارو تست میکند (کوچک ترین بخش های نرم افزاری فانکشن ها و متد ها هستند)


Red Green Refactor cycle :

Red Green Refactor cycle
Red Green Refactor cycle

یک چرخه ای وجود داره به نام Red Green Refactor که زمانی که میخواید از TDD توی نرم افزارتون استفاده کنید حتما باید از این چرخه پیروی کنید، همونطور که توی تصویر بالا میبینید: ? این چرخه با Red یا همون قرمز آغاز میشه.
Red : یعنی شما باید اول تست رو بنویسید، بعد اون فانکشنالیتی رو پیاده سازی کنید، پس همونطور که توی عکس نوشته شما اول باید یک تستی بنویسید که با شکست مواجه شود.
Green : بعد از اینکه تست شما با شکست مواجه شد، الان وقتشه که تمام تمرکزتون رو بذار برای اینکه، فقط بتونید تست رو پاس کنید (منظورم از تمام تمرکز اینه که در این مرحه خیلی درگیر کیلین بودن کد ها نشید، فعلا تنها وظیفه شما پاس کردن این تست ها است.)
Refactor : بعد از اینکه تست ما پاس شد، الان وقتشه که ما کد هامون رو ریفکتور کنیم، الان باید به کیلین بودن کد ها اهمیت بدید و کد هارو تمیز کنید و روش های پیاده سازیتون رو اگر به تغیر نیاز داره، تغیر بدید و . .


چرا اول باید تست بنویسیم بعد نرم افزار رو پیاده سازی کنیم؟

اول تست نوشتن در توسعه نرم افزار روی معماری نرم افزار تاثیر میگذارد، یعنی: برای هر بخش کوچیک نرم افزاری که تست مینویسید، اون برنامه نویس یا دولوپر، (که عمدتا خودتا هستید، ولی در شرکت های بزرگ یک پزیشن شغلی وجود داره که این کار را برای شما انجام میدهد.) مجبور میشه طبق قوانین و قواعدی که شما توی تست تعریف کردید رفتار کنه، و این امکان رو به شما میده که زمان تست نویسی، API اون بخش رو که درحال تست آن هستید، از بالا (منظور نگاه Abstract هست ) نگاه کنید، سعی کنید همیشه قبل از پیاده سازی تست بنویسید، چون تست نوشتن برای نرم افزار هایی که قبلا پیاده سازی شدن، خیلی کار سخت و دشواریه، و اون کیفیتی که مد نظر ما هست رو هم برامون فراهم نمیکند.


چرا اصلا وقتی خودمون میتونیم دستی نرم افزار رو تست کنیم، باید تست اتوماتیک بنویسیم؟!

یکی از سوالات پرتکرار این است که: چرا وقتی خودم دارم دستی نرم افزارمو تست میکنم، بیام کلی زمان و انرژی بذارم که اتوماتیک نرم افزارم تست بشه؟! درسته، اگر نرم افزار شما نرم افزار بزرگی نباشه، روشی که مد نظرتونه شاید کارکنه، ولی زمانی که نرم افزار بزرگ میشه و دغدغه های توسعه نرم افزار بیشتر و بیشتر میشه، تقریبا احتمال صحیح کارکردن روش شما به صفر میرسد، زمانی که دستی نرم افزار را تست میکنید، ممکنه یک بخشی رو جابندازید، یا بخشی دیگر را فراموش کنید و اون بخش زمانی که نرم افزار ریلیز بشه، توی Production Mode به مشکل بخوره و خب میدونید که دیباگ کردن نرم افزار توی مود پروداکشن، زمان بیشتری از ما میگیره و زمان بیشتر مساوی با هزینه پیشتر است.



تست نوشتن تلف کردن وقته؟

خیلی از برنامه نویسان و یا حتی خیلی از شرکتا فکر میکنند که تست نویسی برای پروژه های نرم افزاری اتلاف وقت است، ولی اصلا اینطور نیست، به عکس زیر توجه کنید: ?

تفاوت توسعه نوم افزار با تست و بی تست
تفاوت توسعه نوم افزار با تست و بی تست

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




تست نوشتن هزینه توسعه را چند برابر میکند

یکی دیگر از باور های غلط بعضی از برنامه نویسان و شرکت ها این است که گمان میکنند تست نویسی هزینه توسعه نرم افزار را افزایش میدهد، ولی باید بگویم که اینطور نیست، به تصویر زیر توجه کنید: ?

همانطور که در بالا میبینید، توسعه یک نرم افزار واحد بدون تست نویسی و با تست نویسی مقایسه شده است، نرم افزار بدون تست نویسی در مجموع 480 ساعت زمان از ما گرفته، و نرم افزار با تست نویسی 310 ساعت، و اگر ما به برنامه نویسانمان به ازای هر ساعت، 120 دلار بدهیم، این اختلاف برابر میشود با 20,400 دلار که مبلغ زیادی است، علاوه بر این، بدون تست نویسی نرم افزار ما 170 ساعت دیر تر ریلیز میشود، و اگر محصول برای فروش داشته باشیم در آن 170 ساعتی که محصولی نفروخته ایم، ضرر مالی ما چندین برابر میشود.



حتما Code Coverage ما باید %100 باشد؟

کد کاوریج به درصد کدی میگویند که برای آن تست نوشته شده، اگر بخوام سوال بالا رو ساده تر بپرسم میشه: "حتما باید برای تمام قسمت های نرم افزار تست بنویسیم؟".
خب جواب این سوال خیر هست، شما قرار نیست کد کاوریج 100 درصد داشته باشید، شما باید برای قسمت های اصلی و حیاتی نرم افزارتون تست بنویسید، کدکاوریج %90+ عدد خوبیه، خب طبیعتا هرچه کدکاوریج شما بیشتر باشد، باگ نرم افزار شما نیز کمتر است.

وقتی تست مینویسیم دیگه لازم نیست پس از ریلیز شدن نرم افزار اون رو تست کنیم؟

یکی از باور های غلطی که وجود داره اینه که زمانی که ما برای نرم افزارمون تست نوشتیم دیگه لازم نیست توی مود پروداکشن اون رو دستی تست کنیم، تست نوشتن به این معنا نیست که باگ نرم افزاری شما صفر میشود، بلکه به این معناست که مقدار قابل توجهی از آنرا کاهش میدهد.


امیدوارم تا اینجا مقاله براتون مفید بوده باشه و تونسته باشم اطلاعات مفیدی رو بهتون انتقال بدم، ممنون میشم مقاله رو با دوستاتون به اشتراک بذارید.??
اگر سوالی داشتی حتما توی بخش کامنت ها بپرسید، تا باهم سطح دانشمون رو افزایش بدیم.✌?