مقدمه ای بر تست نویسی

تست؟فرایند تست برای یک سیستم نرم افزاری، یعنی Verify کردن رفتار اون نرم افزار با استفاده از یک نرم افزار دیگر!. یعنی چی؟ یعنی یک قطعه کدی، منحصرا نوشته می شود که تنها وظیفه اش این است که یک قطعه کد دیگری را فراخوانی و اجرا کند،و صحت رفتارش را بر اساس یک سری معیارهای مشخص شده، تایید یا عدم تایید کند.به این فرایند تست میگویند که خود تست انواع مختلفی دارد، که هر نوعش، اهداف مختلفی را پوشش میدهد.به طور کلی رفتار یک سیستم نرم افزاری، از دو مدل بررسی میشه:رفتار Functionality که یک نرم افزار داره چه کاری انجام میده.رفتار None-Functionality که پیرامون مسائل پرفرمنسی اون نرم افزار هست که چه قدر خوب عمل میکنه. انواع تست های نرم افزاری1- یونیت تست(Unit test)ساده ترین لول تست، یونیت تست است. یعنی رویکردی که اجزای یک سیستم به خودی خود و فارغ از نحوه ارتباطشان با اجزای بیرونی به خوبی عمل میکنند یا نه. در یونیت تست، ما به اینکه کل یک نرم افزار درست کار میکند یا نه، کار نداریم.بلکه برای هر جز، مستقلا یک تست مینویسیم. مثلا برای یک متد که کارش جمع دو عدد صحیح است، یک تست مینویسید. این یونیت تست کار ندارد که آیا یک نرم افزار ماشین حساب که این متد در آن فراخوانی شده، درست کار میکند یا نه. وظیفه اش فقط و فقط تست همان یک متد است.2- اینترگیشن تست (Integration Test)اینترگیشن تست، در واقع تست یکپارچه است که یک کد رو تست و خروجی های اون یا ورودی کد دیگری میشه یا کد دیگری مستقل از خروجی کد اول فراخوانی میشه و به همین ترتیب یک سری توالی کد ها فراخوانی میشوند و نتیجه تست در نهایت در سطح کل این توالی بررسی میشود که آیا صحیح بود یا نه.3- اکسپتنس تست (Acceptance Test)که بهش یوزر تست هم میگن که تست از نگاه مشتریه. یعنی چی؟ یعنی یک نرم افزاری نوشته شده، خطا هم نداره و مشکلی هم نیست ولی مشتری اون رو نمیپذیره چون نیازش رو ساپورت نمیکنه یا نیازهایی که در اول طراحی مطرح کرده، به عنوان خروجی نمیبینه.4- لود تست (Load Test)جزو تست های None-Functionality یک نرم افزار هست و هدف اش چیه؟ هدف اش اینه که ببینه اون نرم افزار یا اون قطعه کد زیره بار شدید و اگر لود بالایی بهش وارد بشه، باز هم آیا میتونه خروجی صحیحی بده، و اصلا خروجی میتونه بده یا نه.5- پرفورمنس تست (Performance Test)این با لود تست فرق داره. در Load Test، نگاه اینه که پرفورمنس تست اوکی شده!، حالا با لود بالا میاد ببینه اون پرفورمنسه برآورده میشه یا نه.توی پرفومنس تست، ما برای یک عملیات یک معیاری را قرار میدهیم.مثلا این متد من اگر یک بار صدا زده بشه، باید زیره 5 ثانیه خروجی بده. این میشه پرفورمنس تست. لود تست میگه خیلی خب اگر پرفورمنس اوکی بودی، حالا میتونی برای 10 هزاربار کال شدن هم خروجی زیره 5 ثانیه بدی یا نه؟6- استرس تست(Stress Test)این تست با لود تستینگ معمولا ترکیب میشه. یعنی شرایط حساس و نکات حساسی رو در زمان تست در نظر میگیره.مثلا یک دیتابیس Fail over یک دیتابیس دیگه باشه. این استرس تست، با اون لود بالا حالا چی میشه.در واقع معیار استرس تست، اینه که شرایط خیلی خاص و استثنا هم در لود تستینگ مورد بررسی قرار بگیره.7- اسموک تست (Smoke Test)این برای بعد از ریلیز یک نرم افزاره. یعنی تست هایی که وقتی یک سیستمی در محیط عملیاتی Release شد براش اجرا میشه که ببینه آیا انتشار نرم افزار اوکی بوده و کلیات سیستم درست عمل میکنه یا نه.هرم تست یا Test pyramidما یک اصطلاحی داریم تحت عنوان هرم تست و اون یعنی شما وقتی برای یک نرم افزاری آغاز به تست نویسی میکنید چه گام هایی رو باید سلسله مراتبی بردارید.این هرم در واقع نسبت تست ها به همدیگر را نشان میدهد. در واقع من حجم بسیار زیادی Unit test دارم به نسبت Integration test و به همین ترتیب حجم بیشتری نسبت به E2E. ایده این هرم بر این استواره که میگه تست هایی که سریع تر اجرا می شوند یعنی یونیت تست ها، باید به نسبت تست هایی که بزرگتر و کند تر اجرا می شوند در یک نرم افزار بیشتر باشد.اصطلاحات تست1- اس یو تی(SUT : System Under Test)همیشه در یک نگاه، یک نرم افزار یکی است. در صورتیکه اینجوری نیست و در واقع ترکیبی از اجزا است که هر جز اش مستقله.SUT در واقع واحد هدف تست ماست. در یک یونیت تست، شما یک کلاس رو تست میکنید.SUT شما میشه اون کلاس. در اینترگیشن تست، ممکنه n کلاس رو دارید تست میکنید. پس SUT شما الان فرق کرده و شده اون n تا کلاس. در واقع این اصطلاح برای اشاره به هدف تست به کار میره.2- فیکسچر (Fixture)بهش تست فیکسچر هم میگن. هر آنچیزی که باید وجود داشته باشد که ما بتوانیم یک SUT را تست کنیم.اون ها همه میشن فیکسچر. مثلا من میخوام کلاس همکاران را تست کنم. پس باید اول یک شی از اون کلاس new بکنم که بتونم متد مثلا Save اش رو تست کنم. یا باید فلان داده رو از فلان جدولی بخونم که به این متد پاس بدم. اون شی ئه، اون متغیره که همه پیش نیازهای تست کلاس همکار هستند، میشن Fixture های تست شما.نکته : در تست نویسی ما سه گام اصلی داریم. که اینها هم یک جور اصطلاح هستند.در گام نخست، Arrange رو داریم که میشه آماده کردن فیکسچرها و ماک کردن یک سری اطلاعات برای آغاز تست.یک گام Act داریم که در واقع فراخوانی اون متدی که قراره تست بشهو یک گام Assert داریم که میشه چک کردن ریزالت با اون انتظاری که داریم.با اون معیاری که ملاک Fail کردن یا Success کردن یک تست هست برامون.3- تست متد (Test method)سناریو تست. بهش میگن تست متد. معمولا تست متدها رو ما با یک سری فریم ورک مینویسیم که برای دات نت مشهورترین و قویترینش XUnit.NET هست. در واقع فریم ورک هایی مثل XUnit ابزارهایی رو برای تست نویسی در اختیار ما میگذارند. مثلا attribute ای به اسم Fact در بالای یک متد، معرف اینه که این متد، یک تست متده.یک مثال ساده بزنم. یک متدی در یک کلاسی نوشتید که کارش تقسیم کردنه. حالا من میخوام برای این متد تست بنویسم. یک سناریو دارم، تقسیم صحیح بر صحیح. میخوام ببینم این متده تقسیمی که من نوشتم، درست انجام میده این نوع تقسیم رو. پس یک تست متد مینوسم که با یک سری attribute بالای متدم به دات نت میفهمونم این یک تست متده. و داخل اون متد، توش فیکسچرهای تست صحیح بر صحیح رو ایجاد میکنم و متد اصلیه رو باهاش کال میکنم و بعد هم ریزالت اش رو چک میکنم. حالا یک سناریو دیگه دارم تقسیم فلوت بر صحیح. این میشه یک تست متد دیگه و به همین ترتیب.نکته : یک مجموعه از تست متد ها، که بهم مرتبط هستند، تست کلاس رو میسازند.(حالا روش ها و دیدگاه های مختلفی برای دسته بندی تست کلاس ها وجود دارد.)4- تست فریم ورک (Test framework)یک سری کتابخانه در زبان های مختلف، که ما برای نوشتن تست ازشون استفاده میکنیم.مثلا توی جاوا SUnit داریم.JUnit داریم.باز برای دات نت فریم ورک هایی مثل NUnit داریم.XUnit داریم و ...5- تست رانر(Test runner)ابزاری که تست های نوشته شده رو در یک فریم ورک، اجرا میکنه. البته خیلی از تست فریم ورک ها، خودش کتابخانه هایی هم برای ران کردن تست دارند. ولی خب مثلا Resharper میتونه تست های نوشته شده با Xunit رو ران کنه. خود XUnit که یک فریم ورکه، باز رانر خودشم داره. XUnit Runner.نکته : رانرها دو مدل هستند. یا گرافیکی هستن که بهش میگن Graphical یا کامند لاین هستند.6- اَزرشن متد (Assertion method)این متدیه که توی تست قراره عمل Verification رو انجام بده. در واقع متدی که اون نتیجه مورد نظر رو مقایسه میکنه که ببینه خروجی تست متد، باهاش همخوانی داره یا نه.کتابخانه هایی که ابزارهای تست رو در اختیار ما میگذارند، متدهایی هم دارند که عمل Assertion رو انجام میده. مثلا Assert.Equal یا Assert.Should().Be و اینطوری کاره برنامه نویسان رو بسیار راحت تر میکنند.7- دی او سی (DOC : Depend On Component)وابستگی های یک کلاس به کلاس دیگر در زمان تست، یا سرویس یا ریپازیتوری که SUT ما بهش وابسته است رو میگن DOC.