هادی جهانگیری
هادی جهانگیری
خواندن ۳ دقیقه·۲ سال پیش

Unit test

در دنیای امروز و با پیشرفت صنعت نرم افزار تست نویسی یک از نیازمندی های هر پروژه ای می باشد تا بتواند به عمر خود ادامه دهد.

نکته : نداشتن تست خودکار در طولانی مدت می تواند باعث شکست نرم افزار ما شود اما بد تر از آن داشتن تست های بد می باشد.

به این عکس دقت کنید


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

هدف از Test : مهم ترین بخش یک تست هدفی است که تست بر مبنای آن نوشته می شود.

Code coverage :

متری است برای اندازه گیری کد های دارای تست.

عبارت است از تعداد خط های دارای تست تقسیم بر تعداد کل خط ها




Unit test چیست ؟

منظور از Unit یک واحد رفتاری (Behavior) است نه صرفا یک واحد از کد. در واقع ممکن است چند متد با همکاری یکدیگر یک رفتار را بروز دهند.

Unit test دارای سه ویژگی مهم می باشد

  • یک واحد را تست می کند.
  • تست یک واحد به صورت کاملا مجزا انجام می شود و باقی واحد ها را در گیر نمی کند.
  • این کار را سریع انجام می دهد.

SUT : به سیستمی که تست روی آن انجام می شود گفته می شود. مثلا یک کلاس

MUT : به متدی که تست روی آن انجام می شود گفته می شود.

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

1- Arrange : کلیه فعالیت های که برای ساخت SUT(System under test) انجام می شود.

2- Action : فعالیتی که نتیجه تست را به وجود می آورد. صدا زدن متدی که می خواهید تست کنید.

3- Assert : بررسی نتیجه حاصل شده با انتظارات ما

[Fact] public void Sum_When_pass_two_numbers_Then_return_sum_of_two_numbers() { //Arange var calculator = new Calculator(); var number1 = 2; var number2 = 3; var expectedSumValue = 5; //Action var result = calculator.Sum(number1, number2); //Assert Assert.Equal(expectedSumValue, result); }



Dependencies in test :

هر واحدی ممکن است برای اجرای خود به واحد های دیگر وابستگی داشته باشد. از آنجا که هدف Unit test تست کردن یک واحد به صورت کاملا مجزا می باشد بنابراین وابستگی ها را باید شبیه سازی کنیم که این کار با استفاده از Test double ها انجام می شود.

انواع Test double ها :

  • Dummy
  • Fake
  • Stub
  • Spies
  • Mocks

نکته : متدهای Private قابل تست نیستند و تست آن ها از تاثیر روی متدهای public انجام می شود.

نام گذاری تست ها :

نام گذاری همیشه یکی از مهم ترین قسمت ها در توسعه نرم افزار بوده و این موضوع در مورد تست ها بیشتر نیز صدق می کند. برای نام گذاری تست ها میتوان از پترن Given, When, Then استفاده کرد تا خوانایی تست ها را برای دیگر اعضای تیم مانند پروداکت اونر ها و ... نیز بالا ببرد.

به این مثال توجه کنید :


Given : EmailValidator
When: email_is_invalid
Then : throw_exception

دقت کنید نام تست باید در بردارنده هدف تست باشد.

تست ها بیان کننده یک فکت هستند بنابراین استفاده از کلماتی چون Should, must , ... آنتی پترن حساب می شوند.

نام تست ها می توان به عنوان قراردادی بین تیم تعریف شود. از جمله از بیشترین مدل های استفاده به شرح زیر می باشد.

  • EmailValidatorWhenEmailIsInvalidThenThrowException
  • EmailValidator_WhenEmailIsInvalid_ThenThrowException
  • EmailValidator_When_email_is_invalid_Then_throw_exception

پیشنهاد خود من گزینه آخر است زیرا خوانایی را برای خواننده بالا می برد.

unit testتست نرم افزارنرم افزار
شاید از این پست‌ها خوشتان بیاید