آنچه در این صفحه می خوانید:
- تست نرم افزار چیست؟
- چرا تست نرم افزار ها امری ضروری است؟
- انواع تست نرم افزار
- تست واحد (Unit Testing) چیست؟
- کاربرد تست واحد (Unit Testing)
- مزایای تست واحد (Unit Testing)
- فریمورک های تست واحد (Unit Testing)
تست نرم افزار چیست؟
تست نرم افزار تحقیقاتی است که اطلاعاتی را برای ذینفعان فراهم می آورد و به کیفیت محصول یا خدمات نرم افزاری تحت تست می پردازد. تست نرم افزار همچنین می تواند یک دیدگاه مستقل و عینی از نرم افزار ارائه دهد تا به تجارت اجازه دهد تا خطرات اجرای نرم افزار را درک کند. تکنیک های تست شامل روند اجرای یک برنامه یا اپلیکیشن با هدف پیدا کردن اشکالات نرم افزاری (خطاها یا سایر نقص ها) و تأیید صحت این محصول نرم افزاری برای استفاده می باشد.
چرا تست نرم افزار ها امری ضروری است؟
- شناسایی خطا ها و نقص های نرم افزار در مراحل توسعه
- تضمین رضایت و اعتماد مشتری به برنامه
- اطمینان از کیفیت محصول
- ارائه امکانات با کیفیت و با هزینه کمتر تعمیرات به مشتریان و حصول نتایج بهتر
- اجرای موثر برنامه کاربردی نرم افزار یا محصول
- اطمینان حاصل کنید که برنامه نباید به هیچ گونه خرابی منجر شود، زیرا در آینده یا در مراحل بعدی توسعه می تواند بسیار گران تمام شود.
- ثابت نگه داشتن شرایط کسب وکار
انواع تست نرم افزار
آموزش تست واحد (Unit testing)
کوچکترین قسمت قابل تست نرم افزار، واحد می باشد که در طی تست واحد، هر واحد به طور جداگانه و دقیق تست می شود.
آموزش تست استاتیک (Static testing)
تکنیک تست نرم افزاری است که در آن نرم افزار بدون اجرای کد مورد تست قرار می گیرد.
آموزش تست یکپارچه سازی (Integration testing)
تست یکپارچه سازی فرآیند توسعه نرم افزاری است که واحدهای برنامه را به صورت چند گانه ترکیب و تست می کنند.
آموزش تست نفوذ (Penetration Testing)
Penetration testing یا pen testing به معنای تست نفوذ، انجام تست سیستم کامپیوتری، شبکه یا برنامه وب برای شناسایی آسیب پذیری هایی است که مهاجم می تواند از آن استفاده کند.
آموزش تست خودکار (Automated Testing)
تست خودکار تکنیک است که اپلیکیشن یا نرم افزار برای پیاده سازی کل چرخه عمر نرم افزار در زمان کم از آن استفاده و بهره وری و اثربخشی را برای نرم افزار تست فراهم می کند.
تست واحد (Unit Testing) چیست؟
در برنامه نویسی رایانه، تست واحد یک روش تست نرم افزاری است که با استفاده از آن قطعه های جداگانه سورس کد، مجموعه های یک یا چند ماژول برنامه کامپیوتری به همراه داده های کنترل، رویه های کاربردی و رویه های عملیاتی، تست می شوند تا مشخص شود که آیا مناسب برای استفاده هستند.
تست واحد شامل شکستن برنامه شما به قطعه های کوچکتر و قرار دادن هر قطعه برای یک سری آزمایشات است. معمولاً تست ها به صورت برنامه های جداگانه اجرا می شوند، اما روش تست بسته به زبان و نوع نرم افزار (GUI، خط فرمان، کتابخانه) متفاوت است. در اکثر زبان ها فریمورک های تست واحد وجود دارد، شما باید یکی از موارد مورد نظر خود را جستجو کنید. معمولاً پس از هر تغییر سورس کد، تست ها بصورت دوره ای انجام می شود.
تست های واحد معمولاً تست های خودکار هستند که توسط توسعه دهندگان نرم افزار نوشته شده و اجرا می شوند تا اطمینان حاصل شود که بخشی از برنامه (معروف به "واحد") طراحی آن را برآورده و رفتار می کند. در برنامه نویسی رویه ای، یک واحد می تواند یک ماژول باشد، اما معمولاً یک تابع یا رویه فردی است. در برنامه نویسی شی گرا، یک واحد اغلب یک رابط کل مانند کلاس است، اما می تواند یک روش فردی باشد. با نوشتن تست ها ابتدا برای کوچکترین واحدهای تست پذیر، و سپس رفتارهای پیچیده بین آن ها، می توان تست های جامع برای برنامه های پیچیده ایجاد کرد. برای جداسازی مواردی که ممکن است پیش بیاید، هر مورد تستی باید بطور مستقل تست شود.
در حین توسعه، فرد توسعه دهنده نرم افزار می تواند معیارها یا نتایجی را که خوب شناخته شده را وارد تست کند تا صحت واحد را بررسی کند. در حین اجرای مورد آزمون، فریمورک های تست ورود به سیستم که هیچ معیار را ندارند و به صورت خلاصه گزارش می دهند.
نوشتن و نگهداری از تست های واحد با استفاده از تست های پارامتری (PUT) سریعتر انجام می شود. این روش باعث می شود تا چندین بار تست را با مجموعه های مختلف ورودی انجام دهید، بنابراین تکثیر کد آزمون کاهش می یابد. بر خلاف تست های واحد سنتی، که معمولاً روش های بسته و تست شرایط نامساعد هستند، PUT ها مجموعه ای از پارامترها را در نظر می گیرند. PUT توسط TestNG، JUnit و همتای دات نت آن، XUnit پشتیبانی می شود. پارامترهای مناسب برای تست واحد ممکن است به صورت دستی تأمین شود یا در برخی موارد بطور خودکار توسط فریمورک تست تولید می شود. در سال های اخیر پشتیبانی از نوشتن تست های قدرتمندتر (واحد)، اعمال نفوذ مفهوم تئوری ها، موارد تست که مراحل مشابه را اجرا می کنند، اما با استفاده از داده های آزمون تولید شده در ران تایم، برخلاف تست های پارامتری منظم که از مراحل اجرای مشابه با مجموعه های ورودی استفاده می کنند، از پیش تعریف شده اند.
کاربرد تست واحد (Unit Testing)
تست واحد سنگ بنای برنامه نویسی مفرط (Extreme programming) است که به یک فریمورک تست خودکار واحد متکی است. این فریمورک تست واحد اتوماتیک می تواند شخص ثالث باشد، به عنوان مثال xUnit یا در گروه توسعه ایجاد شود.
برنامه نویسی مفرط از ایجاد تست های واحد برای توسعه تست محور استفاده می کند. توسعه دهنده تست واحد را می نویسد که یک نرم افزار یا نقص را در معرض دید شما قرار می دهد. این آزمون به دلیل عدم موفقیت لازم هنوز اجرا نمی شود، یا به دلیل اینکه عمداً نقص کد موجود را آشکار می کند. سپس، توسعه دهنده ساده ترین کد را برای انجام تست، به همراه سایر تست ها، می نویسد.
بیشتر کد در سیستم تست واحد انجام می شود. برنامه نویسی مفرط، روش "تست همه چیزهایی را که احتمالاً می توانند قطعه شوند" باشد، به روش سنتی "تست هر مسیر اجرا" تست می کند. این امر باعث می شود كه توسعه دهندگان تست های كمتری نسبت به روش های كلاسیك ایجاد كنند، اما این مسئله واقعاً مشكلی نیست، زیرا باز هم روش های كلاسیك به ندرت به طور كاملاً روشمند دنبال می شوند تا تمام راه های اجرای كاملاً تست شده باشند. برنامه نویسی مفرط به سادگی تشخیص می دهد که تست به ندرت جامع است (زیرا اغلب اقتصادی بودن آن بسیار گران و وقت گیر است) و راهنمایی هایی در مورد نحوه تمرکز مؤثر بر منابع محدود ارائه می دهد.
از لحاظ حیاتی، کد قابل تست مهمترین موضوع پروژه درجه یک محسوب می شود به این دلیل که با همان کیفیت کد اجرای آن حفظ می شود و همه نسخه های برداری آن برداشته می شود. توسعه دهندگان کد تست واحد را به همراه کدی که تست می کند، به مخزن کد می فرستند. تست دقیق واحد برنامه نویسی مفرط، مزایای ذکر شده در بالا را امکان پذیر می کند، از جمله ساده تر و با اطمینان تر کردن کد و تغییر کاربری مجدد، ادغام کد ساده، مستندات دقیق و طراحی های مدولار. این تست های واحد به طور مداوم به عنوان نوعی از آزمون رگرسیون اجرا می شوند.
مزایای تست واحد (Unit Testing)
هدف از تست واحد، جداسازی هر قسمت از برنامه و نشان دادن درست بودن قسمت های مجزا است. تست واحد، یک قرارداد کتبی دقیق و سختگیرانه را ارائه می کند که کد باید آن را برآورده کند. در نتیجه، مزایای مختلفی دارد.
تست واحد در اوایل چرخه توسعه مشکلاتی را پیدا می کند. این شامل هر دو اشکال در اجرای برنامه نویس و نقص ها یا قسمت های از بین رفته در مشخصات مربوط به واحد است. روند نوشتن مجموعه کاملی از تست ها، نویسنده را وادار می کند تا از طریق ورودی ها، خروجی ها و شرایط خطا فکر کند و به این ترتیب با دقت بیشتری رفتار مطلوب واحد را تعریف کند. هزینه یافتن یک اشکال قبل از شروع کد نویسی یا هنگامی که کد برای اولین بار نوشته شده است به میزان قابل توجهی پایین تر از هزینه شناسایی و تصحیح اشکال بعدا است. اشکالات موجود در کد منتشر شده همچنین ممکن است برای کاربران نهایی نرم افزار مشکلات پر هزینه ای ایجاد کند. اگر کد نویسی نادرست باشد، می توان کد را غیرممکن یا دشوار دانست، بنابراین تست واحد می تواند برنامه نویسان را وادار به ساختن توابع و اشیاء به روش های بهتری کند.
در توسعه محور تست (TDD)، که اغلب در برنامه نویسی مفرط و اسکرام استفاده می شود، تست های واحد قبل از نوشتن کد ایجاد می شوند. وقتی تست ها انجام شد، آن کد کاملاً در نظر گرفته می شود. در صورت عدم موفقیت در تست های واحد، این یک اشکال در کد تغییر یافته یا خود تست ها محسوب می شود. تست های واحد اجازه می دهد تا محل گسل یا عدم موفقیت به راحتی ردیابی شود. از آنجا که تست های واحد قبل از واگذاری کد به تست کنندگان یا مشتری ها، تیم توسعه دهنده را هشدار می دهد، مشکلات احتمالی در مراحل ابتدایی توسعه قرار می گیرند.
تست واحد به برنامه نویس اجازه می دهد تا کد دفاتر پیمایش یا کتابخانه های سیستم را بعداً به روز کند، و اطمینان حاصل کند که این ماژول هنوز به درستی کار می کند. روال نوشتن فایل های قابل تست برای کلیه تابع ها و متد ها است به گونه ای که هر وقت تغییری باعث ایجاد خطا شود، می توان به سرعت شناسایی کرد. تست های واحد تغییراتی را که ممکن است یک قرارداد طراحی را خراب کند، تشخیص می دهد.
تست واحد ممکن است عدم اطمینان در واحدها را کاهش دهد و در یک روش سبک تست از پایین به بالا قابل استفاده است. با تست قسمت های اولیه یک برنامه و سپس تست مقدار قطعات آن، تست یکپارچه سازی آسان تر می شود. تست واحد نوعی مستندات زنده از سیستم را ارائه می دهد. توسعه دهندگان به دنبال یادگیری چه عملکردی توسط یك واحد و چگونگی استفاده از آن می توانند برای دستیابی به درک اساسی از رابط واحد (API) به تست واحد نگاه كنند.
خصوصیات تست واحد ویژگی هایی را نشان می دهد که برای موفقیت واحد بسیار مهم است. این خصوصیات می تواند نشانگر استفاده مناسب / نامناسب از یک واحد و همچنین رفتارهای منفی باشد که توسط واحد به دام می افتند. یک مورد تست واحد، به خودی خود، این خصوصیات مهم را مستند می کند، اگرچه بسیاری از محیط های توسعه نرم افزار فقط به کد متکی نیستند تا محصول را در حال توسعه بسازند.
هنگامی که نرم افزار با استفاده از رویکرد تست محور تولید می شود، ترکیب نوشتن تست واحد برای مشخص کردن رابط به علاوه فعالیت های refactoring انجام شده پس از گذشت آزمون ممکن است محل طراحی رسمی باشد. هر تست واحد را می توان به عنوان یک عنصر طراحی مشخص کرد که کلاس ها، روش ها و رفتار قابل مشاهده را مشخص می کند.
فریمورک های تست واحد (Unit Testing)
فریمورک های تست واحد اغلب محصولات شخص ثالث هستند که به عنوان بخشی از مجموعه کامپایلر توزیع نمی شوند. آنها برای ساده سازی فرایند تست واحد، که برای طیف گسترده ای از زبان ها ایجاد شده اند، کمک می کنند. نمونه هایی از فریمورک های تست شامل راه حل های اوپن سورس مانند فریمورک های مختلف تست محور کد که به طور جمعی به عنوان xUnit شناخته می شوند، و راه حل های اختصاصی / تجاری مانند: Cantata برای سی و سی پلاس پلاس و دات نت، ++TBrun ،JustMock ،Parasoft ،Testwell CTA و ++VectorCAST/C .
به طور کلی انجام تست واحد بدون پشتیبانی از فریمورک خاص با نوشتن کد کلاینت که واحدهای تحت تست را انجام می دهد و از ادعاها، هندل کردن استثنا یا سایر مکانیسم های جریان کنترل برای شکست سیگنال استفاده می کند. تست واحد بدون فریمورک بسیار ارزشمند است زیرا مانع ورود برای پذیرش تست واحد است. انجام تست های واحد کمی به سختی بهتر از نداشتن هیچ است، در حالی که یک بار فریمورک موجود است، اضافه کردن تست های واحد نسبتاً آسان می شود. در برخی از فریمورک ها، بسیاری از ویژگی های تست واحد پیشرفته وجود ندارد و یا باید با کدگذاری شود.