معرفی و تعریف
تست نرمافزار (Software Testing) فرایند ارزیابی رفتار، کیفیت و پایداری یک محصول نرمافزاری است. هدف آن فقط پیدا کردن خطا نیست، بلکه کاهش ریسک انتشار تغییرات و اطمینان از برآورده شدن نیازمندیهای مهم کاربران و کسبوکار است.
فردی که این مهارت را دارد، سناریوهای آزمون را طراحی میکند، نتیجه مورد انتظار را مشخص میکند، خطاها را همراه با اطلاعات لازم برای بازتولید گزارش میدهد و در صورت نیاز، آزمونها را خودکارسازی میکند. این مهارت شامل تست دستی، تست اکتشافی، تست رابط کاربری، تست API، تست واحد، تست یکپارچه و تست انتهابهانتها است.
کارشناس تضمین کیفیت، QA Engineer و Test Engineer معمولا بر طراحی، اجرا و مدیریت آزمونها در سطح محصول تمرکز دارند. توسعهدهندگان نیز برای بررسی بخشهای مسئولیت خود از تست استفاده میکنند. برای توسعهدهنده بکاند، این مهارت بهویژه شامل آزمون منطق کسبوکار، اعتبارسنجی ورودیها، بررسی رفتار API، ارتباط با پایگاه داده و جلوگیری از بازگشت خطاهای برطرفشده پس از تغییر کد است.
این مهارت را با نامهای دیگری نیز میشناسند:
- آزمون نرمافزار
- تست و تضمین کیفیت نرمافزار
- Software Testing
اهمیت و کاربردها
چرا این مهارت مهم است؟
تغییر یک بخش کوچک از کد میتواند رفتار سایر بخشهای سامانه را مختل کند؛ بهویژه در بکاند که منطق قیمتگذاری، سطح دسترسی، پرداخت، ثبت سفارش و اعتبارسنجی دادهها در آن قرار دارد. تستهای مناسب، این خطاها را پیش از استقرار نسخه آشکار میکنند و هزینه رسیدگی به مشکلات در محیط تولید را کاهش میدهند.
در بازار کار ایران، عنوانهایی مانند «کارشناس تضمین کیفیت»، QA Engineer و Test Engineer معمولا برای نقشهایی به کار میروند که مسئولیت اصلیشان آزمون محصول و گزارش وضعیت کیفیت آن است. در مقابل، توسعهدهندگان بکاند و فرانتاند معمولا باید بتوانند تغییرات کد خود را با آزمونهای مناسب اعتبارسنجی کنند. جزئیات مسئولیتها در شرکتهای محصولی و پروژهای یکسان نیست؛ بنابراین شرح وظایف هر آگهی شغلی را بهصورت جداگانه بررسی کنید.
تست جای بازبینی کد، پایش سامانه یا اجرای دستی سناریوهای واقعی را نمیگیرد. ارزش آن زمانی بیشتر است که تیم، آزمونهای مهم را بهصورت مستمر در فرایند توسعه اجرا کند و برای خطاهای کشفشده، آزمونهای بازگشتی (Regression Tests) ایجاد کند.
کاربردها
-
بررسی منطق کسبوکار در بکاند
نوشتن تستهای واحد برای منطقهایی مانند محاسبه تخفیف، کنترل موجودی، اعتبارسنجی سفارش و کنترل سطح دسترسی.
-
آزمون قرارداد و رفتار API
بررسی کدهای وضعیت، بدنه پاسخ، اعتبارسنجی ورودیها، احراز هویت و رفتار API در شرایط موفق و خطا.
-
تست یکپارچگی سرویس و پایگاه داده
اطمینان از صحت ارتباط میان لایههای برنامه، پایگاه داده، صف پیام و سرویسهای داخلی در سناریوهای نزدیک به شرایط واقعی.
-
بررسی رابط کاربری و مسیرهای کاربر
اجرای سناریوهایی مانند ثبتنام، ورود، پرداخت، جستوجو و ثبت سفارش برای شناسایی رفتارهای نادرست در رابط کاربری و جریان کاربر.
-
آزمون اکتشافی و گزارش خطا
بررسی هدفمند محصول بدون سناریوی از پیش تعریفشده برای یافتن رفتارهای غیرمنتظره و ثبت دقیق شرایط وقوع آنها.
-
پیشگیری از بازگشت خطا
افزودن تست برای خطایی که پیشتر شناسایی و برطرف شده است تا همان خطا در تغییرات بعدی دوباره ایجاد نشود.
ابزارهای مرتبط
پیشنیازها
شروع این مهارت با دانستن پیشنیازهای زیر هموارتر میشود.
- برای شروع تست دستی و طراحی سناریو، پیشنیاز فنی الزامی نیست.
- برای تست API، آشنایی مقدماتی با HTTP، درخواست و پاسخ لازم است.
- برای تست خودکار، توانایی خواندن کد و آشنایی مقدماتی با زبان و ساختار پروژه هدف لازم است.
- برای اجرای تستها همراه تغییرات کد، آشنایی با کنترل نسخه مفید است.
مسیر یادگیری تست نرمافزار
-
۱۵ ساعت
شناخت هدف و سطح مناسب هر آزمون
تفاوت تستهای واحد، یکپارچه، انتهابهانتها، دستی، اکتشافی و خودکار را یاد بگیرید. برای یک قابلیت ساده، مشخص کنید کدام رفتار با تست واحد، کدام با تست یکپارچه و کدام با تست دستی باید ارزیابی شود.
در پایان این گام، باید بتوانید برای قابلیتی مانند ثبتنام، دستکم سه سناریوی تست در سطوح مختلف انتخاب کنید و دلیل انتخاب هر کدام را توضیح دهید.
-
۲۰ ساعت
طراحی سناریوهای آزمون از روی نیازمندی
نیازمندی را به شرایط اولیه، ورودی، مراحل اجرا، نتیجه مورد انتظار و معیار پذیرش تبدیل کنید. حالت موفق، ورودی نامعتبر، مقادیر مرزی، ورودی خالی، درخواست تکراری و خطاهای دسترسی را برای یک فرم یا API تمرین کنید.
خروجی این گام باید مجموعهای از سناریوهای مکتوب برای یک قابلیت باشد که نتیجه مورد انتظار هر سناریو را بهروشنی بیان کند.
-
۱۵ ساعت
اجرای تست دستی و نوشتن گزارش خطا
یک جریان واقعی کاربر، مانند ثبتنام، جستوجو یا ثبت سفارش را با سناریوهای طراحیشده اجرا کنید. سپس برای هر خطا، محیط اجرای آزمون، داده ورودی، مراحل بازتولید خطا، نتیجه مورد انتظار، نتیجه واقعی و شدت را ثبت کنید.
یک گزارش مبهم را بازنویسی کنید تا فرد دیگری بتواند بدون نیاز به توضیح بیشتر، خطا را بازتولید کند. این گام برای مسیر تست دستی ضروری است و به مهارت برنامهنویسی نیاز ندارد.
-
۱۵ ساعت
آزمودن و مستندسازی API با Postman
با Postman یک Collection برای API بسازید و درخواستهای موفق و خطا را در یک ساختار منظم سازماندهی کنید. برای هر درخواست، کد وضعیت، ساختار پاسخ، پیامهای خطا و سازوکار احراز هویت را بررسی کنید و از دادههای آزمون و متغیرهای محیطی استفاده کنید.
خروجی تمرین باید یک Collection مستند با Assertion برای پاسخهای کلیدی باشد که بتوان آن را چند بار با دادههای مشخص اجرا کرد. Postman برای بررسی و خودکارسازی بخشی از آزمونهای API مفید است، اما جای تستهای واحد و یکپارچه مبتنی بر کدنویسی را نمیگیرد.
-
۲۵ ساعت
نوشتن تست خودکار برای پشته هدف
یک زبان برنامهنویسی و چارچوب تست متناسب با پروژه هدف انتخاب کنید و ساختار پوشهها، نامگذاری تستها و روش اجرای مجموعه تستها (Test Suite) را یاد بگیرید. برای یک تابع یا سرویس دارای منطق کسبوکار، Assertionهای شفاف برای حالت عادی، حالتهای مرزی و خطاها بنویسید.
وابستگیهایی مانند پایگاه داده، ارسال پیام یا سرویس خارجی را با Mock یا Stub کنترل کنید تا تستهای واحد سریع و تکرارپذیر بمانند. خروجی این گام باید مجموعهای از تستهای قابل اجرا باشد که دستکم یک حالت مرزی و یک حالت خطا را پوشش دهند.
-
۲۰ ساعت
ساخت تستهای یکپارچه و اجرای آنها همراه تغییر کد
یک سناریوی یکپارچه طراحی کنید که داده را ثبت، بازیابی و بهروزرسانی کند و نتیجه را با نتیجه مورد انتظار مقایسه کند. در این سناریو، مرز بین تست واحد و تست یکپارچه وابسته به پایگاه داده یا API واقعی را مشخص کنید.
تستها را همزمان با تغییرات کد اجرا کنید و با Git، تغییرات تست و کد را در یک شاخه مدیریت کنید. همچنین آنها را در فرایند یکپارچهسازی مستمر (CI) پروژه اجرا کنید تا نتیجه موفق یا ناموفق اجرای تستها پیش از ادغام تغییرات قابل مشاهده باشد.
-
۱۰ ساعت
ارزیابی کیفیت آزمونها و افزودن تست بازگشتی
بررسی کنید آیا تستها رفتارهای مهم سیستم را میسنجند یا فقط باعث افزایش پوشش کد میشوند. برای هر خطای برطرفشده، یک تست بازگشتی اضافه کنید و تستهای تکراری، شکننده یا وابسته به ترتیب اجرا را شناسایی کنید.
در پایان، باید بتوانید توضیح دهید هر تست چه ریسکی را کاهش میدهد و چرا پوشش کد بهتنهایی معیار کافی برای کیفیت تستها نیست.
زمان تقریبی یادگیری
برآورد مجموع زمان آموزش، مطالعه و تمرین تا رسیدن به سطح کاربردی؛ بسته به پیشزمینه شما میتواند کمتر یا بیشتر باشد.
پروژههای تمرینی
برای آشنایی بهتر با این مهارت، توجه به موارد زیر میتواند مفید باشد.
-
مجموعه تست برای API مدیریت وظایف
توضیح پروژه: برای API فرضی مدیریت وظایف، سناریوهای ایجاد، ویرایش، حذف، فیلتر، دسترسی غیرمجاز و دادههای نامعتبر را در Postman طراحی کنید. یک Collection با Assertionهای مربوط به پاسخ و دادههای آزمون قابل استفاده مجدد ایجاد و تحویل دهید.
-
تست واحد قوانین تخفیف فروشگاه
توضیح پروژه: یک ماژول ساده برای محاسبه تخفیف پیادهسازی کنید و حالتهایی مانند سقف تخفیف، کد منقضی، سبد خالی، حداقل مبلغ خرید و ممنوعبودن ترکیب کدهای تخفیف را با تستهای واحد پوشش دهید.
-
گزارش خطا برای یک وباپلیکیشن عمومی
توضیح پروژه: یک جریان رایج کاربر، مانند ثبتنام یا جستوجو را بررسی کنید و برای خطاهای واقعی یا سناریوهای فرضی خطا، گزارشهای خطا با مراحل بازتولید، شواهد (مانند تصویر، ویدئو یا لاگ) و شدت تهیه کنید.
-
تست بازگشتی یک قابلیت تغییرکرده
توضیح پروژه: یک تغییر کوچک در پروژه شخصی، مانند افزودن اعتبارسنجی شماره تلفن، اعمال کنید؛ سپس تستهایی بنویسید که رفتارهای قبلی و حالتهای خطای جدید را بررسی کنند.
پرسشهای رایج درباره تست نرمافزار
در این بخش، به تعدادی از پرسشهای رایج درباره این مهارت پاسخ داده شده است.
آیا برای یادگیری تست نرمافزار باید برنامهنویس باشم؟
برای شروع تست دستی، تست اکتشافی و طراحی سناریوهای تست، به مهارت برنامهنویسی نیاز نیست. اما برای نوشتن و نگهداری تستهای خودکار، باید حداقل یک زبان برنامهنویسی و ساختار پروژه هدف را در حد خواندن، درک و تغییر کد بشناسید.
تفاوت تست واحد و تست یکپارچه چیست؟
تست واحد رفتار یک بخش کوچک و مستقل، مانند یک تابع یا سرویس، را بررسی میکند. تست یکپارچه تعامل چند جزء، مانند API، پایگاه داده و لایه سرویس، را در یک سناریو ارزیابی میکند.
آیا Postman برای تست نرمافزار کافی است؟
Postman برای بررسی، مستندسازی و اجرای Assertion روی پاسخهای API بسیار مفید است، اما جای تستهای واحد و یکپارچه مبتنی بر کدنویسی، تست رابط کاربری یا مدیریت کامل فرایند تست محصول را نمیگیرد.
توسعهدهنده بکاند چه تستهایی باید بلد باشد؟
توسعهدهنده بکاند معمولا باید بتواند برای منطق کسبوکار تست واحد بنویسد، رفتار API را بررسی کند و سناریوهای یکپارچه شامل پایگاه داده یا سرویسهای وابسته را طراحی و تحلیل کند.
آیا پوشش بالای کد به معنای کیفیت بالای تستها است؟
خیر. پوشش کد فقط نشان میدهد چه بخشهایی از کد هنگام اجرای تستها اجرا شدهاند. کیفیت تست به این بستگی دارد که رفتارهای مهم، خطاهای محتمل و شرایط مرزی را با نتیجههای مورد انتظار مشخص بررسی کند.
چگونه یک گزارش باگ خوب بنویسم؟
عنوان واضح، محیط اجرا، مراحل دقیق بازتولید خطا، داده ورودی، نتیجه مورد انتظار، نتیجه واقعی و شواهد مرتبط را ثبت کنید. گزارش باید به فرد دیگری امکان دهد خطا را بدون نیاز به توضیح بیشتر بازتولید کند.
۱۲۰ ساعت برای یادگیری تست نرمافزار به چه معنا است؟
این برآورد برای فردی با آشنایی مقدماتی با برنامهنویسی است که حدود ۱۲۰ ساعت را صرف مطالعه و انجام تمرینهای پروژهمحور میکند. برای شروع تست دستی، زمان کمتری لازم است؛ اما تسلط بر تست خودکار در چند پشته فناوری یا آمادگی برای استخدام، به تمرین و تجربه بیشتری نیاز دارد.