Unit Test #1

امروزه نگهداری و توسعه نرم افزار کار پیچیده و دشواری شده است .به عنوان یک برنامه نویس مطمئنا با باگ های زیادی برخورد داشته اید ! یا قسمتی از کد که قبلا کار میکرده ولی امروز دچار مشکل شده است ! باگ های نرم افزار در حالت معقول امری طبیعی است . همانطور شاهد هستیم پروژه های بزرگ مثل ویندوز ، IOS و ... شاهد باگ هایی هستند که به مرور زمان نمایان میشوند ! ولی پروژه های بزرگ را باید چجوری مدیریت کنیم؟!ساده ترین روشی که میتوان انجام داد استخدام تیم تست است، که به عنوان کاربر نهایی بر روی سیستم دنبال پیدا کردن خطا هستند! موازی با رشد پروژه خطا ها هم ببیشتر خواهند شد تا حدی که از کنترل خارج می شوند یا حتی میتوان باعث شکست پروژه شوند.

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

بر اساس ویکی پدیا در ایالات متحده به دلیل عدم تست در پروژه های نرم افزار سالیانه حدود ۵۹٫۵ میلیارد دلار به اقتصاد این کشور صدمه میزند طبق بررسیهای انجام شده با بکارگیری تست در تمام فاز های تولید نرم افزار ۲۲٫۲ میلیارد دلار از این خسارت را میتوان کاهش داد طبق آمارهای ارائه شده از سوی مؤسسه (IDC(International Data Corporation، چهل درصد از بودجه نرم افزارها صرف تست آن میگردد.

در این لینک میتوانید خطای هایی برنامه نویسی که باعث ضرر مالی و جانی شده است را مطالعه کنید.

تست نرم افزار چیست :

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

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

؛ Manual Testing : ساده ترین حالت ممکن برای تست نرم افزار است که در ان برو روی پروژه اجرا شده تست انجام میدهیم تا در صورت وجود خطا ان را گزارش دهیم .در روش Manual همانطور که در بالا هم اشاره شد ، تستر به صور کاربر نهایی بر رویه اپلیکیشن تست انجام میدهد. البته بعضی از شرکت ها معمولا دارای تیم کنترل کیفیت هستند که سیستم نهایی را ارزیابی میکنند .

معایب Manual Testing را میتوان گفت :

  • هزینه و از ان مهم تر تایم که طول خواهد کشید تا تستر ، نرم افزار را تست کند
  • خود نیرو ممکن است دچار خطا انسانی شود که باز به نقطه اول بر میگردیم
  • نیرو استخدام شده درکی از کد نویسی ندارد و نمیتوان به صورت عمیق تست انجام دهد
  • تست کردن مکرر به عنوان کاربر ، میتوان کار کسل کنند ای باشد

؛ Automation Testing : برخلاف روش Manual که توسط کاربر نهایی انجام میشد ، با استفاده از یکسری ابزار ها توسط ماشین ، طبق ورودی هایی که به سیستم میدهیم به صورت خودکار انجام میشود. در این روش باید افراد متخصص را استخدام کنیم و معمولا از نظر هزینه ممکن است از Manual بیشتر باشد.

به طور کلی سه رویکرد در تست نرم افزار داریم

1. ؛ White Box Testing : معمولا ساختار و کدهای برنامه را تست میکنید و محدود به قسمت (Unit) از نرم افزار است که معمولا به نام های Glass Box , Clear Box ، Structural Testing هم معرفی میشود.

2. ؛ Black Box Testing :عکس White Box Testing ، بدون مشاهده به ساختار و کدهای ، عملکرد سیستم را مورد ارزیابی قرار میدهد. در Black Box به جزییات داخل سیستم و نحوه پیاده سازی کاری نداریم و طبق ورودی هایی که به سیستم میدهیم انتظار خروجی درست را داریم. به عنوان مثال تست های امنیتی در این بخش قرار دارند.

3. ؛ Grey Box Testing : ترکیبی از White Box Testing و Black Box Testing است .در Grey Box تستر با حداقل اطلاعات در مورد ساختار داخلی سیستم با دادن ورودی ها سعی در پیدا کردن خطا دارد.


به صورت خلاصه میتوان گفت

  • In White Box testing internal structure (code) is known
  • In Black Box testing internal structure (code) is unknown
  • In Grey Box testing internal structure (code) is partially known

معمولا بر اساس نیازی که از سیستم داریم تست های مختلفی میتوانیم انجام دهیم

1. ؛ Unit Testing : همان طور که از نام ان پیداست قابل تست کردن بر روی قسمت هایی از برنامه است (unit)که میتوان شامل توابع ،کلاس، public api و ... انجام میشود. در Unit Testing قسمت های مختلف سیستم را مستقل از هم تست میکنیم تا به جواب مطلوب برسیم.

2. ؛ Integration Testing : عکس Unit Testing که تست بر روی واحد های کوچک انجام میشوند ، در Integration Testing مجموعه ای از unitها که به عنوان ماژول شناخته میشوند را تست میکنیم میتوان گفت یک لایه بالاتر از unit test قرار دارد

3. ؛ System Testing :لایه بالاتر از Integration Testing قرار دارد و بر روی یک محصول کامل انجام میشود. طبق تعاریف گفته شده میتوان گفت System Testing در لایه Black Box قرار دارد و با ساختار داخلی نرم افزار کاری نخواهیم داشت.

4. ؛ Acceptance Testing : در بالاترین لایه قرار دارد و معمولا به عنوان نسخه بتا شناخته میشود. در این لایه سیستم جهت نیازمندی ها برسی میشود .


در این لینک می توانید 100 تست مربوط به نرم افزار را مشاهده کنید .
در این مقاله از Unit Testing استفاده خواهیم کرد.

تست نوشته شده اگر شرایط زیر را داشته باشد تست واحد نیست :

  • با دیتابیس ارتباط برقرار کند.
  • با شبکه ارتباط برقرار کند.
  • با فایل سیستم سر و کار داشته باشد. 4. برای اجرای آن نیاز به اعمال تنظیمات(افزودن یا تغییر فایل های کانفیگ) داشته باشید.

هدف از unit test :امروزه نرم افزار بزرگ ، بدون تست بی معنی و شکست خورده محسوب میشوند متاسفانه در شرکت های کوچک یا پروژه های شخصی با اینکه برنامه نویس از فواید تست نویسی اگاه است ترجیح میدهند تست نوشتن را بعد از کد نویسی انجام دهند که بیشتر مواقع انجام نمیشود و برنامه نویس به ترجیج میدهد زمانی را که صرف تست نویسی میکند بر روی توسعه پروژه انجام دهند! برای همین TDD ابداع شد که ما اول تست را می نویسیم بعد پیاده سازی را انجام میدهیم. در ادامه TDD را نیز مورد برسی قرار خواهیم داد.


چرا باید از unit testاستفاده کنیم :برای پروژه های متوسط به بالا عدم استفاده از تست نویسی باعث میشد زمانی را که برنامه نویس از تست نویسی غفلت کرده است بر روی خطا یابی و دیباگ کردن بگذارد وقتی ما برای پروژه خود تست مینویسیم اطمینان داریم هنگام تغییر یا اضافه کردن فیچر جدید پروژه از کار نمی افتد و اگر هر خطایی پیش بیاید در همان لحظه مطلع خواهیم شد.

مزایا unit test :

  • کاهش هزینه و زمان خطا یابی
  • تست نویسی نوعی داکیومنت نویسی محسوب میشود
  • جزو یکی از قوانین Clean Code میباشد
  • زمان ریفکتور کردن کدها به حداقل خواهد سید
  • و....

در مقاله بعدی Unit Tests به صورت یک مثال کاربردی پیاده سازی خواهیم کرد.


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

https://www.coffeete.ir/sobhan