خانه /
اگر شما بخواهید یک محصول جدید را وارد بازار کنید، باید چه مراحلی را طی کنید؟ آیا در کنار سنجش نیاز بازار، مواد اولیه و مراحل تولید، محصول نهایی را هم میسنجید؟ اگر جواب شما بله است، تبریک میگوییم. تست یکی از مراحل مهم توسعه محصول است؛ در مورد نرمافزار هم، سنجش نرم افزار از مراحل بسیار مهم در توسعه نرمافزار است که اگر به آن توجه نکنید ممکن است با مشکلات مختلفی روبرو شوید.
در این مقاله میخواهیم نگاهی کلی به مبحث تست نرمافزار، اهمیت انجام آن، انواع و روشهای انجام تستهای مختلف داشته باشیم. با ما همراه باشید.
طور کلی فرایند تست، شامل سنجش یک محصول (در اینجا نرمافزار) از زوایای مختلف، در مراحل مختلف تولید و توسعه میشود. این ارزیابی برای پیدا کردن تفاوتهای بین برنامه فعلی و برنامه مورد انتظار و در نتیجه بهبود عملکرد و کارایی نرمافزار انجام میشود.
برای مثال در این فرایند بررسی میکنیم که آیا:
این موارد از اهداف نهایی تست هستند که از تستهای مختلف روی محصول نرمافزاری به دست میآیند. در واقع این فرایند برای این نیست که صحت عملکرد نرمافزار را در همه شرایط بسنجد، بلکه هدف، پیدا کردن عیبهای نرمافزار در شرایط خاص است.
همانطور که گفتیم، فرایند تست باعث بهبود کارایی و عملکرد محصول نرمافزاری میشود؛ اما این تنها دلیل اهمیت تست نیست. اگر این تستها را در مراحل مختلف توسعه (از سنجش نیازمندی تا توسعه و ارائه برنامه به کاربر) انجام دهید، نتایجی میبینید که شگفتزده خواهید شد.
به طور خلاصه، تست نرمافزار مزیتهای زیر را دارد:
اگر هنوز برای گنجاندن تست در فرایندهای توسعه نرمافزار خود قانع نشدهاید، نمونه ناموفق Therac-25 را در نظر بگیرید. Therac-25 یک دستگاه پرتودرمانی بود که جان چندین نفر را به علت نقص نرمافزاری گرفت. این مثال میتواند دلیل خوبی برای انجام فرآیند تست قبل از ارائه نرمافزار به بازار باشد.
علاوه بر این شرکتهای مختلفی مانند نیسان (Nissan)، استارباکس (Starbucks) و … هم به دلیل نقص نرمافزاری که در سیستمهای آنها وجود داشته است، متحمل هزینههای سنگینی شدند که با داشتن تست، میشد از آنها پیشگیری کرد.
چرخه حیات سنجش نرمافزار که به اختصار (STLC (Software Testing Life Cycle گفته میشود، شامل ۶ مرحله مختلف از شروع تست تا پایان آن است. این ۶ مرحله عبارتند از:
نیازمندیهایی که در مراحل توسعه محصول نرمافزاری شناخته شدهاند در این مرحله ارزیابی میشوند. این نیازمندیها شامل نیازمندیهای کاربر و سازمان، کاربردی و غیر کاربردی و … میشوند.
در این مرحله، استراتژی تست در یک طرح برنامه تست مطرح میشود. این استراتژی شامل ابزارهای لازم، مراحل انجام تست و مسئولیت افراد میشود. همچنین زمان، بودجه و ریسک هم در این مرحله مشخص میشود.
در این مرحله تست کیسها (نمونه تست) تهیه میشوند. در هر کیس، ورودی، فرایندها، شرایط اجرایی و نتیجه مورد نظر مشخص میشود. نمونه تستها باید شفاف، بهینه و منعطف باشند و در انتها، مجموع آنها باید کل تست را پوشش دهد.
در این مرحله محیط تست پیکربندی و پیادهسازی میشود. در این مرحله ابزارهای مختلف تست مانند Selenium, Appium, Katalon و … اضافه میشوند و عملکرد خود محیط هم با استفاده از تست دود (Smoke test) سنجیده میشود.
در این مرحله، برنامه در محیط ایجاد شده از جنبههای مختلف تست میشود. نتایج تستهای مختلف جمعآوری و با نتایج دلخواه ارزیابی میشوند.
در آخرین مرحله از چرخه حیات، یک گزارش جامع از نتایج تهیه میشود. این گزارش شامل مواردی مانند مقایسه بین نتایج به دست آمده و دلخواه، اهداف دست یافته، زمان صرف شده، هزینهها، خطاهای یافت شده و … میشود.
شاید بتوانیم بگوییم که مراحل تست همپوشانی زیادی با چرخه حیات تست دارد؛ اما نکاتی در این بین وجود دارد که باید به آنها توجه کنید. همانطور که در مرحله دوم چرخه حیات تست به آن اشاره کردیم، برنامهریزی برای انجام این فرایند شامل تعریف برخی پیشنیازها میشود.
این پیشنیازها که بخش بزرگی از مراحل تست را در برمیگیرند عبارتند از: سطوح تست، انواع تست و استراتژی (رویکرد) انجام تست. در این بخش کمی دقیقتر به این ۳ پیشنیاز نگاه میکنیم تا با شناخت بهتر آنها، بتوانید برنامهریزی بهتری برای تست خود داشته باشید.
فرایند تست در مراحل مختلفی از توسعه نرمافزار وجود دارد. سطوحی که تست در آنها انجام میشود (به اصطلاح Test Levels) عبارتند از:
این سطح از تست، پایهایترین سطح است. در این سطح هر واحد (Unit) یا مولفه (Component) از کد برنامه بهصورت مستقل سنجیده و صحت آن بررسی میشود.
Unit testing یک جزء اساسی از فرایند برنامهنویسی است که در آن هر بخش کوچک (یا واحد) از نرمافزار مورد آزمون و ارزیابی قرار میگیرد. در این فرآیند، برنامهنویسان قطعات کوچکی از محصول نرمافزاری را تست میکنند تا اطمینان حاصل کنند که هر قسمت به درستی عمل میکند.
به عنوان مثال، اگر یک برنامهنویس یک تابع را برای محاسبه مجموع دو عدد مینویسد، میتواند با استفاده از Unit testing این تابع را تست کند تا اطمینان حاصل کند که در همه حالات ممکن، نتایج صحیحی را تولید میکند. این کار به برنامهنویس کمک میکند تا از عملکرد صحیح نرمافزار اطمینان حاصل کند و باعث میشود نرمافزار به صورت کلی پایدارتر و قابل اعتمادتر باشد.
در این سطح، وجود و صحت ارتباط بین مولفهها تست میشود. برای مثال: آیا بخش A و بخش B ارتباط دارند؟ آیا این ارتباط صحیح و دلخواه است؟
در این سطح، یک نمونه اولیه از برنامه (قبل از انتشار) ساخته میشود و درستی عملکرد توابع و بخشهای مختلف در مقیاس کلی برنامه سنجیده میشود. به عبارتی عملکرد کل سیستم ارزیابی میشود.
تست پذیرش آخرین سطح است. در این سطح، برنامه از دیدگاه کاربر نهایی (حتی گاهی به صورت آزمایشی و با کاربر واقعی) ارزیابی میشود.
پیش از هر چیز، باید بدانید تعداد بسیار زیادی تست نرمافزار وجود دارد که هرکدام بسته به نیاز سازمان، محصول و تسترها میتوانند مفید باشند. البته در مورد بعضی از تستها، با توجه به اهمیت بالای آنها در تعیین نتیجه نهایی، انجام آنها ضروری است.
تست عملکردی همانطور که از نام آن مشخص است، تستی است که عملکرد نرمافزار را بررسی میکند. این تست شامل هر نوع تستی میشود که صحت عملکردی برنامه، توابع، Unitها و … را به شکلی دقیق بررسی میکنند.
تست غیر عملکردی هم رفتار برنامه را در موقعیتهای مختلف بررسی میکند. این تست به عملکرد برنامه کاری ندارد، بلکه بیشتر جنبههایی از نرمافزار را بررسی میکند که چندان به عملکرد خاصی مرتبط نیستند؛ مانند Localization, Scalability, Performance, Load, Stress و ….
این روش خود شامل چندین نوع تست میشوند که در مقاله تست عملکردی و غیر عملکردی در بلاگ آسا، میتوانید بیشتر با آنها آشنا شوید.
A/B Testing زمانی انجام میشود که میخواهید بین دو حالت برنامه، یعنی حالت فعلی و حالت بهبود یافته بررسی و مقایسه انجام دهید. در این تست، دو ورژن از برنامه یعنی ورژن فعلی و ورژن تغییر یافته به دست کاربر میرسد و بازخورد کاربر از هر ورژن ثبت میشود. معمولا این تست در محیط آزمایشی انجام میشود.
عبارت Ad-hoc به معنای کاری یا چیزی است که بدون برنامه قبلی ایجاد شده است. در این نوع تست فرایند بدون هیچ برنامه، دانش یا پیشنیاز قبلی انجام میشود و بخشهای مختلف نرمافزار به صورت کاملا تصادفی تست و بررسی میشوند.
در تست Ad-hoc از تست هیچ روال مشخص یا تست کیسی استفاده نمیشود. شاید انجام چنین تستی در ابتدا سخت به نظر برسد، اما معمولا اشکالاتی را نمایان میکند که در سایر تستها به دست نمیآیند.
پیش از اینکه نرمافزار وارد بازار شود، لازم است که نمونه کامل آن در داخل سازمان تست شود. تست آلفا که از انواع تست عملکردی است، توسط تیمی از داخل مجموعه یا کاربرانی که به مجموعه دعوت شدهاند، انجام میشود. به طور معمول تیم تضمین کیفیت این تست را انجام میدهد.
تست بتا به عبارتی همان تست پذیرش است که در آن، نسخه اولیه (بتا) از نرمافزار به تعدادی از کاربران خارج از سازمان ارائه میشود. این کاربران که به نسخه بتا دسترسی دارند، تمام جنبههای عملکردی و کارایی برنامه را میسنجند و بازخوردی که از آنها گرفته میشود، روی بهبود نسخههای بعدی و کاهش باگهای نسخه فعلی تاثیر میگذارد.
در تست بازیابی، رفتار نرمافزار در زمان کرش کردن (Crash) و زمانهایی که با اختلال روبرو میشود بررسی میشود. حتی اگر نرمافزار شما یک نمونه عالی و بینقص باشد، باز هم امکان کرش کردن آن وجود دارد؛ بنابراین باید از قبل فرایندی را پیشبینی کنید که در صورت بروز اختلال، نرمافزار در سریعترین حالت ممکن به حالت عادی خود برگردد.
پیش از انتشار و توسعه یک برنامه، لازم است به برخی از استانداردها توجه کنیم. تست انطباق در واقع میزان هماهنگی و پیروی برنامه از استانداردهایی را نشان میدهد که یا توسط سازمانهای قانونگذاری و یا توسط مدیران خود سازمان تعیین میشوند.
اگر بخواهید یک عملکرد یا مولفه را برنامه تغییر بدهید، باید مجدد برنامه را تست کنید تا از صحت عملکرد آن بعد از تغییر مطمئن شوید. در این حالت باید از تست رگرسیون استفاده کنید. البته بهتر است تست رگرسیون با استفاده از ابزار انجام شود تا از صرف زمان زیاد جلوگیری شود.
در تست منفی، ورودیهای اشتباه به برنامه داده میشود تا عملکرد آن در مقابل داده اشتباه مشخص شود. در چنین حالتی برنامه باید بتواند خطا را تشخیص و اطلاع دهد. در تست مثبت اما دقیقا برعکس عمل میکنیم. در این حالت ورودی برنامه دادههای صحیح هستند که برنامه باید بتواند به درستی آنها را پردازش کند و نتیجه مورد نظر را تحویل دهد تا صحت عملکردی آن تایید شود.
یکی از تستهای مهم در پروسه توسعه و انتشار نرمافزار، تست آسیبپذیری است. این تست به نوعی تست امنیتی است که نقاط آسیبپذیر برنامه را پیدا میکند و با نشان دادن این حفرههای امنیتی، رفع آنها را سادهتر میکند. وجود باگ و حفرههای امنیتی در نرمافزار میتواند مشکلاتی را به وجود بیاورد که رفع آنها، نیازمند هزینه و انرژی بسیاری است و ممکن از صدمات جبران ناپذیری به کسب و کار بزند.
در این تست، سازگاری برنامه با محیطهای اجرایی مختلف تست میشود. برای مثال یک وب اپلیکیشن باید بتواند در مرورگرهای مختلف و سیستم عاملهای مختلف به درستی اجرا شود. این تست سازگاری سختافزاری یک برنامه را هم ارزیابی میکند.
تست اکتشافی یکی از روشهای متفاوت انجام تست است که در آن، فرد برنامه را از جهات مختلف تست میکند. این فرایند بیشتر شامل تست کاربردی نرمافزار میشود و تستر همزمان با تست در حال یادگیری جنبههای مختلف برنامه است.
در این روشهای تست، همانطور که از نام آنها مشخص است تست به صورت دستی، اتومات یا نیمه اتومات انجام میشود. در روش دستی تست توسط اپراتور انجام میشود و از ابزارهای اتوماسیون استفاده نمیشود. در این نوع تست تک تک جزئیات تست میشوند.
در روش اتومات، برخی از تستهای روتین توسط ابزار اتوماسیون بهصورت خودکار انجام میشوند تا بار کاری از سمت اپراتور حذف شود. در روش نیمه اتومات هم ترکیبی از هر دو حالت را داریم.
در کنار تست کد و نمونههای اولیه برنامه در طی توسعه که تست پویا یا داینامیک نام دارد، روش دیگری از تست هم وجود دارد. تست استاتیک یا ایستا، روشی از تست است که در آن تست با استفاده از مشاهدات، ارزیابیها و فعالیتهای تحلیلی انجام میشود. تست استاتیک روی سورس کد با کمک برنامههای کامپایلر و برنامهنویس انجام میشود.
اگر در فرایند تست به دنبال هدف و پاسخ خاصی باشیم،میتوانیم از تست اسکریپت استفاده کنیم. در تست از پیش تعریف شده، نیازمندیها، مراحل و نتایج مورد نیاز تست تعریف میشود و تستر با این دانش برنامه را ارزیابی میکند.
رویکرد آبشاری یکی از روشهای سنتی انجام تست است که در آن، تیم تست کننده نرمافزار از تیم برنامهنویس جدا هستند. این فرایند تست معمولا بعد از پایان مراحل توسعه شروع میشود؛ اما در برخی موارد همزمان با توسعه نیز میتوان از این تست استفاده کرد.
رویکرد اجایل یک روش نوین برای اجرای تست است. در این رویکرد تاکید بر توسعه و تست همزمان برنامه است. در واقع در این تست، برنامهنویسان و توسعهدهندگان هستند که همزمان با فرایند توسعه، برنامه را مرحله به مرحله میسنجند.
در زمان اجرای انواع مختلف تست در مراحل مختلف، میتوانید رویکردهای متفاوتی داشته باشید. این رویکردها، با عنوان استراتژی انجام تست هم شناخته میشوند. در واقع این روشها به ما میگویند که چگونه تست خود را انجام دهیم و چه مسیری را در پیش بگیریم.
رایجترین روشهای تست نرمافزار عبارتند از:
در تست جعبه، برنامه به عنوان یک جعبه در نظر گرفته میشود که با توجه به مرحله تست، دسترسیها و زاویه دید تستر، شفاف، تاریک یا حد فاصل این دو حالت است. حالت شفاف به اصطلاح جعبه سفید، حالت گنگ و تاریک به اصطلاح جعبه سیاه و حالت میانی جعبه طوسی نام دارد.
در روش تست Black-box Testing، عملکرد کلی نرمافزار بدون شناخت عناصر و زیرساخت آن سنجیده میشود. به عبارتی برنامه مانند یک جعبه تاریک است که تستر از محتویات درون آن خبر ندارد. این تست معمولا در مراحل نهایی توسعه و تست (تست پذیرش) انجام میشود.
در این روش، برعکس روش قبل عمل میکنیم و اجزای نرمافزار مانند کد، کامپوننت و … تست و بررسی میشوند. در واقع با داشتن اطلاعات راجع به برنامه، ورودیهای مختلف به آن داده میشود تا نتیجه به دست آمده بررسی شود. از این روش معمولا در سطوح ۱، ۲ و ۳ استفاده میشود.
در این حالت، تستر با اطلاع از ساختارهای برنامه، آن را در مرحله نهایی تست میکند. در این تست، برنامه توسط فردی که با زیرساخت آشنا است به عنوان کاربر تست میشود و خروجیهای مختلف به ازای مقادیر مختلف ورودی تست میشوند.
پس از تمام توضیحات بالا، در نهایت به این میرسیم که یک نرمافزار را در چه سطحی، با چه نوع و چه رویکردی تست کنیم. با کنار هم قرار دادن این دانش و پیشنیازهای بهدست آمده از مراحل توسعه نرمافزار، میتوانید به راحتی مراحل تست را طبق چرخه حیات آن پیادهسازی و اجرا کنید.
به طور کلی ابزارهای تست نرمافزار مختلفی وجود دارد که این فرایند را سادهتر و سریعتر میکند. شناخته شدهترین ابزارها عبارتند از:
تست نرمافزار مقولهای گسترده و بسیار مهم است که هرچه زمان میگذرد، به روشها و انواع آن اضافه میشود. امروزه بیشتر تستهای نرمافزاری توسط ابزارهایی که در بالاتر به آنها اشاره کردیم انجام میشوند؛ اما نباید از نقش تستر انسانی در این فرایند غافل شد.
هر سازمانی که در حال توسعه یک محصول است، باید به فکر داشتن حداقل یک فرد خبره در زمینه تست (محصول) باشد. وجود این فرد با هزینهای بسیار منطقی، از هزینههای گزافی که در صورت وجود مشکل در محصول به وجود خواهد آمد، پیشگیری میکند.