تست نفوذ با مرحله پیشبرد مشارکت (pre-engagement) آغاز میشود که شامل گفتگو با مشتری در مورد اهداف تست نفوذ، نگاشت دامنه (وسعت و پارامترهای تست) و غیره است. وقتی تستر نفوذ و مشتری در مورد دامنه، فرمت گزارش و سایر موضوعات به توافق رسیدند، تست نفوذ واقعی آغاز میشود.
در مرحله جمعآوری اطلاعات در تست نفوذ، تستر نفوذ اطلاعات موجود در مورد کلاینت را جستجو میکند و راههای بالقوه اتصال به سیستمهای آن را شناسایی میکند. در مرحله مدل سازی تهدید (threat modeling) اگر یافته ها اجازه دهد مهاجم به سیستم وارد شود، تستر از این اطلاعات برای تعیین ارزش هر یافته و تأثیر آن بر مشتری استفاده میکند. در تست نفوذ این ارزیابی به تستر نفوذ اجازه میدهد تا برنامه عملیاتی و روشهای حمله را توسعه دهد.
تست نفوذ (penetration testing) عبارت است از شبیهسازی حملات واقعی جهت ارزیابی مخاطرات مربوط به نقض امنیتی بالقوه. در تست نفوذ، تسترها نه تنها آسیبپذیریهایی را که میتواند توسط مهاجمان مورد استفاده قرار گیرد، کشف میکنند، بلکه در صورت امکان، آسیبپذیریها را به منظور ارزیابی آنچه که ممکن است مهاجمان بعد از بهرهبرداری موفق به دست بیاورند، مورد استفاده قرار میدهند.
در مواقعی یک خبرنامه در مورد آسیب یک شرکت بزرگ توسط یک حمله سایبری منتشر میشود. اغلب مهاجمان از آخرین و بزرگترین zero-day ها (آسیب پذیریهای وصله نشده توسط ناشران نرم افزاری) استفاده نمیکنند.
تست واحد: در برنامهنویسی، تست واحد روشی است برای آزمودن واحدهای کوچکی از کد منبع برنامه و اطمینان از درست کار کردن آنها؛ در این روش، درستی هر قسمت از کد، که به آن «واحد» گفته میشود، با استفاده از کدهای دیگری که توسط برنامهنویس نوشته شده ارزیابی میگردد. در زبانهای شیءگرا، معمولاً این کار با استفاده از یک کلاس مستقل انجام میشود، اگر چه میتواند تنها با استفاده از یک متد نیز صورت بپذیرد.
در حالت ایدهآل هر کدام از آزمایشها از بقیه مستقل است. معمولاً تست واحد ها توسط توسعهدهندگان نرمافزار به کار گرفته میشوند. نحوهٔ تست واحدمیتواند از ارزیابی نتیجه روی کاغذ، تا اجرای خودکار چندین آزمایش توسط برنامه و تحلیل نتیجهٔ آنها توسط خود برنامه، متغیر باشد.
متدولوژی 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