تست نویسی در پایتون – انواع روش ها + مثال عملی


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

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

انواع تست در پایتون
در ادامه، برخی از مهمترین استراتژیها و روشهای تست نویسی در پایتون را فهرست کردهایم.
- «یونیتتست» (Unit Testing)
- «تست یکپارچگی (Integration Testing)
- «تست عملکردی» (Functional Testing)
- «تست پذیرش» (Acceptance)
- «تست اکتشافی» (Exploratory Testing)
فریمورک های تست نویسی در پایتون
از فریمورکهای یونیتتست در پایتون میتوان به موارد زیر اشاره کرد.
- فریمورک Unittest
- فریمورک Pytest
- فریمورک Nose2
- کتابخانه Doctest
- کتابخانه Testify
- فریمورک Robot
در ادامه مطلب، روشهای تست نویسی در پایتون را دقیقتر بررسی میکنیم.
یادگیری کتابخانه های پایتون با فرادرس
پایتون یکی از محبوبترین زبانهای برنامهنویسی کنونی محسوب میشود که رفتهرفته طرفداران بیشتری را نیز به خود جذب میکند. یکی از نقاط قوت این زبان وجود کتابخانهها و فریمورکهای متعدد بهخصوص برای تستنویسی است که به برنامهنویسان کمک میکند تا اپلیکیشنها خود را سریعتر و بهینهتر توسعه دهند. این کتابخانهها طیفی وسیعی از موضوعات، از توسعه وب و طراحی رابط گرافیکی برنامهها گرفته تا علم داده، هوش مصنوعی، بازیسازی و غیره را در بر میگیرند.
برای یادگیری کتابخانههای پایتون راههای زیادی مانند مطالعه مستندات رسمی، مشاهده ویدیوهای آموزشی، شرکت در کارگاههای آموزشی و غیره وجود دارد که میتوانید از آنها بهرهمند شوید. اما اگر به دنبال راهی بهینه و سریع برای یادگیری این کتابخانهها هستید، مشاهده فیلمهای آموزشی را به شما توصیه میکنیم. این نوع منابع که توسط اساتید مجرب و با کیفیتی بالا تهیه شدهاند به شما امکان میدهند تا مفاهیم گوناگون را در مدتزمانی بهینه و با صرف هزینهای معقول یاد بگیرید. مجموعه فیلمهای آموزش کتابخانههای پایتون مقدماتی تا پیشرفته از فرادرس شامل بسیاری از همین فیلمهای آموزشی است که در ادامه میتوانید به آن دسترسی داشته باشید.

عناوین برخی از فیلمهای موجود در این مجموعه را در ادامه فهرست کردهایم.
- فیلم آموزش طراحی استایل Terminal با Rich در پایتون + گامبهگام و عملی از فرادرس
- فیلم آموزش ساخت چتبات در پایتون با ChatGPT از فرادرس
- فیلم آموزش ساخت نرم افزارهای گرافیکی دسکتاپ با PySide6 در پایتون + پروژههای کاربردی از فرادرس
- فیلم آموزش فرکتالهای مجموعه ژولیا و پیادهسازی در OpenCV از فرادرس
- فیلم آموزش ساخت داشبورد هوش تجاری با Streamlit – پروژه عملی + گواهینامه از فرادرس
- فیلم آموزش میکروفریمورک فلسک در پایتون – طراحی وب اپلیکیشن با Flask از فرادرس
تست واحد
در روش تستنویسی «یونیتتست» (Unit Testing) که به آزمون واحد هم شناخته میشود، واحدها یا اجزای برنامه که کوچکترین قسمتهای تشکیل دهنده کدهای آن از جمله توابع یا متدها هستند را بهصورت جداگانه تست میکنیم تا مطمئن شویم که بهدرستی و همانطور که از آنها انتظار داریم کار میکنند.
استفاده از این استراتژی تست نویسی در پایتون به ما کمک میکند تا باگها و خطاها را در مراحل ابتدایی چرخه توسعه نرمافزار شناسایی کنیم. این کار علاوه بر اینکه باعث بهتر شدن کیفیت کدهای برنامه میشود، هزینههای ناشی از رفع این باگها در آینده را نیز کاهش خواهد داد.
آزمون واحد همچنین، یکی از مهمترین بخشهای «توسعه آزمونمحور» (Test-Driven Development | TDD) محسوب میشود که در آن، پیش از نوشتن کدهای واقعی برنامه، تستها را مینویسم و در نتیجه به کدهای مطمئنتری دست پیدا میکنیم.
مزایا و معایب تست واحد در پایتون
در ادامه، به برخی از نقاط قوت و نقاط ضعف این روش تستنویسی اشاره کردهایم.
- شناسایی باگها در مراحل ابتدایی توسعه برنامه و رفع آنها پیش از اینکه پیچیدهتر و بزرگتر شوند.
- بهتر شدن کیفیت کدهای برنامه که بهدلیل اطمینان از عملکرد صحیح هر یک از واحدها بهدست میآید.
- اطمینان بیشتر به کدها از این بابت که توسعهدهندگان میتوانند عملکرد صحیح هر یک از واحدها را بررسی کنند.
توسعه سریعتر و بهینهتر، مستندسازی بهتر، ریفکتورینگ بیدردسر و کاهش هزینه و زمان صرف شده در توسعه برنامه نیز جزو دیگر مزیتهای این روش تست نویسی در پایتون هستند.
از معایب این روش نیز میتوان به موارد زیر اشاره کرد.
- نیازمند زمان و تلاش برای ایجاد و نگهداری از «Test Case-ها»
- وابسته بودن اثربخشی آن به توسعهدهندگان، از این بابت که تستکیسها را به چه میزان، کامل، شفاف و بهینه ایجاد کردهاند.
- مناسب نبودن برای تست رابط کاربری
- مناسب نبودن برای تست تعامل بین واحدهای مختلف برنامه
فریمورک unittestبهصورت پیشفرض داخل پایتون وجود دارد و ابزارهایی را در اختیار شما قرار میدهد تا به کمک آنها تستهای مورد نظر را ایجاد و اجرا کنید. این فریمورک امکانات زیر را ارائه میدهد.
- نوشتن تستها: در این فریمورک، تستها را درون کلاسهایی مینویسیم که از unittest.TestCase ارث میبرند یا به نوعی زیر کلاس آن محسوب میشوند. متدهای تست نیز در این کلاسها قرار میگیرند و نام آنها با test شروع میشود.
- Assertion-ها: منظور از «Assertion»، عباراتی مانند assertEqual، assertTrue ، assertRaises و غیره هستند که برای بررسی نتایج، مورد استفاده قرار میگیرند. به کمک Assertion-ها میتوانیم شرایط تست را تعریف و از عملکرد صحیح کدها و برنامه مطمئن شویم.
- «کشف تست» (Test Discovery): فریمورک unittest میتواند بهطور خودکار تمامی تستکیسهای موجود در ماژول یا پوشهای خاص را شناسایی و اجرا کند.
- یکپارچگی با سایر فریمورکهای تست پایتون: این فریمورک را میتوان بههمراه سایر فریمورکها نظیر doctest و pytest بهکار برد و از انواع مختلفی از تستها درون یک مجموعه بهرهمند شد.

انواع Assertion
همانطور که گفتیم برای بررسی خروجیها و ارزیابی آنها با یک مقدار مشخص، از دستوراتی بهنام Assertion استفاده میکنیم. جدول زیر برخی از Assertion-های رایج را نشان میدهد.
متد Assertion | معادل آن |
.assertEqual(a, b) | a == b |
.assertTrue(x) | bool(x) is True |
.assertFalse(x) | bool(x) is False |
.assertIs(a, b) | a is b |
.assertIsNone(x) | x is None |
.assertIn(a, b) | a in b |
.assertIsInstance(a, b) | isinstance(a, b) |
نحوه استفاده از این Assertion-ها را در مثال عملی خواهید دید.
تست یکپارچگی
تست دیگری که به شما معرفی میکنیم، «تست یکپارچگی» (Integration Testing) نام دارد که یکی از مهمترین مراحل در فرایند توسعه نرمافزار محسوب میشود. تستهای یکپارچگی بررسی میکنند که ماژولهای پایتون هنگامیکه در سیستمی بزرگتر در کنار هم قرار میگیرند نیز عملکرد درست و بدون مشکلی داشته باشند.
تستهای واحد که پیش از این به شما معرفی کردیم، عملکرد هر جزء از برنامه را بهصورت جداگانه بررسی میکنند. اما تست یکپارچگی در پایتون به این موضوع میپردازد که ماژولهای گوناگون برنامه، بدون مشکل و بهطور مناسب با هم تعامل داشته باشند و بهصورت مجموعهای یکپارچه و منسجم کار کنند.
در تست یکپارچگی ممکن است نیاز باشد که مانند کاربر اپلیکیشن از آن استفاده کنیم. این کار از طریق موارد زیر انجام میشود.
- فراخوانی HTTP REST API
- اجرای دستورات خط فرمان
- فراخوانی API پایتون
- فراخوانی وبسرویس
مثال برای درک بهتر تست یکپارچگی
تستکیسها در آزمون یکپارچگی، به بررسی انتقال دادهها بین بخشهایی از برنامه میپردازند که پیش از این با تست واحد ارزیابی شدهاند. در واقع، هدف این است که از ارتباط و تعامل صحیح آنها با هم مطمئن شویم. بهطور مثال، ارتباط بین صفحه «ورود» (Login) و صفحه اصلی یکی وبسایت که ۲ ماژول جداگانه هستند را در نظر بگیرید. هنگامیکه کاربر اطلاعات ورود را بهدرستی وارد کند میبایست به صفحه اصلی منتقل شود. و این مورد، چیزی است که در تست بررسی میکنیم.
انواع تست یکپارچکی در پایتون
در تست یکپارچگی، بخشهای مختلف برنامه را با هم ترکیب و نتایج آن را بررسی میکنیم. بهطور کلی، ۴ نوع تست یکپارچگی داریم که هر یک به شیوهای خاص عملکرد برنامه را ارزیابی میکنند.

- تست یکپارچگی افزایشی: در این شیوه، ابتدا همه ماژولهای مرتبط بههم با هم ترکیب و ادغام شده و سپس تست برنامه انجام میشود تا مطمئن شویم که طبق پیشبینیها و نیازها کار میکنند. سپس، سایر ماژولها نیز به همین ترتیب ادغام و تست میشوند. این کار تا اتمام تست تمامی ماژولها ادامه پیدا میکند. این رویکرد به شیوههای زیر قابل انجام است.
- روش بالا به پایین
- روش پایین به بالا
- روش ترکیبی یا «Sandwich»
- تست یکپارچگی غیرافزایشی یا «Big Bang»: در این روش، نخست تمامی ماژولهای برنامه بهصورت جداگانه تست میشوند. سپس با هم ادغام شده و مجدد تست میشوند. این روش برای تست سیستمهای کوچک بسیار مناسب است. همچنین، با پیدا کردن سریعتر ایرادها تا حد زیادی در زمان شما صرفهجویی میکند. از معایب آن نیز میتوان به دشواری در پیدا کردن علت مشکلات و محل دقیق خطا اشاره کرد.
تست یکپارچگی افزایشی با رویکرد بالا به پایین
در این روش، اول ماژولهای سطح بالاتر سیستم تست میشوند و پس از آن به تدریج و بهصورت مر حله به مرحله ماژولهای سطح پایینتر به لحاظ عملکرد بررسی خواهند شد. این روش گزینه مناسبی برای سیستمهای کوچک است.

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

تست یکپارچگی با رویکرد ترکیبی
در روش تست ترکیبی، ۲ رویکرد قبلی یعنی «بالا به پایین» و «پایین به بالا» را در تست نویسی داریم. یعنی ماژولهای سطح بالا همراه با ماژولهای سطح پایین تست خواهند شد و برعکس این شیوه نیز برقرار است.

مزایا و معایب تست یکپارچگی در پایتون
از نقاط قوت این نوع تست میتوان به موارد زیر اشاره کرد.
- تست یکپارچگی میتواند در زمان و هزینهای که قرار است در آینده برای حل مشکلات و خطاهای برنامه صرف شود، با تشخیص زودهنگام و رفع این مشکلات، صرفهجویی کند.
- این تست به بررسی عملکرد بدون مشکل بخشها و ماژولهای گوناگون برنامه با هم میپردازد. همچنین مطمئن میشود که دادهها و جریانهای کنترلی بهدرستی بین آنها برقرار باشد.
- تست یکپارچگی باعث میشود که سیستم بهطور کلی، قابلیت اطمینانتر باشد. ضمن اینکه احتمال بروز خطا در مراحل پایانی را نیز کاهش میدهد.
تست یکپارچگی همچنین میتواند معایب زیر را بههمراه داشته باشد.
- پیدا کردن منشأ اصلی مشکلات و ایرادهای مربوط به یکپارچگی، به دلیل اینکه معمولاْ از تعامل بخشهای گوناگون ناشی میشوند، ممکن است کار سختی باشد. بنابراین، دیباگ آن زمانبر خواهد بود.
- انتخاب زمان و شیوه انجام تستهای یکپارچگی بهخصوص بههنگام وجود وابستگی بین بخشهای مختلف سیستم، میتواند سخت باشد.
تست عملکرد
در تست نویسی عملکردی در پایتون به دنبال بررسی این هستیم که سیستم یا برنامه مورد ارزیابی، عملکرد مورد نظر و پیشبینی شده را به کاربر ارائه دهد و اینکه پاسخگوی نیازهای تعیین شده باشد. تست عملکرد را میتوان یکی از مهمترین مراحلی دانست که برای اطمینان از پایداری و قابلیت اطمینان برنامه انجام میشود.
دلیل انجام تست عملکردی این است که از طریق آن مطمئن میشویم که اپلیکیشن یا وبسایت ما تجربه کاربری خوبی را برای مخاطبان خود فراهم میکند.
جنبه های مورد بررسی در تست عملکردی
همانطور که اشاره کردیم، مهمترین هدف ما از تست عملکردی، بررسی کارکرد برنامه و عملکرد صحیح آن است که جنبههای زیر را شامل میشود.
- قابل استفاده بودن: در این بخش از تست، بررسی میکنیم که کاربر بتواند بهسادگی و بدون دردسر، بین صفحات مختلف وبسایت یا محیط برنامه پیمایش کند.
- دسترسیپذیر بودن: جنبه دیگری که میتواند مورد ارزیابی قرار گیرد این است که افراد دارای معلولیت نیز بتوانند از امکانات و قابلیتهای خاص محصول استفاده کنند.
- قابلیتهای اصلی: وجود عملکرد صحیح در قابلیتهای اصلی برنامه جنبه دیگری است که مورد بررسی قرار میگیرد.

مثال عملی تست نویسی در پایتون با فریمورک Unittest
در این قسمت میخواهیم مثالی در مورد تست برنامه با فریمورک unittest را به شما نشان دهیم.
فایل test.py
در این مثال، فایلی به نام test داریم که کد پایتون برنامه و همچنین کدهای تست خود را درون آن نوشتهایم. از آنجاییکه این برنامه با پایتون نوشته شده پسوند آن برابر با py است. محتویات این فایل را در ادامه آوردهایم.
در خط نخست، کتابخانه unittest را وارد کردهایم تا از امکانات آن برای تست برنامههای خود استفاده کنیم.
همانطور که خط ۳ مشاهده میکنید، تابع add(a, b) را داریم که ۲ مقدار را به عنوان ورودی دریافت کرده و مجموع آنها را بهعنوان خروجی بر میگرداند. این تابع در واقع برنامه اصلی ما محسوب میشود.
همچنین در خط ۶، کدهای مربوط به کلاس تستکیس با نام TestAddFunction() را مشاهده میکنید که زیر کلاسی از unittest.TestCase محسوب میشود یا بهنوعی از آن ارثبری میکند. هدف این است که بررسی کنیم آیا برنامه ما به درستی کار میکند یا خیر. در این کلاس ۳ متد تست به نامهای زیر داریم.
- test_add_positive_numbers
- test_add_negative_numbers
- test_add_mixed_numbers
این متدهای تست در واقع، سناریوها و شرایط مختلفی را بررسی میکنند که تابع add(a, b) میتواند داشته باشد. بهطور مثال، جمع ۲ عدد مثبت، جمع ۲ عدد منفی یا جمعی که یکی از طرفین منفی باشد و طرف دیگر مثبت را بررسی میکنند.
این کدها، بیانگر یک تست ساده با فریمورک unittest هستند و در صورتیکه هر یک از متدها False شوند این تست با «شکست» (Fail) رو به رو خواهد شد.
برای اجرای این تست وارد ترمینال یا خط فرمان سیستم خود شده و در آدرس جاری، دستورات زیر را اجرا کنید.
python test.pyبا این کار، تست اجرا شده و سپس، خروجی بهشکل زیر به ما نشان داده میشود.
... ---------------------------------------------------------------------- Ran 3 tests in 0.001s OKاین خروجی به ما میگوید که هر ۳ تست با موفقیت اجرا شدهاند و مشکلی در عملکرد پیشبینی شده برای تابع با توجه به شرایط و سناریوهایی مشخص شده وجود ندارد.
اکنون فرض کنید که به کدهای برنامه برگردیم و در متد test_add_positive_numbers مقدار مورد انتظار ۳ را به ۲ تغییر دهیم. در این صورت، تست شکست میخورد و نتیجهای مشابه زیر خواهیم داشت.
..F ====================================================================== FAIL: test_add_positive_numbers (__main__.TestAddFunction) ---------------------------------------------------------------------- Traceback (most recent call last): File "f:\GeeksforGeeks\example_package\main.py", line 8, in test_add_positive_numbers self.assertEqual(add(1, 2), 2) AssertionError: 3 != 2 ---------------------------------------------------------------------- Ran 3 tests in 0.001s FAILED (failures=1)همانطور که مشاهده میکنید شماره خط و نام متدی که با شکست مواجه شده نیز بهطور کامل در این خروجی گزارش داده شده است. ضمن این که گفته است جمع ۲ عدد ۱ و ۲ توسط این تابع برابر با ۳ میشود که با مقدار پیشبینی شده ۲ تفاوت دارد.
برای اینکه خروجی شامل جزئیات بیشتری باشد میتوانید برای اجرای تستها دستور زیر را اجرا کنید. در این دستور از علامت -v استفاده شده است.
python test.py -vاز نتایجی که در خروجی تستها ممکن است با آن رو به رو شوید میتوان به موارد زیر اشاره کرد.
- OK: به معنای موفقیتآمیز بودن همه تستها است.
- FAIL: بیانگر این است که تست موفقتآمیز نبوده و خطای AssertionError رخ داده است.
- ERROR: نشان میدهد که خطایی غیر از AssertionErrorدر تست ما رخ داده است.

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