به طور خلاصه به فرآیند ارزیابی کارایی یک نرم افزار، تست نرم افزار میگویند. در فرآیند تست نرم افزار، عملکرد نرم افزار مورد بررسی قرار میگیرد تا ایراد و باگی نداشته باشد، همچنین آزمایشهایی جهت صحت خروجی نرم افزار صورت میپذیرد تا قبل از انتشار و تجاری کردن نرم افزار، از درست بودن نتایج خروجی اطمینان حاصل شود.
چرا تست نرم افزار از اهمیت بالایی برخوردار است؟
تست نرم افزار یکی از مهمترین مراحل توسعه ی نرم افزار است. از طریق تست نرم افزار، تست کنندگان نرم افزار با زیر سوال بردن نرم افزار و سنجش قسمتهای مختلف نرم افزاری، آن نرم افزار را ارزیابی کرده و از این طریق باگها و مشکلات موجود در نرم افزار را شناسایی میکنند. تمامی این فرآیندها انجام میشود تا در نهایت محصولی که به دست مصرف کنندگان میرسد یک محصول با کیفیت باشد تا بتواند رضایت و اعتماد مشتری را افزایش دهد. مراحل ارزیابی و تست نرم افزار میتواند خیلی مختصر و یا خیلی پیچیده و گسترده باشد.
برای پی بردن به اینکه تست نرم افزار چقدر بحث مهمی است میتوان به شرکت Starbucks نگاهی انداخت. بستر Point-of-Sale یا POS این سیستم به دلیل اشکال نرم افزاری برای مدتی Shut down شد که همین امر باعث ایجاد خسارت چند میلیون دلاری این شرکت شد. با تست صحیح نرم افزاری بستر POS این شرکت، امکان جلوگیری از متضرر شدن شرکت وجود داشت. به عنوان مثالی دیگر میتوان به شرکت خودرو سازی نیسان اشاره کرد. وجود باگی در سیستم کیسهی هوای خودروهای این شرکت باعث شد تا بیش از 3 میلیون خودرو به کارخانه برگشت داده شوند.
در لیست زیر مهم ترین دلایلی که چرا باید تست نرم افزار را در فرآیند توسعه ی نرم افزار بگنجانیم آمده است:
- تشخیص زود هنگام عیب های نرم افزاری: بدون شک توسعهی نرم افزارهای بزرگ و پیچیده همواره با باگ همراه است. تست نرم افزار باعث میشود قبل از بزرگتر شدن و گستردهتر شدن نرم افزار و در نهایت زیاد شدن تعداد باگها، آنها را پیدا و رفع کرد تا در نهایت یک محصول نرم افزاری بدون مشکل ساخته شود.
- افزایش کیفیت محصول: وقتی صحبت بر سر مشتری و مصرف کننده است، کیفیت نرم افزار یکی از مهم ترین پارامترهای یک نرم افزار محسوب میشود. قبل از عرضه شدن یک محصول نرم افزاری، تیم تضمین کیفیت یا Quality Assurance (QA) میبایست در فرآیند تست نرم افزار کمک کرده تا معیار ها و مشخصات تعریف شده توسط کاربران را برآورده کند.
- افزایش اعتماد و رضایت کاربران: تست یک نرم افزار در طول چرخهی توسعهی آن باعث ایجاد اعتماد و رضایت مشتری میشود، زیرا نقاط قوت و ضعف محصول را نشان میدهد.
- شناسایی آسیب پذیری های امنیتی: نرم افزارهای نا امن در برابر انواع حملهها بشدت آسیب پذیرند. از آنجایی که امروزه اکثر نرم افزارها آنلاین هستند، امکان انواع حمله های سایبری یا Cyber Attacks را برای مهاجمان فراهم میکنند. بنابراین یک نرم افزار در طول مراحل مختلف توسعه باید به طور مداوم تست شود. برای مثال یک برنامه ی وب یا Web Application ای که بدون تست نرم افزار مناسب منتشر شده است، به راحتی میتواند قربانی یک حمله اسکریپت بین سایتی شود که در آن مهاجمان سعی میکنند با دسترسی از طریق این برنامه ی وب آسیب پذیر، کد مخرب را به مرورگر وب کاربر قربانی تزریق یا inject کنند. بنابراین یک برنامهی آزمایش نشده میتواند به وسیلهای برای تحویل کد مخرب تبدیل شود که البته با تست های نرم افزاری و امنیتی میتوان جلوی این کار را گرفت.
- به مقیاس پذیری کمک میکند: یکی از انواع فرآیند های تست نرم افزار، تست مقیاس پذیری است. در این نوع تست ها بار کاری قسمت های مختلف نرم افزار که مورد آزمایش قرار گرفته است را افزایش میدهیم تا پی ببریم واکنش نرم افزار نسبت به این افزایش بار چیست. به عنوان مثال نرم افزار چه واکنشی میدهد اگر ترافیک شبکه افزایش پیدا کند یا به عنوان مثال حجم دادههای نرم افزاری زیاد شوند. به وسیلهی این نوع تست حتی میتوان آستانهی تحمل یک نرم افزار را نیز بدست آورد. مثلا یک بازی آنلاین تا چند بازیکن را میتواند به صورت همزمان پشتیبانی کند.
- صرفه جویی در هزینه های پرداختی: یک نرم افزار که به درستی تست نشده یا اصلا تست نشده باشد میتواند مشکل زا باشد. اگر بعد از انتشار نرم افزار متوجهی وجودی باگ و اشکالی در نرم افزار شویم، پیدا کردن آن باگ و رفع آن به وسیلهی پچهای بروزرسانی بسیار سختتر و پر هزینهتر از تست نرم افزار خواهند بود.
انواع تست های نرم افزاری
تعداد زیادی تست های نرم افزاری وجود دارد، اما به طور کلی میتوان آنها را به دو دسته ی اصلی یعنی تست های ایستا (StaticTesting) و تست های پویا (Dynamic Testing) تقسیم کرد. تست های پویا ارزیابی نرم افزار حین اجرا را ارزیابی میکنند. به عنوان مثال ارزیابی عملکرد توابع نرم افزاری و یا بررسی پرفورمنس و دیگر عملکردهای سیستمی، در حالی که تستهای ایستا معمولا کد های نوشته شده و مستندات مربوط به طراحی آن را تحلیل میکنند.
در طول سالها، تست های نرم افزاری به طول قابل توجهی تکامل یافتهاند. در حال حاضر شرکتها تست Agile و محیط های کاری DevOps را وارد حیطهی کاری خود کردهاند. این استراتژیها، تستهای سریعتر و مشارکتیتری را در حوزهی تست نرم افزار بوجود آورده اند.
لیست زیر انواع متودلوژی های تست های نرم افزاری که بیشتر مورد استفاده قرار میگیرد را نشان میدهد:
- تست یکپارچه سازی (Integration Testing): این نوع تست معمولا دو یا چند ماژول از یک نرم افزار را برای اطمینان از عملکرد جمعی آنها مورد بررسی قرار میدهد. ممکن است تک تک ماژول ها به تنهایی به درستی عمل کنند اما در ارتباط این ماژول ها با یکدیگر نقصی وجود داده باشد. به وسیلهی تست یکپارچه سازی میتوان این نقصها را پیدا کرد.
- تست واحد (Unit Testing): به طور معمول این تست در مرحلهی توسعه ی نرم افزار انجام میشود و هدف از این تست نیز اطمینان از عملکرد هر قسمت کوچک از اجزای برنامه است. به این نوع تست به اصطلاح تست جعبه سفید یا White Box نیز میگویند. ابزار های مختلفی وجود دارد که برای این نوع تست بکار گرفته میشوند، مانند JUnit، xUnit، NUnit و...
- تست عملکرد (Functional Testing): نوعی از تست نرم افزار است که عملکرد بخشهای مختلف نرم افزار را مورد بررسی قرار میدهد تا از درستی آن اطمینان حاصل کند. به طور خلاصه تر با تعدادی ورودی مشخص، خروجی را دریافت کرده و مورد بررسی قرار میدهد تا پی ببرد آیا خروجی دریافتی همان خروجی مورد انتظار است یا خیر. یکی از روش های متداول برای تست عملکرد، تست جعبه سیاه یا Black Box Testing است.
- تست امنیت (Security Testing): این تست را برای این انجام میدهیم تا مطمئن شویم نرم افزار ما عاری از هر گونه آسیب پذیری و حفرههای امنیتی که ممکن است بر سیستم و دادههای کاربران تاثیر بگذارد است. تست های امنیتی معمولا تحت عنوان تست نفوذ یا Penetration Testing شناخته میشوند.
- تست پرفورمنس (Performance Testing): به طور خلاصه این تست، پرفورمنس و سرعت نرم افزار را تحت بار کاری یا Workload مشخصی مورد بررسی قرار میدهد.
- تست رگرسیون (Regression Testing): این تست بررسی میکند که آیا بعد از اضافه کردن یک ویژگی جدید به نرم افزار، نرم افزار دچار مشکلی میشود یا خیر.
- تست استرس (Stress Testing): این تست قدرت نرم افزار را با آزمایش میزان بارگزاری قبل از رسیدن به نقطهی شکست ارزیابی میکند. در این تست میزان بار کاری نرم افزار تا نقطهی شکست یا Breaking Point افزایش پیدا میکند تا پی ببریم قبل از شکست، نرم افزار چه واکنشی نشان میدهد. این تست نوعی تست غیر عملکردی یا Non Functional است.
- تست پذیرش (Acceptance Testing): این تست کل سیستم را در برابر الزامات (Requirements) مورد نظرارزیابی کرده و از کامل بودن پروژه اطمینان حاصل میکند.
چه عملیاتی در تست نرم افزار را می توان خودکار یا اتومات کرد؟
تست های خودکار برای پروژههای حجیم و بزرگ نرم افزاری به کار گرفته میشوند، یعنی زمانی که انجام تست به صورت دستی خسته کننده و یا زمانبر باشد. اسکریپتهای مربوط به انجام تست نرم افزاری میتواند به صورت خودکار انجام شود تا شرکتها بتوانند فرآیند تست نرم افزار را در زمان سریعتر و با هزینهی کمتری انجام دهند.
بسیاری از تیم های QA ابزار های تست خودکار داخلی یا In-House میسازند تا بتوانند از همان تست به طور مکرر استفاده کنند. به عنوان مثال برای تست خودکار برنامههای تحت وب، از ابزاری مانند Java for Selenium استفاده میشود.
در لیست زیر پنج روش آورده شده است که اتوماسیون میتواند به فرآیند تست نرم افزار کمک کند:
- تست مداوم (Continuous Testing): این نوع تست خودکار تقریبا روی تمامی قسمتهای نرم افزاری ای که یک توسعه دهنده میسازد، صورت میگیرد. در این تست، تشخیص خطا (Error Detection) و اعتبار سنجی کد (Validation) در مراحل اولیه ی توسعه ی نرم افزار انجام میشود. برای اینکه فرآیند تست به صورت مداوم و مکرر انجام شود، تست خودکار تعبیه میشود. همچنین این تست در تمامی Stageهای توسعهی نرم افزار صورت میپذیرد.
- مجازی سازی سرویس (Virtualization of Service): در مراحل اولیهی توسعهی نرم افزار، معمولا محیط های تست نرم افزار وجود ندارد، زیرا هنوز اجزای کلی نرم افزار ساخته نشده است. این امر امکان انجام تست های کارامد در مراحل اولیه را از تیم ها سلب میکند. به وسیله ی مجازی سازی سرویس میتوان بر این مشکل غلبه کرد. به عنوان مثال میتوان سیستمهایی که هنوز توسعه نیافتهاند را شبیه سازی کرد. بنابراین برنامههای آزمایشی زودتر ساخته میشوند و دیگر نیازی نیست منتظر بمانیم تا کل نرم افزار اصلی ساخته شود تا تست را روی آن انجام دهیم. مزیت دیگری که این روش دارد این است که تغییر سناریو های تست نرم افزار روی محیط های مجازی هیچ تاثیری بر روی محصول اصلی نمیگذارد.
- ردیابی باگ و نقص ها (Bug and Defect Tracking): تست های خودکار برای شناسایی اشکالاتی که گاهی اوقات در تستهای دستی ممکن است از قلم بیفتند عالی است. به عنوان مثال مشکلاتی مانند Memory Leaks یا نشت حافظه. این تستها در یک بازهی کوتاه میتوانند صدها بار اجرا شوند و بنابراین مشکلات سریع تر پیدا میشوند. به عنوان بخشی از تست خودکار، تست رگرسیون که قبلتر دربارهی آن گفتیم نیز انجام میشود تا تضمین کند باگهای قدیمی دوباره ظاهر نمیشوند. یکی دیگر از مزیت های تست خودکار نرم افزار، اطلاع رسانی سریع به توسعه دهندگان در صورت شکست یا Fail شدن تست است. این امر برای نرم افزارهایی که به صورت مکرر بروز رسانی میشوند بسیار مهم است.
- گزارش و معیار ها (Reporting and Metrics): گزارش و معیارها نقش حیاتی در تست های خودکار دارند. معمولا وقتی قرار است نتایج خروجی حاصل از تست را تجزیه و تحلیل کنند، نیاز است تا معیارهای استفاده شده یکپارچه باشند و هر گزارشی از یک متریک مجزا استفاده نکرده باشد. (فرضا معیار یکی بایت باشد و معیار دیگری بیت). در تست های دستی یا Manual ممکن است چنین مشکلی رخ دهد اما در تست های خودکار از معیار های یکپارچه استفاده میکنند و به تیم ها این امکان را بدهد که به صورت هماهنگ با یکدیگر سلامت یک پروژه را تجزیه و تحلیل کنند.
- مدیریت پیکربندی (Configuration Management): تست خودکار یک دید خوبی از تمامی قسمت های فرآیند تست فراهم میکند که شامل کد ها، طراحی اسناد (Documents)، الزامات (Requirements)، قالب های تست (Test Cases) و بسیاری از موارد دیگر میشود. اینکار باعث شده تا بخش مدیریت بر روی تمامی این موارد یک حالت متمرکز بگیرد و تمامی تیمها در سراسر سازمان بتوانند در مراحل مختلف توسعه، همکاری کنند.
بهترین روش ها برای تست نرم افزار
تست یک نرم افزار تنها به اجرا کردن چند تست ساده محدود نمیشود، در روند تست نرم افزار باید از استراتژیها و فرآیندهایی استفاده کرد تا یک تست روشمند بوجود آید. این امر باعث بهبود بخشیدن پرفرومنس و کارایی برنامهها و محصولات میشود. بنابراین برای انجام یک تست موفق در پروژهها، نیاز است تا موارد زیر را در نظر بگیریم:
- استفاده از تست های امنیت محور: تهدید های امنیتی به طور مداوم پیشرفت میکنند. برای ایمن کردن نرم افزارها حتما باید در کنار و همگام با تستهای معمولی نرم افزار، تست های امنیتی هم انجام شود. تست های نفوذ یا هک های اخلاقی (Ethical Hacking) میتواند در این تست ها گنجانده شود تا ضعفها و شکافهای امنیتی نرم افزار را مشخص کنند.
- مداخله ی کاربران: از آنجایی که بهترین قضاوت کنندگان نرم افزارها کاربران هستند، بهتر است یک کانال ارتباطی با آنها فراهم شود تا نظر آنها در مورد نرم افزار ساخته شده را بدانیم. مثلا به چه مشکلاتی برخوردند یا ترجیح میدهند چه ویژگی به نرم افزار اضافه شود و از این قبیل سوالات. این امر باعث میشود از دیدگاه کاربران به محصولمان نگاه کنیم و از بازخوردهای آنها برای یک انجام یک تست نرم افزاری موفق استفاده کنیم.
- برنامه نویسان باید از نوشتن تست ها دوری کنند: تستها معمولا قبل از فاز نوشتن کدها آغاز میشود. بهترین کار این است که برنامه نویسان تست های نرم افزاری را ننویسند، زیرا ممکن است تست نوشتن آنها جهت دار باشد و تستها مطابق با تفکر کد نویسی آنها نوشته شود که در این صورت ممکن است بسیاری از جزئیات از قلم بیفتد.
- تقسیم تست ها به فرآیند های کوچکتر: تستهای کوچکتر باعث صرفه جویی در زمان و منابع میشوند، به خصوص در محیط هایی که دائما نیاز به انجام تست داریم. شکستن تستها به تستهای کوچکتر، مانند تست Functionها، تست UI، تست UX، تست های امنیتی و... باعث میشود تا تیم ها به صورت کاراتر به تجزیه و تحلیل هر تست بپردازند.
- تست رگرسیون را نادیده نگیرید: تست رگرسیون یکی از مراحل مهم تست است و قبل از اینکه نرم افزار به مرحلهی انتشار برسد حتما باید انجام شود. از آنجایی که اکثر تستها پیش از تست رگرسیون انجام میشود، بهتر است برای ارزیابی و اعتبار سنجی کل نرم افزار به صورت یکجا، این تست انجام شود.
تاریخچه ی تست نرم افزاری
اولین کد نرم افزاری توسط یک دانشمند کامپیوتر با نام Tom Kilburn در سال 1948 میلادی در دانشگاه منچستر انگلستان نوشته شد. تست نرم افزاری نیز در همان زمان نوشته شد اما تنها محدود به فرآیند دیباگ کردن یا اشکال زدایی (Debugging)دیباگ چیست؟ معرفی روشها و ابزارهای دیباگینگ(اشکال زدایی)این مقاله عالی مفاهیم دیباگ (debug)، دیباگینگ (Debugging) یا همان اشکال زدایی، دیباگر (Debugger) را معرفی و همچنین روشها و ابزارهای دیباگینگ را بررسی کرده بود. در دهه 1980، تیم های توسعه شروع به ترکیب فرآیند جامع تری برای جداسازی (Isolating) و انجام تستهای Load یا میزان بار کاری کردند که این یک قدم رو به جلو برای تست های نرم افزاری بود. در دهه ی 1990، فرآیند QA ظهور کرد که بعد از آن تبدیل به جزئی از چرخه ی عمر توسعه ی نرم افزار تبدیل شد.
جمع بندی
با توجه به گسترده و پیچیده شدن نرم افزار های امروزی، تست های نرم افزاری به یک بخش خیلی مهم و جدایی ناپذیر از فرآیند توسعه ی نرم افزار تبدیل شده است. هر ساله در خصوص تست های نرم افزاری مقالات زیادی نوشته شده و کنفرانس های متعددی برگزار میگردد تا روش ها و فنون جدید تست یک نرم افزار و جنبه های مختلف آن را بررسی کنند. در این مقاله به طور جامع انواع تست های نرم افزاری پرداختیم و گفتیم که چرا تست یک نرم افزار میتواند اینقدر مهم و حیاتی باشد. همچنین روش های ارزشمند برای یک تست خوب را نیز معرفی کردیم.
تست نرم افزار یا Software Testing چیست؟
به طور کلی به فرآیند ارزیابی یک نرم افزار و تایید اینکه این نرم افزار به درستی کار کرده و نتایجی مطابق با خواستهی ما و هدف خود نرم افزار در خروجی تولید کرده است، تست نرم افزار میگویند.
انواع تست های نرم افزاری کدامند؟
میتوان گفت تست های نرم افزاری به بخش های زیر تقسیم میشوند:
- تست یکپارچه سازی (Integration testing)
- تست واحد (Unit testing)
- تست عملکرد (Functional testing)
- تست امنیت (Security testing)
- تست پرفورمنس (Performance testing)
- تست رگرسیون (Regression testing)
- تست استرس (Stress testing)
- تست پذیرش (Acceptance testing)