تست واحد: در برنامهنویسی، تست واحد روشی است برای آزمودن واحدهای کوچکی از کد منبع برنامه و اطمینان از درست کار کردن آنها؛ در این روش، درستی هر قسمت از کد، که به آن «واحد» گفته میشود، با استفاده از کدهای دیگری که توسط برنامهنویس نوشته شده ارزیابی میگردد. در زبانهای شیءگرا، معمولاً این کار با استفاده از یک کلاس مستقل انجام میشود، اگر چه میتواند تنها با استفاده از یک متد نیز صورت بپذیرد.
در حالت ایدهآل هر کدام از آزمایشها از بقیه مستقل است. معمولاً تست واحد ها توسط توسعهدهندگان نرمافزار به کار گرفته میشوند. نحوهٔ تست واحدمیتواند از ارزیابی نتیجه روی کاغذ، تا اجرای خودکار چندین آزمایش توسط برنامه و تحلیل نتیجهٔ آنها توسط خود برنامه، متغیر باشد.
نشتی حافظه درتست نرم افزار موضوعی است که هم یک مشکل کارایی (به دلیل اتلاف حافظه) و هم یک مشکل امنیتی محسوب میگردد (به دلیل مصرف بیرویه حافظه که نهایتا منجر به پرشدن حافظه و پایین آمدن سرور میشود و این معضل در تست نرم افزار بطور مستمر مشخص شود). بررسی این مشکل در برنامهنویسی سیستمهای سطح پایین (تولید شده با زبانهایی همچون C و ++C) از اهمیت خاصی برخوردار است و یکی از مهم ترین مراحل بشمار می آید. چرا که به دلایلی همچون عدم وجود virtual machine در زبانهای سطح پایین و امکان استفاده مستقیم از اشاره گرها (pointer)، تشخیص این مشکل بسیار پیچیده است.
البته مشکل نشتی حافطه در زبانهای سطح بالایی همچون Java و #C نیز که در یک محیط sandbox اجرا میشوند، به دلیل برنامهنویسی نامطلوب میتواند رخ دهد و لذا برنامهنویسان باید دقت کافی در این زمینه را بنمایند.
متدولوژی STEP که حروف اختصاری Systematic Test and Evaluation Process است، یک متدولوژی برای تست سیستماتیک و مبتنی بر استانداردهای IEEE برای افزایش کیفیت نرم افزار میباشد.
متدولوژی (TDD(Test-driven development در تست نرم افزار
در این مقاله قصد داریم نگاه عمیقتری به تست نرم افزار، شیوهها و کاربردهای آن داشته باشیم. اگر بخواهیم از تست نرم افزار تعریفی ساده داشته باشیم میتوان گفت" تست نرم افزار فرآیند اجرای یک برنامه کاربردی با هدف پیدا کردن اشکالات و متعاقبا بهبود کیفیت نرم افزار است". تست نرم افزاربه عنوان یک فرایند کلیدی در تضمین کیفیت نرم افزار سیستمهای نرم افزاری ایفاء نقش میکند. در حال حاضر تست به عنوان یک صنعت در حوزه نرمافزار محسوب میشود. در سالهای اخیر آمارهای شگفت آوری از سوی موسسه (NIST(National Institute of Standards and تست نرم افزارTechnologyدرباره شکست سیستمهای نرم افزاری ارائه شده است. در کشور ایالات متحده، این شکستها سالیانه حدود 59.5 میلیارد دلار به اقتصاد این کشور صدمه میزند. طبق بررسیهای انجام شده با بکارگیری تست نرم افزار در تمام فازهای تولید نرم افزار 22.2 میلیارد دلار از این خسارت را میتوان کاهش داد. طبق آمارهای ارائه شده از سوی موسسه (IDC(International Data Corporation، چهل درصد از بودجه نرم افزارها صرف تست آن میگردد.در کشور ما نیز، با توجه به رشد فناوری اطلاعات و ارتباطات در طی چند سال گذشته و تولید بومی بسیاری از نرم افزارهای مورد نیاز، نیاز به این فرایند بیش از پیش احساس شده و در صورت عدم توجه به آن، کاهش کیفیت سیستمهای ارائه شده، عدم رضایت مشتری و در نهایت از دست دادن بازار را به همراه خواهد داشت.
امروزه بسیاری از کارها در زندگی شخصی، صنعت، امور نظامی و غیره به نرم افزارها سپرده شده است. گاهی یک اشتباه کوچک نرمافزاری میتواند سبب خسارات جبران ناپذیری شود. برای تشریح موضوع به چند نمونه اشاره میگردد.
در سال 1994 خطای محاسبات اعشاری در پردازنده پنتیوم شرکت اینتل، علاوه بر کاهش فروش آن، اعتبار شرکت را تا مدتی خدشهدار کرد.
در سال 1998 مدارگرد مریخ به دلیل یک خطا در محاسبات نرم افزاری، در جهت اشتباهی وارد اتمسفر مریخ شده و منفجر گردید. 327 میلیون دلار صرف این پروژه شده بود.
در سال 1996 ماهواره بر آریان پنج، 38 ثانیه بعد از پرتاب در ارتفاع 3700 متری زمین منفجر شد. علت اصلی این حادثه در اثر سرریز در واحد ممیز شناور اندازهگیری شتاب افقی این ماهواره بر بود. 7 میلیارد دلار و 10 سال زمان برای ساخت این ماهواره بر هزینه شده بود. همچنین باری که این ماهواره بر حمل میکرد، 500 میلیون دلار ارزش داشت.
تنها 26% از پروژه های نرم افزاری دنیا با موفقیت اجرا میشوند. معیار های موفقیت پروژه عبارتنداز:
اتمام به موقع
با بودجه تعیین شده
با تمام قابلیتها و عملکردهای مورد نظر
بدون خطا (با خطای جزئی)
تست نرم افزار بسیاری از پروژههای تولید نرم افزار با شکست مواجه میشوند، هزینه بالایی صرف پروژههای شکست خورده میگردد .
در آمریکا، بیش از 81 میلیارد دلار صرف پروژههای شکست خورده میشود
در انگلیس، بیش از 33 میلیارد دلار صرف پروژههای شکست خورده میشود.
شرکت گوگل برای تست نرم افزار، سه نقش زیر را درنظر گرفته است:
Software Engineer
Software Engineer in Test
Software Tester
مهندس نرم افزار در تست نرم افزار، در کنار تولید قابلیت های سیستم یعنی Feature development وظیفه تست قابلیت های تولید شده در سطح برنامه را نیز برعهده دارد یعنی Test development نیز انجام می دهد. در تست نرم افزار در هر صورت برای تولید تستها، از آنجاییکه نیاز به دانش آزمون و خصوصا زیرساخت آزمون می باشد، مهندس تست نرم افزارر (دومین نقش)، وارد کار می شود که فعالیت های اصلی آن در تست نرم افزار عبارت است از: کمک به برنامه نویس (مهندس نرم افزار) برای تولید آزمون واحد، آماده سازی زیرساخت آزمون شامل چارچوب آزمون و ماک-آبجکت ها، و نهایتا آزمون یکپارچه سازی قابلیت ها. تست نرم افزار، وظیفه آزمون های سطح کاربری و پذیرش را برعهده دارد و به اصطلاح کارUser development را انجام می دهد که شامل تهیه سناریوهای آزمون در سطح کاربری می باشد.
برخی از اصولی که در تولید نرم افزار در شرکت گوگل بکار گرفته می شود، عبارت است از:
استفاده از روش تولید مبتنی بر آزمون یا همان Test Driven Development
ارائه پایه ای ترین (ولی در عوض، موردنیازترین) قابلیت های یک محصول و ارائه آن به مصرف کننده و سپس گرفتن فیدبک کاربرنهایی. البته قبل از تحویل همین نسخه ساده، تست های مورد نیاز در تست نرم افزار در سطح تولید و کاربری برروی آن انجام می شود و بعد از پاس شدن تمام تستهای مورد نیاز، محصول اولیه به کاربر داده می شود.
استفاده از تکنیک تحلیل ایستا و مرور دستی در کنار آزمون (پویا) + اجرای مجدد تست ها (آزمون رگراسیون) بعد از برطرف سازی مشکلات شناسایی شده در تحلیل و مرور کد.
استفاده از یک ریپازیتوری مشترک بین تولیدکنندگان با ارائه دسترسی و قرار دادن ماژولهای پایه ای در آن. تولیدکنندگان تا حد امکان باید از ماژولهای پایهای موجود که قبلا تولید و تست شده است، استفاده نمایند.
استفاده از مکانیزم های تشویقی برای برنامه نویسانی که کد تمیز می نویسند.
تست نرم افزار در سه سطح Small, Medium, Large که تقریبا معادل آزمونهای زیراست Unit, Integration, System