انواع Test در سی شارپ

ما در سی شارپ 4 نوع تست برای کد ها داریم

  • تست واحد Unit Test
  • تست یکپارچه Integration Test
  • تست رابط کاربری یا End-To-End
  • تست خودکار

برای توسعه تست محور Test-Driven Development (TDD) دو روش وجود دارد

  • نوشتن کد بعد نوشتن تست codefirst (این روش برای تازه کارها و کسانی که در حال یادگیری نوشتن تست هستند میباشد)
  • دوم نوشتن تست و بعد نوشتن کد که در واقع TDD میباشد ابتدا تست نوشته میشود و سپس کد ها بر اساس تست نوشته میشود (red-green-refactor)

تست واحد Unit Test

Unit Test
Unit Test

نوشتن تست برای کلاس یا کلاس ها بدون وابستگی بطور مثال نوشتن تست برای کلاس x و متد های آن

قوت

سرعت اجرای سریع

ضعف

  • هرچه پروژه بزرگتر و پیچیده تر میشود زمان نوشت تست ها بیشتر میشود

تست یکپارچه Integration Test


Integration Test
Integration Test


Integration Test
Integration Test

نوشتن تست برای کلاس یا کلاس ها با وابستگی خارجی بطور مثال نوشتن تست برای کلاس x و متد های آن بطوری کد های درون کلاس x به کلاس Y وابسته باشد. این نوع تست باید طوری نوشته شود که کلاس y نیز تست شود. یا بطور مثال کلاس x به دیتابیس وابسته است(استفاده از داده های آزمایشی mock)

تست رابط کاربری یا End-To-End

این نوع تست به این صورت است که داده های تست باید توسط کاربر از طریق UI وارد و آزمایش (تست) شود.

قوت

  • داده ها به صورت دستی و توسط کاربر ثبت میشود (شبیه سازی برنامه نهایی)

ضعف

  • سرعت اجرای کند به دلیل اینکه برای هر بار تست باید برنامه اجرا شود
  • درصورت تغییر در UI باید تست هم تغییر کند مثلا input عددی به رشته ای تغییر کند

تست خودکار

این نوع تست ما کد را مینویسیم و function ها مستقیم فراخوانی میکنیم (صدا میزنیم) و با تایید (Verify) مقادیر مختلف مقدار درست را بر میگردانیم . تست خودکار تکرار پذیر است و در هر زمانی که کد تغییر دادیم یا هنگام ارسال به repository مثل git یا publish کردن می توانیم تست ها را اجرا کنیم . تمام تست کمتر از چند ثانیه اجرا خواهند شد.البته این نوع تست همان تست unit test می باشد توسط کتابخانه خارجی مانند Selenium به طور خودکار در میاید

قوت

اجرای مکرر تست ها در زمان کم

به دام انداختن باگ ها (Catch Bugs) قبل ازاستقرار برنامه

ریفکتور کردن با اطمینان (Refactoring) ریفکتور به معنای تغییر ساختار کد بدون تغییر در رفتار آن (مثلا تغییر نام یک متد یا جدا کردن بخشی از کد در یک متد جدید- تغییر ساختار برای تمیزتر کردن کد و قابلیت نگهداری بالاتر بدون تغییر عملکرد)


هرم تست بر اساس کارایی و میزان به کارگیری آن در یک پروژه

هرم تست
هرم تست


نحوه نام گذاری کلاس و متد های تست

برای کلاس ها

نام کلاسی که می خواهیم برای آن تست بنویسیم + کلمه Tests

MyClassTests

برای متد ها

نام متد + سناریو آن متد + رفتار مورد نظر متد و جدا کردن بخش ها با _

MyMethodName_Senario_ExpectedBehavior()

بطور مثال

CanBeCancelledBy_AdminCancelling_ReturnTrue()

CanBeCancelledBy_SameUserCancelling_ReturnTrue()

CanBeCancelledBy_AnotherUserCancelling_ReturnFalse()