آموزش تست برنامه های رشته در همزمانی پایتون

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

آموزش تست برنامه های رشته در همزمانی پایتون

 

در این درس از مجموعه آموزش برنامه نویسی سایت سورس باران، به آموزش تست برنامه های رشته در همزمانی پایتون خواهیم پرداخت.

پیشنهاد ویژه : پکیج آموزش صفر تا صد پایتون

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

چرا تست کنیم؟

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

بهبود کیفیت نرم افزار

مطمئناً هیچ شرکتی نمی خواهد نرم افزاری با کیفیت پایین ارائه دهد و هیچ مشتری ای نمی خواهد نرم افزاری با کیفیت پایین خریداری کند. تست با یافتن و رفع اشکالات موجود در آن ، کیفیت نرم افزار را بهبود می بخشد.

رضایت مشتریان

مهمترین قسمت هر مشاغل رضایت مشتریان آنهاست. با ارائه نرم افزار بدون اشکال و کیفیت خوب، شرکت ها می توانند رضایت مشتری را کسب کنند.

تأثیر ویژگی های جدید را کاهش دهید

فرض کنید ما یک سیستم نرم افزاری از ۱۰۰۰۰ خط ساخته ایم و باید ویژگی جدیدی اضافه کنیم، تیم توسعه نگرانی در مورد تأثیر این ویژگی جدید بر روی کل نرم افزار را دارند. در اینجا نیز، تست نقش حیاتی دارد زیرا اگر تیم تستمجموعه خوبی از آزمایشات را انجام داده باشد، می تواند ما را از هرگونه وقوع فاجعه بار خلاص کند.

تجربه ی کاربر

مهمترین قسمت دیگر هر مشاغل تجربه کاربران آن محصول است. فقط تست می تواند اطمینان حاصل کند که کاربر نهایی استفاده از محصول را ساده و آسان می داند.

کاهش هزینه ها

تست می تواند با یافتن و رفع اشکالات در مرحله آزمایش توسعه ، هزینه کل نرم افزار را کاهش دهد نه اینکه آن را پس از تحویل برطرف کند. اگر بعد از تحویل نرم افزار یک اشکال عمده وجود داشته باشد ، این امر می تواند هزینه ملموس آن را از نظر هزینه ها و هزینه نامحسوس را از نظر عدم رضایت مشتری، اعتبار منفی شرکت و غیره افزایش دهد.

چه چیزی را تست کنیم؟

همیشه توصیه می شود دانش مناسبی در مورد آنچه باید تست می شود را داشته باشید. در این بخش، ما ابتدا می توانیم انگیزه اصلی تستر هنگام آزمایش هر نرم افزاری را درک کنیم. از پوشش کد ، به عنوان مثال ، هنگام تست، از چند خط کد که مجموعه تست ما وارد می کند، باید خودداری شود. به این دلیل است که ، هنگام تست، تمرکز فقط روی تعداد خطوط کد هیچ ارزش واقعی به سیستم ما نمی بخشد. ممکن است برخی از اشکالات وجود داشته باشد ، که بعداً در مرحله بعد حتی پس از استقرار منعکس می شوند.
نکات مهم زیر را در رابطه با آنچه باید آزمایش کنید در نظر بگیرید –
  • ما باید بر روی تست عملکرد کد تمرکز کنیم تا پوشش کد.
  • ابتدا باید مهمترین قسمتهای کد را تست کنیم و سپس به سمت قسمتهای کم کد برویم. قطعاً باعث صرفه جویی در وقت خواهد شد.
  • تست کننده باید دارای آزمایشات مختلفی باشد که بتواند نرم افزار را تا حد مجاز بالا ببرد.

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

با توجه به قابلیت استفاده از قابلیت واقعی معماری چند هسته ای، سیستم های نرم افزاری همزمان جایگزین سیستم های ترتیبی می شوند. در چند وقت اخیر، از برنامه های سیستم همزمان در همه موارد استفاده می شود، از تلفن های همراه گرفته تا ماشین لباسشویی ، از اتومبیل گرفته تا هواپیما و … در حال حاضر یک اشکال است ، پس از آن ما با چندین اشکال مواجه خواهیم شد.
تکنیک های آزمایش برای برنامه های نرم افزاری همزمان به طور گسترده ای بر روی انتخاب interleaving تمرکز دارند که الگوهای بالقوه مضر مانند race conditions، بن بست ها و نقض اتمی بودن را نشان می دهد. در زیر دو روش برای آزمایش برنامه های همزمان نرم افزار وجود دارد –

اکتشاف سیستماتیک

این رویکرد با هدف کشف فضای متقاطع تا حد ممکن گسترده است. چنین رویکردهایی می توانند یک تکنیک نیروی بی رحمانه را اتخاذ کنند و دیگران برای کاوش در فضای تلاقی ، از روش کاهش جزئی نظم یا تکنیک ابتکاری استفاده می کنند.

Property-driven

رویکردهای مبتنی بر املاک متکی به این نکته هستند که گسل های همزمانی به احتمال زیاد در زیر ردیف هایی رخ می دهد که خصوصیات خاصی مانند الگوی دسترسی حافظه مشکوک را نشان می دهد. رویکردهای مختلف مبتنی بر خاصیت، گسل های مختلفی مانند race conditions، بن بست ها و نقض اتمی را هدف قرار می دهند که این امر بیشتر به یک یا سایر خصوصیات خاص بستگی دارد.

استراتژی های تست 

استراتژی تست به عنوان رویکرد تست نیز شناخته می شود. این استراتژی نحوه آزمایش را مشخص می کند. رویکرد تست دارای دو تکنیک است –

فعالانه

روشی که در آن فرآیند طراحی تست در اسرع وقت آغاز می شود تا نقص ها را قبل از ایجاد سازه پیدا کرده و رفع کند.

واکنشی

روشی که در آن تست تا پایان روند توسعه آغاز نمی شود.
قبل از استفاده از هرگونه استراتژی یا رویکرد تست در برنامه پایتون ، ما باید یک ایده اساسی در مورد نوع خطاهایی که یک برنامه نرم افزاری دارد داشته باشیم. خطاها به شرح زیر است –

خطاهای نحوی

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

خطاهای معنایی

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

تست واحد

این یکی از پرکاربردترین استراتژی های تست برای آزمایش برنامه های پایتون است. این استراتژی برای آزمایش واحدها یا اجزای کد استفاده می شود. منظور ما از واحدها یا مولفه ها کلاسها یا توابع کد است. تست واحد با آزمایش واحدهای “کوچک” آزمایش سیستم های بزرگ برنامه نویسی را ساده می کند. با کمک مفهوم فوق ، آزمایش واحد ممکن است به عنوان روشی تعریف شود که در آن واحدهای منفرد کد منبع مورد آزمایش قرار می گیرند تا مشخص شود که آیا آنها خروجی مورد نظر را برمی گردانند.

واحد تست

اولین ماژول برای تست واحد ماژول unittest است. این از JUnit الهام گرفته شده و به طور پیش فرض در Python3.6 گنجانده شده است. این از اتوماسیون تست، به اشتراک گذاری تنظیمات و کد اتمام تست ها، تجمیع تست ها در مجموعه ها و استقلال آزمون ها از چارچوب گزارش پشتیبانی می کند.
در زیر چند مفهوم مهم پشتیبانی شده توسط واحد تست وجود دارد

فیکسچر متن

این برای تنظیم یک آزمون استفاده می شود تا قبل از شروع تست بتواند آن را اجرا کند و پس از پایان تست خراب شود. این ممکن است شامل ایجاد پایگاه داده موقت، دایرکتوری ها و غیره مورد نیاز قبل از شروع آزمون باشد.

مورد آزمایشی

مورد آزمایشی بررسی می کند که آیا پاسخ مورد نیاز از مجموعه خاصی از ورودی ها وارد می شود یا خیر. ماژول unittest شامل یک کلاس پایه به نام TestCase است که می تواند برای ایجاد موارد آزمایشی جدید مورد استفاده قرار گیرد. این شامل دو روش پیش فرض است –
  • ()setUp – یک روش قلاب برای تنظیم وسایل آزمایش قبل از تمرین. این تماس قبل از فراخوانی روشهای آزمون پیاده سازی شده است.
  • ()tearDown- یک روش قلاب برای از بین بردن پایه کلاس بعد از اجرای تمام تست های کلاس.

مجموعه تست

این مجموعه ای از مجموعه های آزمایشی، موارد تست یا هر دو است.

اجرای تست

این کار موارد آزمایشی یا کت و شلوارها را کنترل می کند و نتیجه را به کاربر ارائه می دهد. این ممکن است از رابط کاربری گرافیکی یا رابط متن ساده برای ارائه نتیجه استفاده کند.

مثال

برنامه پایتون زیر از ماژول unittest برای تست ماژولی به نام فیبوناچی استفاده می کند. این برنامه در محاسبه سری فیبوناچی از یک عدد کمک می کند. در این مثال، ما یک کلاس به نام Fibo_test ایجاد کرده ایم، تا موارد آزمایشی را با استفاده از روش های مختلف تعریف کنیم. این متدها از unittest.TestCase به ارث می رسند. ما از دو روش پیش فرض استفاده می کنیم – ()setUp  و ()tearDown. ما همچنین روش testfibocal را تعریف می کنیم. نام تست باید با حزف test شروع شود. در بلوک نهایی ، ()unittest.main  یک رابط خط فرمان برای اسکریپت تست فراهم می کند.
import unittest
def fibonacci(n):
   a, b = 0, 1
   for i in range(n):
   a, b = b, a + b
   return a
class Fibo_Test(unittest.TestCase):
   def setUp(self):
   print("This is run before our tests would be executed")
   def tearDown(self):
   print("This is run after the completion of execution of our tests")

   def testfibocal(self):
   self.assertEqual(fib(0), 0)
   self.assertEqual(fib(1), 1)
   self.assertEqual(fib(5), 5)
   self.assertEqual(fib(10), 55)
   self.assertEqual(fib(20), 6765)

if __name__ == "__main__":
   unittest.main()
وقتی از خط فرمان اجرا می شود، اسکریپت فوق خروجی تولید می کند که به این شکل است –

خروجی

This runs before our tests would be executed.
This runs after the completion of execution of our tests.
.
----------------------------------------------------------------------
Ran 1 test in 0.006s
OK

 

اکنون، برای شفاف سازی آن، ما در حال تغییر کد خود هستیم که به تعریف ماژول فیبوناچی کمک می کند.
بلوک کد زیر را به عنوان مثال در نظر بگیرید –
def fibonacci(n):
   a, b = 0, 1
   for i in range(n):
   a, b = b, a + b
   return a
چند تغییر در بلوک کد همانطور که در زیر نشان داده شده است –
def fibonacci(n):
   a, b = 1, 1
   for i in range(n):
   a, b = b, a + b
   return a

 

اکنون پس از اجرای اسکریپت با کد تغییر یافته، خروجی زیر را خواهیم گرفت –
This runs before our tests would be executed.
This runs after the completion of execution of our tests.
F
======================================================================
FAIL: testCalculation (__main__.Fibo_Test)
----------------------------------------------------------------------
Traceback (most recent call last):
File "unitg.py", line 15, in testCalculation
self.assertEqual(fib(0), 0)
AssertionError: 1 != 0
----------------------------------------------------------------------
Ran 1 test in 0.007s

FAILED (failures = 1)
خروجی فوق نشان می دهد که ماژول نتوانسته است خروجی مورد نظر را ارائه دهد.

ماژول Docktest در تست برنامه های رشته در همزمانی پایتون

ماژول docktest  همچنین در تست واحد کمک می کند.. استفاده از ماژول واحد تست آسان تر است. ماژول unittest بیشتر برای آزمونهای پیچیده مناسب است. برای استفاده از ماژول doctest ، باید آن را وارد کنیم.  تابع مربوطه باید دارای جلسه تعاملی پایتون همراه با خروجی های آنها باشد.
اگر همه چیز در کد ما خوب باشد، از ماژول docktest هیچ خروجی وجود ندارد. در غیر این صورت، خروجی را فراهم می کند.

مثال

مثال زیر پایتون از ماژول docktest برای تیت ماژولی به نام Fibonacci استفاده می کند ، که به محاسبه سری Fibonacci یک عدد کمک می کند.
import doctest
def fibonacci(n):
   """
   Calculates the Fibonacci number

   >>> fibonacci(0)
   ۰
   >>> fibonacci(1)
   ۱
   >>> fibonacci(10)
   ۵۵
   >>> fibonacci(20)
   ۶۷۶۵
   >>>

   """
   a, b = 1, 1
   for i in range(n):
   a, b = b, a + b
   return a
      if __name__ == "__main__":
   doctest.testmod()

 

می توانیم ببینیم که docstringمربوط به تابع مربوطه به نام fib دارای جلسه تعاملی پایتون همراه با خروجی ها است. اگر کد ما خوب باشد، هیچ خروجی از ماژول doctest وجود ندارد. اما برای دیدن نحوه کار می توانیم آن را با گزینه –v اجرا کنیم.

(base) D:\ProgramData>python dock_test.py -v
Trying:
   fibonacci(0)
Expecting:
   ۰
ok
Trying:
   fibonacci(1)
Expecting:
   ۱
ok
Trying:
   fibonacci(10)
Expecting:
   ۵۵
ok
Trying:
   fibonacci(20)
Expecting:
   ۶۷۶۵
ok
۱ items had no tests:
   __main__
۱ items passed all tests:
۴ tests in __main__.fibonacci
۴ tests in 2 items.
۴ passed and 0 failed.
Test passed.

 

اکنون، کدی را که در تعریف ماژول فیبوناچی کمک کرده است تغییر خواهیم داد
بلوک کد زیر را به عنوان مثال در نظر بگیرید –
def fibonacci(n):
   a, b = 0, 1
   for i in range(n):
   a, b = b, a + b
   return a

 

بلوک کد زیر به تغییرات کمک می کند –
def fibonacci(n):
   a, b = 1, 1
   for i in range(n):
   a, b = b, a + b
   return a

 

پس از اجرای اسکریپت حتی بدون گزینه –v ، با کد تغییر یافته ، مطابق شکل زیر خروجی دریافت خواهیم کرد.

خروجی

(base) D:\ProgramData>python dock_test.py
**********************************************************************
File "unitg.py", line 6, in __main__.fibonacci
Failed example:
   fibonacci(0)
Expected:
   ۰
Got:
   ۱
**********************************************************************
File "unitg.py", line 10, in __main__.fibonacci
Failed example:
   fibonacci(10)
Expected:
   ۵۵
Got:
   ۸۹
**********************************************************************
File "unitg.py", line 12, in __main__.fibonacci
Failed example:
   fibonacci(20)
Expected:
   ۶۷۶۵
Got:
   ۱۰۹۴۶
**********************************************************************
۱ items had failures:
   ۳ of 4 in __main__.fibonacci
***Test Failed*** 3 failures.

 

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

 

منبع.

لیست جلسات قبل آموزش همزبانی در پایتون

  1. آموزش همزمانی در برنامه نویسی پایتون
  2. آموزش همزمانی در برنامه نویسی پایتون _ مقدمه
  3. آموزش معماری سیستم و حافظه در برنامه نویسی پایتون
  4.  آموزش رشته ها در همزمانی پایتون 
  5. آموزش پیاده سازی رشته در همزمانی پایتون
  6. آموزش همگام سازی رشته ها در همزمانی پایتون
  7. آموزش ارتباط رشته ها در همزمانی پایتون
0
برچسب ها :
نویسنده مطلب erfan molaei

دیدگاه شما

بدون دیدگاه