برنامه نویسیجاوامیم تک 7

معرفی تست واحد یا Unit Testing + آموزش مقدماتی junit

معرفی تست واحد یا Unit Testing + آموزش مقدماتی junit

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

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

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

Unit testing از دسته ی تست های عملکرد است  و معادل فارسی آن ” تست واحد ” می باشد. زمانی که از تست واحد استفاده می کنیم برای یک بخش کوچک از برنامه مثلا یک متد یا یک کلاس تست می نویسیم. این تست ها باید بلافاصله  بعد از نوشتن هر بخش انجام شود و نباید تا انتهای برنامه برای نوشتن تست ها صبر کرد. نوشتن این تست از وظایف شخص برنامه نویس و نه تیم تست برنامه می باشد. این دسته تست ها را با xUnit می شناسیم  . دو نوع cppUnit و JUnit برای زبان های ++C و java می باشد.

ما معمولا به صورت سنتی unit testing انجام می دهیم مثلا زمانی که بخشی از کد را درون تابع  main تست می کنیم در واقع unit testing انجام می دهیم. ولی انجام این تست به صورت سنتی ضعف هایی دارد. به طور مثال  می توان به پاک کردن کد بعد از اجرای تست  و در نتیجه ی از بین رفتن تست،عدم اجرای چند کد تست به صورت همزمان وبررسی صحت خروجی به صورت چشمی  اشاره کرد. اما با استفاده از junit یک بار کد تست را می زنیم و بعد از هر بار تغییر کد اصلی باز هم می توانیم از همین کد تست استفاده کنیم. همچنین می توانیم چند بخش از کد را به صورت همزمان تست کنیم. اجرا و تشخیص نتیجه ی آزمون در این روش به صورت خودکار می باشد.

روال انجام تست در junit

در این روش ما برای بررسی منطق درست اجرای تکه برنامه ها توابع تست می نویسیم. توابع تست را با حاشیه “@Test” تعیین می کنیم. هر تابع تست یک نمونه آزمون (test-case ) نامیده می شود .روال این توابع به این صورت است که  داده ای را به عنوان ورودی تعیین می کنیم سپس آن داده را به قطعه برنامه‌ای که می‌خواهیم تست  کنیم می‌دهیم و بعد آن خروجی حاصل را با خروجی مورد انتظارمان تطبیق می‌دهیم. اگر اجرای تست موفقیت آمیز باشد، تست pass و در غیر این صورت fail شده است. برای تطبیق خروجی حاصل از عملیات با خروجی مورد انتظارمان سری توابعی با نام assertion وجود دارد که آن ها را به صورت خلاصه در جدول زیر توضیح داده ام :

توابع assertion

در همه ی این توابع assertion زمانی که فرض مورد نظر برقرار نباشد، اجرا تست همان جا متوقف شده و موجب  fail شدن test case می شوند .

مثال استفاده از توابع assertion :

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

فرض کنیم کلاسی داریم که عملیات ضرب و تقسیم را انجام می دهد. می خواهیم برای تست توابع این کلاس از junit استفاده کنیم. در ادامه کد کلاس آمده است :

اگر بخواهیم تابع تقسیم این کلاس را تست کنیم، می توانیم تابع تست زیر را بنویسیم .

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

تمامیه موارد توضیح داده شده را در کد زیر می بینید :

Junit امکاناتی برای کنترل زمان اجرای یک تابع ، کنترل خطا ها ،  نوشتن توابع تست با پارامترهای ورودی و … دارد. برای یاد گیری بیشتر توصیه میکنم به آدرس  : https://github.com/junit-team/junit4/wiki  مراجعه کنید.

ارسال پاسخ