آزمون نرم‌افزار

آزمون نرم‌افزار یا تست نرم‌افزار (به انگلیسی: software testing) به فرایند ارزیابی نرم‌افزار به منظور اطمینان از عملکرد صحیح آن در رویدادهایی مختلفی که ممکن است در دوره استفاده از نرم‌افزار با آن مواجه شود می‌باشد و به عبارت دیگر پیدا کردن خطاهایی احتمالی یک نرم‌افزار برای عملکرد درست، صحیح و بهینه آن در طول استفاده از آن است. هر چقدر نرم‌افزار بتواند با رویدادها مختلف به صورت مطلوب تر و قابل پذیرش تری چه از نظر عملکرد و چه از راحتی کاربر داشته باشد می‌توان انتظار داشت نرم‌افزار دارای عملکرد بهتری می‌باشد.
آزمون برنامه شامل اجرای بخش‌هایی (کامپوننت‌هایی) از برنامه یا بخش‌هایی از سیستم می‌شود تا مشخصات موردنظر سیستم را ارزیابی کند. به‌صورت کلی این مشخصات مشخص می‌کنند که هرکدام از بخش‌های برنامه ویژگی‌های زیر را تحت عملیات آزمون کردن دارند:
به نیازمندی‌هایی که توسعه و طراحی نرم‌افزار را جهت دهی کرده‌اند رسیده است؟
به انواع ورودی‌ها پاسخ مناسبی می‌دهد؟
عملکرد خود را در زمان قابل قبولی انجام می‌دهد؟
به اندازه کافی کارآمد است؟
آیا می‌توان آن را روی محیطی که برای آن برنامه‌ریزی انجام گرفته‌است نصب و اجرا کرد؟
به نتیجه کلی که مطلوب سرمایه گذاران است دست پیدا کرده‌است؟
همان‌طور که تعداد تست‌های ممکن حتی برای مولفه‌های برنامه‌های ساده اغلب نامحدود هستند، تمامی تست کننده‌های برنامه از روشی استفاده می‌کنند که تست‌هایی ساده و در عین حال مناسب برای زمان و منابع سیستم را انجام دهند. در نتیجه، تست کردن برنامه عموماً در تلاش است تا برنامه یا اپلیکیشن را با رویکرد یافتن حفره‌های برنامه اجرا کند. فرایند تست کردن، پروسه ای همراه با تکرار است یعنی که هنگامی‌که یکی از حفره‌های برنامه درست شد فرایند تست کردن باید مجدداً انجام پذیرد زیرا درست کردن این حفره می‌تواند حفره‌های دیگر، عمیق‌تر یا حتی جدیدی را نمایان کند.
آزمون نرم‌افزار می‌تواند اطلاعات حیاتی و مستقلی دربارهٔ کیفیت برنامه و میزان ریسک شکست یا عدم موفقیت آن در مقابل استفاده‌کنندگان یا اسپانسرهای سیستم را ارائه دهد.
آزمون نرم‌افزاری می‌تواند در زمانیکه برنامه به‌صورت کامل یا حتی قسمتی از آن در دسترس بود انجام پذیرد. فرایند توسعه نرم‌افزار عموماً مشخص می‌کند چه زمانی و به چه صورتی آزمون نرم افزار صورت پذیرد. برای مثال در فرایند فازبندی شده، بیشتر تست کردن‌ها زمانی انجام می‌گیرد که پیش نیازهای سیستم پیدا شده و سپس در برنامه ای قابل آزمون پیاده‌سازی شده‌اند. البته در رویکرد Agile نیازمندی‌ها، برنامه‌نویسی و آزمون نرم‌افزاری عموماً به‌صورت همزمان انجام می‌پذیرند.
در سال‌های اخیر آمارهای شگفت‌آوری از سوی مؤسسه (NIST(National Institute of Standards and
تست نرم‌افزارTechnologyدربارهٔ شکست سیستم‌های نرم‌افزاری ارائه شده‌است. در کشور ایالات متحده، این شکستها سالیانه حدود ۵۹٫۵ میلیارد دلار به اقتصاد این کشور صدمه می‌زند. طبق بررسیهای انجام شده با به‌کارگیری تست در تمام فازهای تولید نرم‌افزار ۲۲٫۲ میلیارد دلار از این خسارت را می‌توان کاهش داد. طبق آمارهای ارائه شده از سوی مؤسسه (IDC(International Data Corporation، چهل درصد از بودجه نرم‌افزارها صرف تست آن می‌گردد. در کشور ما نیز، با توجه به رشد فن آوری اطلاعات و ارتباطات در طی چند سال گذشته و تولید بومی بسیاری از نرم‌افزارهای مورد نیاز، نیاز به این فرایند بیش از پیش احساس شده و در صورت عدم توجه به آن، کاهش کیفیت سیستم‌های ارائه شده، عدم رضایت مشتری و در نهایت از دست دادن بازار را به همراه خواهد داشت.
تست خوب: احتمال پیدا کردن خطاهای کشف نشده توسط ارزیابی زیاد است. تست موفق: که حداقل یک خطای کشف نشده را بیابد تست فقط وجود خطا را نشان می‌دهد و نه عدم وجود آن را. پیدا نشدن خطا در تست به معنای بدون خطا بودن برنامه نیست. اصول تست با توجه به نیازمندیهای کاربر برنامه‌ریزی قبل از اجرا (test plan) نوشتن برنامه تست قانون پارتو %۸۰ خطاهای کشف نشده در ۲۰٪ کد است تست باید از اجزای کوچک شروع شود ممکن نیست (exhaustive) تست کامل برای مؤثر بودن باید توسط شخص ثالث بی‌طرف انجام شود معیارهای تست پذیر بودن نرم‌افزار:
قابلیت اجرا Operability – هرچه نرم‌افزار بهتر کار کند و در محیط‌های بیشتری قابل اجرا باشد، n بهتر قابل ارزیابی است
مشاهده‌پذیری Observability – قابلیت مشاهده نتایج ارزیابی
کنترل‌پذیری Controlability – قابلیت اجرای تستهای خودکار (مثل امکان اجرای خودکار تست‌های واحد توسط jUnit برای زبان جاوا)
تجزیه‌پذیری Decomposability – ارزیابی می‌تواند هدفمند تر شود
سادگی Simplicity – کاهش پیچیدگی معماری و منطق برنامه
پایداری Stability – برای ارزیابی تغییرات کمی بخواهد
درک‌پذیری Understandability – قابلیت درک طراحی و وابستگیهای بین اجزا
سطوح مختلف آزمون:
آزمون واحد (Unit testing)
آزمون یکپارچه‌سازی افزایشی
آزمون یکپارچه‌سازی (Integration testing)
آزمون سیستم (System testing)
آزمون پذیرش (Acceptance testing)
آزمون آلفا
آزمون بتا