Drcain ۱ دیدگاه

تست سنتی و کلاسیک! 

اکثر برنامه نویس ها از طریق یک پرینت ساده به تست متد و فانکشن ها میپردازند مثلا در مثال قبلی به   خروجی 8 میرسند و به نظر درست میاید ولی چند مشکل دارد

  •   برای اتومات کردن تست نرم افزار کار سخت است و هم چنین برای تست تابع های مختلف
  • به ما خروجی موفق و نا موفق را نمی گوید.
  • نگه داری آن ها در برنامه ممکن است ما را دچار مشکل کند.

پس برای همین است که سراغ Unit test  می رویم.

 

 

 

 

فریم ورک یونیت تست

فریم ورک یونیت تست پایتون، گاهی اوقات با نام “PyUnit”، یک ورژن زبان پایتون از Junit است که توسط کنت بک و اریک گاما نوشته شده است. جی یونیت نیز یک تست فریم ورک ساده در زبان جاوا است.

یونیت تست از ویژگی های مختلفی پشتیبانی میکند مانند automation، setup و shutdown  (همانند setup teardown در جی یونیت)  و اگریگیت  کردن تست ها در کالکشن ها.

یونیت تست برای سادگی کار، متد ها و کلاس هایی را نیز در اختیار میگذارد که تست های زیادی را به راحتی انجام دهیم.

مثال

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

4 تابع جمع، تفریق، ضرب و تقسیم و نیز یک اکسپشن تقسیم صفر در تابع تقسیم

 

در کلاس تست، یونیت تست دات تست کیس را به ارث میبریم. (قبل از آن کد ماشین حساب و فریم ورک یونیت تست را ایمپورت میکنیم)

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

کد روبرو نیز برای اجرای راحت تر استفاده میشود

if __name__ == ‘__main__’:

    unittest.main()

  (بدون آن باید از -m unittest استفاده کرد)

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

برای مثال فرض کنید تابع جمع خوب 10 با 5 برابر 14 است  و تابع کم خو 10 با 5 برابر 6

 self.assertEqual(calc.addkhob(10, 5), 14)

self.assertEqual(calc.subtractkhob(10, 5), 6)

تغییرات روبرو را انجام میدهیم(تابع های مربوط در ماشین حساب را نیز تغییر میدهیم)

خروجی را در  میبینیم.

انتظارمان از تابع اددخوب 14 بود ولی 15 خروجی داد و همین طور برای سابترکت خوب که 5 است.

در نهایت 2 تابع فیل شدند.

همین روال در صورت خروج ارور نیز قابل مشاهده است مانند شکل زیر

 

بعضی از ارورها را میتوان با اکسپشن ها هندل کرد  مثلا در تابع تقسیم

raise ValueError(‘Can not divide by zero!’)

  را داشتیم. که در حالت عادی با اسرت ایکوال به ارور میخوریم درصورتی که برنامه کاملا درست است!

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

که مانند حالت درست پیام Ok را نمایش میدهد.

with self.assertRaises(ValueError):

            calc.divide(10, 0)

 

اگر ارور ریز نشود طبیعتا AssertionError: ValueError not raised را خواهیم داشت.

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

موفق باشید

— One Comment —

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *