چرا تست واحد؟

تست واحد چیست؟

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

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

وجود تست واحد، کدخوانی و refactoring ( ویرایش متد طوری که رفتار اصلی آن متد تغییری نکند) را تسهیل می بخشد. بهترین مستندات کدهای تولید شده، تست های واحد ما هستند. برای مثال می خواهید NHibernate را یاد بگیرید. برای این پروژه بیش از ۱۰۰۰ تست واحد نوشته شده است و این تست ها نحوه ی کارکرد تمام قسمت های آن را شرح داده اند که با مطالعه همین تست ها می توانید NHibernate را یاد بگیرید.

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

تست های واحد نباید به عوامل خارجی وابسته باشند و اگر این وابستگی وجود داشته باشد دیگر آن تست واحد نیست بلکه تست مجتمع شده یا integrated test خواهد بود. برای حل این مشکل می توان از فریم ورک های moq استفاده کرد.

پس می توانید جواب این سوال را بدهید چرا باید تست واحد انجام دهیم؟

  1. تست واحد این می باشد که ما بعد از اضافه کردن یک واحد به نرم افزار می خواهیم از صحت عملکرد آن مطمئن شویم.
  2. کاهش زمان و هزینه ای است که باید صرف اشکال زدایی شود.
  3. می توانید چندین تست را در کمترین زمان ممکن اجرا کنید تا از صحت عملکرد تمام قسمت های نرم افزار اطمینان حاصل کنید.

مزایا:

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

  1. تست های واحد مانند سند های اجرایی می باشند که نشان می دهند که کدهای نوشته شده در شرایط مختلف چگونه عمل می کنند؟
  2. تست ها انتظارات توسعه دهنده نرم افزار را در مورد کارایی کد هایش ارزیابی می کند.
  3. کامپایل شدن کد دلیل بر صحت عملکرد کد نمی باشد. به شما پول نمی دهند که کد بنویسید پول می دهند که کد قابل اجرا داشته باشید.
  4. نوشتن تست واحد باعث می شود که کدهای با کیفیت بالا و تمیزی در دراز مدت داشته باشید.
  5. تست های نوشته شده در آینده تبدیل به اسناد مهمی درباره چگونگی کارکرد قسمت های مختلف نرم افزار خواهند شد.

حد و مرز یک تست واحد کجاست؟

تست شما تست نخواهد بود اگر:

  • با پایگاه داده در ارتباط باشد
  • با شبکه در ارتباط باشد
  • با فایل ها کار کند
  • نیاز به تمهیداتی از قبیل وجود یک فایل config برای اجرای تست باشد

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

تفاوت تست واحد و تست پذیرش:

  1.  تست واحد توسط برنامه نویس ها تعریف می شود اما تست پذیرش توسط مشتری ها یا مصرف کنندگان تعریف می شود.
  2. تست واحد یک تست سطح پایین به شمار می رود اما تست پذیرش سطح بالا می باشد.
  3. تست پذیرش کل برنامه را مورد آزمایش قرار می دهد اما تست واحد، واحد های کوچک سیستم را مورد بررسی قرار می دهد.
  4. تست پذیرش ممکن است طولانی باشد اما تست واحد کوتاه و سریع می باشد.
  5. تست واحد به صورت خودکار و با برنامه نویسی قابل کنترل است اما تست پذیرش معمولا به صورت دستی یا توسط یک سری اسکریپت نویسی انجام می شود.

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

NUnit: یک فریم ورک منبع باز است که از دنیای جاوا وارد Net. شده است که در وب می توان مستندات و مثال های زیادی را پیدا کنید.

MbUnit: یک فریم ورک با قابلیت توسعه پذیری بالا است که از فریم ورک های تست واحد دات نت به شمار می رود و نسخه ۳ بتا آن از سال ۲۰۰۷ منتشر شد و آخرین نسخه آن هم درحال حاضر ۳٫۳ می باشد. این فریم ورک نسبت به NUnit از جهاتی پیشرفته تر است برای مثال در هنگام انجام تست واحد بر روی پایگاه داده، به صورت خودکار رکوردهایی که در زمان تست ایجاد شده اند را حذف می کند و پایگاه داده را به حالت اولیه باز می گرداند.

CsUnit: یک فریم ورک منبع باز می باشد و رایگان است که تمام ویژگی های یک فریم ورک تست را دارد. با تمام زبان های برنامه نویسی دات نت هم سازگاری دارد و شامل ابزار GUI، پلاگین ویژوال استودیو و خط فرمان برای اجرای تست ها است.

xUnit: فریم ورک منبع باز است که به توسعه دهندگان این اجازه را می دهد تا از متدولوژی TDD براحتی استفاده کنند. (متدولوژی TDD به این صورت است که اول تست نوشته می شود و بعد بر اساس آن تست کد نوشته می شود)

MS Unit Test: محصول مایکروسافت است برای انجام تست های واحد در دات نت که در نسخه های Team System ویژوال استودیو ۲۰۰۵ به بعد منتشر شد. تست هایی که با این فریم ورک ساخته می شوند به صورت مستقیم در ویژوال استودیو  و یا با ابزار MSTest.exe از خط فرمان می توانند اجرا شوند.

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

بعضی ها بر این تصور هستند که باید تست را بعد از نوشتن کدها نوشت که یک سری معایبی برای آن وجود داشت که یکی از معایب مهم آن بی حوصلگی و عدم تمایل برای تست است و از همه مهمتر مستند نشدن صحیح فرآیند کدنویسی است. برای حل این مشکل مفهومی با عنوان Test Driven Development یا TDD مطرح شد. همانطور که توضیح خیلی کوتاهی درباره TDD دادم در این روش شما ابتدا تست را می نویسید و سپس کدنویسی می کنید. شاید برای شما کمی عجیب باشد اما همان مثالی که در مورد مدار الکتریکی زدم به این فکر کنید که اگر مدار ساخته میشد و بعد تست می کردید بهتر بود یا اول IC ها یا قطعات را تست می کردید و بعد مدار را می بستید؟ خوب معلومه روش دوم بهتر بود. مراحل TDD به این صورت است نوشتن تست، نوشتن کدها، Refactor کردن کد و سپس نوشتن تست بعدی.

حال برای نوشتن اینگونه تست به این صورت عمل می کنیم:

  1. اول تستی را برای متدی مثلا تقسیم دو عدد می نویسیم که تست ما fail شود.
  2. کدهای خود را به گونه ای می نویسیم که تست های مار را پاس کنند.
  3. پس از اینکه تست پاس شد تست بعدی را برای کدمان می نویسیم.

و همینطور الی آخر.

۵ دیدگاه به ثبت رسیده است .

  1. احسان قنبری می‌گه:

    بسیار زیبا و مفید آرش عزیز ، استفاده کردم، مرسی

  2. با تشکر از مطلب خوب ات. واقعا نیاز هست که در فضای توسعه فارسی بسیار بیشتر بر روی این قضیه کار بشه

مشترک خبرنامه شوید

  • RSS
  • Delicious
  • Digg
  • Facebook
  • Twitter
  • Linkedin
  • Youtube

نقش مدیر تضمین کیفیت

نقش مدیر تضمین کیفیت در چابک چیست؟ آیا ما واقعا ...

چگونه وارد کار تست ن

مثل همه ی کارها، کار تست نرم افزار و انتخاب ...

ابزارهای مفید برای ت

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

BDD Best Practice

معرفی BDD BDD یا توسعه رفتار محور یک متدولوژی است برای ...

Agile Test Strategy

در محیط چابک یا agile، جایی که ما روی اسپرینت ...