فرض کنید یک فروشگاه اینترنتی بعد از چند هفته توسعه، قابلیت جدیدی برای استفاده از کد تخفیف به سیستم اضافه میکند. قابلیت جدید بهدرستی کار میکند و تستهای مربوط به آن هم موفق هستند.
اما چند روز بعد مشخص میشود که در بعضی سفارشها، مبلغ نهایی اشتباه محاسبه میشود.
تغییر اولیه قرار نبود روی محاسبه مبلغ سفارش تأثیری داشته باشد، اما یک تغییر در بخشی از نرمافزار باعث ایجاد مشکل در قابلیتی شده که پیش از این بهدرستی کار میکرده است.
اینجاست که تست رگرسیون (Regression Testing) اهمیت پیدا میکند.
در توسعه نرمافزار، تغییر دادن یک بخش از سیستم همیشه به این معنا نیست که فقط همان بخش تحت تأثیر قرار میگیرد. اضافه شدن یک قابلیت، رفع یک باگ، تغییر کد یا حتی بازطراحی یک بخش از سیستم میتواند رفتار قسمتهای دیگری را که قبلاً درست کار میکردند تغییر دهد.
تست رگرسیون با همین مسئله سروکار دارد: بررسی اینکه تغییرات جدید باعث خراب شدن قابلیتهای موجود نشده باشند.
در این مقاله با مفهوم تست رگرسیون، هدف و زمان انجام آن، انواع مختلف، تفاوت آن با تست مجدد، Smoke و Sanity Testing، تست دستی و خودکار، نقش آن در Agile، نحوه انتخاب تستهای مناسب و چالشهای آن آشنا میشویم.
تست رگرسیون (Regression Testing) چیست؟
تست رگرسیون فرآیندی برای بررسی نرمافزار پس از ایجاد تغییر است تا مشخص شود قابلیتهایی که پیش از تغییر بهدرستی کار میکردند، همچنان رفتار مورد انتظار خود را دارند.
به زبان ساده، وقتی تغییری در نرمافزار ایجاد میشود، تستر فقط نمیپرسد:
«آیا تغییر جدید درست کار میکند؟»
بلکه سؤال دیگری هم مطرح میکند:
«آیا این تغییر باعث خراب شدن چیزی که قبلاً درست کار میکرده است؟»
پاسخ دادن به سؤال دوم، بخش مهمی از هدف تست رگرسیون است.
یک مثال ساده از تست رگرسیون
فرض کنید در یک فروشگاه آنلاین، تیم توسعه امکان پرداخت با کیف پول را اضافه میکند.
تستر باید بررسی کند که پرداخت با کیف پول مطابق نیازمندیها کار میکند. اما موضوع فقط به همین قابلیت محدود نمیشود.
- مبلغ سفارش
- ثبت تراکنش
- وضعیت سفارش
- صدور فاکتور
- بازگشت وجه
ممکن است قابلیت جدید کاملاً درست کار کند، اما بعد از تغییرات انجامشده، مبلغ سفارش در بعضی شرایط اشتباه محاسبه شود.
در اینجا قابلیت جدید مشکل ندارد؛ اثر جانبی تغییر روی یک قابلیت موجود مشکل ایجاد کرده است.
تست رگرسیون چه چیزی را بررسی میکند؟
بسته به نوع تغییر، ممکن است توجه به موارد زیر اهمیت بیشتری داشته باشد:
- قابلیتهایی که مستقیماً تغییر کردهاند
- قابلیتهای وابسته به بخش تغییرکرده
- بخشهایی که سابقه خطا دارند
- قابلیتهای حیاتی سیستم
- عملکردهایی که کاربران زیاد از آنها استفاده میکنند
- قسمتهایی که ارتباط زیادی با بخش تغییرکرده دارند
بنابراین تست رگرسیون الزاماً به معنای اجرای تمام تستهای موجود در نرمافزار نیست.
محدوده تست باید با توجه به نوع تغییر، میزان ریسک، وابستگی بخشهای مختلف و اهمیت قابلیتها تعیین شود.
هدف از تست رگرسیون چیست؟
هدف اصلی تست رگرسیون این است که مشخص شود تغییرات جدید باعث ایجاد مشکل در قابلیتهایی که قبلاً درست کار میکردهاند نشدهاند.
جلوگیری از ایجاد مشکلات جدید
ممکن است یک باگ اصلاح شود، اما همان اصلاح به دلیل ارتباط میان بخشهای مختلف سیستم، مشکل جدیدی ایجاد کند.
حفظ عملکرد قابلیتهای موجود
نرمافزار در طول زمان دائماً تغییر میکند. قابلیتهای جدید اضافه میشوند، باگها اصلاح میشوند و بخشهایی از کد بازطراحی میشوند.
هرچه محصول بزرگتر شود، ارتباط میان اجزای آن نیز بیشتر میشود. در نتیجه، بررسی اینکه قابلیتهای قبلی همچنان درست کار میکنند اهمیت بیشتری پیدا میکند.
کاهش ریسک انتشار
هر نسخه جدید میتواند ریسکهایی به همراه داشته باشد. تست رگرسیون کمک میکند بخشی از این ریسکها پیش از رسیدن نسخه به کاربران شناسایی شوند.
حفظ کیفیت نرمافزار در طول زمان
تست رگرسیون به تیم کمک میکند عملکردهای موجود را در طول چرخه توسعه دوباره بررسی کند و از بازگشت مشکلات جلوگیری کند.
تست رگرسیون چه زمانی انجام میشود؟
تست رگرسیون معمولاً زمانی اهمیت پیدا میکند که تغییری در نرمافزار ایجاد شده باشد و احتمال تأثیر آن بر عملکردهای موجود وجود داشته باشد.
بعد از رفع یک باگ
بعد از اصلاح یک مشکل، علاوه بر بررسی رفع باگ، ممکن است لازم باشد قابلیتهای مرتبط نیز بررسی شوند تا مشخص شود اصلاح انجامشده مشکل دیگری ایجاد نکرده است.
بعد از اضافه شدن قابلیت جدید
اضافه شدن یک قابلیت جدید میتواند روی بخشهای مرتبط با آن اثر بگذارد. به همین دلیل تست رگرسیون پس از اضافه شدن قابلیتها اهمیت پیدا میکند.
بعد از تغییرات مهم کد
گاهی رفتار ظاهری نرمافزار تغییر نمیکند، اما ساختار داخلی آن تغییر میکند. تغییرات داخلی نیز ممکن است باعث ایجاد خطا در بخشهای دیگر شوند.
قبل از انتشار نسخه جدید
پیش از انتشار نسخه جدید، تست رگرسیون میتواند به تیم کمک کند اطمینان بیشتری از حفظ عملکرد قابلیتهای مهم داشته باشد.
انواع تست رگرسیون چیست؟
برای تست رگرسیون در منابع مختلف دستهبندیهای متفاوتی ارائه شده است. به همین دلیل بهتر است به جای حفظ کردن یک فهرست ثابت، منطق هر رویکرد را بشناسیم.
تست رگرسیون اصلاحی (Corrective Regression)
در این رویکرد، تمرکز روی بررسی این است که تغییرات انجامشده باعث ایجاد مشکل در عملکردهای موجود نشده باشند.
تست رگرسیون انتخابی (Selective Regression)
در تست رگرسیون انتخابی، به جای بررسی کل مجموعه تست، تستهایی انتخاب میشوند که احتمال میرود بیشتر تحت تأثیر تغییر قرار گرفته باشند.
تست رگرسیون کامل (Complete Regression)
در تست رگرسیون کامل، دامنه بررسی بسیار گستردهتر است و بخش بزرگی از مجموعه تست مورد بررسی قرار میگیرد.
تست رگرسیون جزئی (Partial Regression)
در این رویکرد، تمرکز روی بخشی از سیستم یا مجموعهای از قابلیتهای مرتبط با تغییرات است.
تست رگرسیون Progressive
در این رویکرد، مجموعه تستها متناسب با رشد و تغییر محصول توسعه پیدا میکند و با اضافه شدن قابلیتهای جدید، پوشش تست نیز تکامل پیدا میکند.
نکته: نامگذاری و دستهبندی انواع تست رگرسیون در منابع مختلف کاملاً یکسان نیست. بنابراین مهمتر از حفظ نام انواع، درک نحوه انتخاب دامنه تست بر اساس تغییر و ریسک است.
تست رگرسیون چگونه انجام میشود؟
تست رگرسیون میتواند شامل فعالیتهای مختلفی باشد. در سطح مفهومی میتوان فرآیند آن را در چند مرحله دید.
شناسایی تغییرات ← تحلیل تأثیر تغییرات ← انتخاب تستها ← اولویتبندی ← بررسی نتایج ← پیگیری مشکلات
انتخاب تستهای رگرسیون باید بر اساس تأثیر احتمالی تغییرات و ریسک سیستم انجام شود.
تفاوت تست رگرسیون و تست مجدد چیست؟
یکی از رایجترین ابهامها در تست نرمافزار، اشتباه گرفتن تست رگرسیون با Retesting است.
این دو فعالیت ممکن است بعد از یک رفع باگ در فاصله زمانی نزدیک به یکدیگر انجام شوند، اما هدفشان متفاوت است.
یک سناریوی ساده
فرض کنید در یک فروشگاه اینترنتی، هنگام پرداخت با کارت بانکی مبلغ سفارش اشتباه نمایش داده میشود.
اگر تستر بعد از اصلاح، همان سناریوی قبلی را دوباره بررسی کند، هدف او این است که ببیند آیا مشکل برطرف شده است. این همان Retesting است.
اما اگر تستر بررسی کند که تغییر انجامشده باعث اختلال در پرداخت با کیف پول، محاسبه مبلغ سفارش یا سایر قابلیتهای مرتبط نشده باشد، وارد محدوده تست رگرسیون شده است.
Retesting: آیا مشکل قبلی برطرف شده است؟
تست رگرسیون: آیا تغییر انجامشده باعث ایجاد مشکل در بخشهای دیگر نشده است؟
تفاوت تست رگرسیون با Smoke Testing و Sanity Testing
Smoke، Sanity و Regression سه اصطلاحی هستند که گاهی به اشتباه به جای یکدیگر استفاده میشوند؛ اما هدف و دامنه آنها یکسان نیست.
| معیار | تست رگرسیون | Smoke Testing | Sanity Testing |
|---|---|---|---|
| هدف | بررسی اثر تغییرات بر قابلیتهای موجود | بررسی اولیه سلامت Build | بررسی متمرکز یک تغییر یا بخش |
| دامنه | میتواند گسترده باشد | معمولاً سطح بالا و اولیه | معمولاً محدودتر |
| تمرکز | اثرات جانبی تغییرات | عملکردهای اصلی | تغییر یا قابلیت مشخص |
تست رگرسیون دستی چیست؟
تست رگرسیون دستی به بررسی قابلیتهای موجود توسط تستر و بدون تکیه بر اجرای خودکار تستها گفته میشود.
- انعطافپذیری بالا
- استفاده از قضاوت انسانی
- مناسب برای تغییرات محدود
- عدم نیاز به توسعه اسکریپتهای خودکار
تست رگرسیون خودکار چیست؟
تست رگرسیون خودکار به استفاده از ابزارها و اسکریپتهای خودکار برای اجرای مجموعهای از تستهای رگرسیون گفته میشود.
- سرعت بالاتر اجرای تستهای تکراری
- امکان اجرای مکرر
- مناسب برای مجموعه تستهای بزرگ
- کاهش زمان اجرای تستهای تکراری
تست رگرسیون دستی یا خودکار؛ کدام بهتر است؟
پاسخ واحدی برای همه پروژهها وجود ندارد.
انتخاب بین تست دستی و خودکار به عواملی مانند اندازه پروژه، تعداد تستها، دفعات اجرای تست، سرعت انتشار، هزینه نگهداری و ماهیت تستها بستگی دارد.
در بسیاری از پروژهها، ترکیبی از تست دستی و تست خودکار میتواند رویکرد مناسبتری باشد.
چه تستهایی باید در مجموعه تست رگرسیون قرار بگیرند؟
- قابلیتهای حیاتی
- بخشهای تحت تأثیر تغییر
- قابلیتهای دارای سابقه خطا
- قابلیتهای پرتکرار
- قابلیتهای دارای وابستگی زیاد
تست رگرسیون کامل یا انتخابی؟
در تست رگرسیون کامل، دامنه بررسی بسیار گسترده است؛ در حالی که در تست انتخابی، تستها بر اساس تغییر و ریسک انتخاب میشوند.
هدف این نیست که همیشه کمترین تعداد تست یا بیشترین تعداد تست را اجرا کنیم؛ هدف، انتخاب دامنهای متناسب با ریسک است.
تست رگرسیون در Agile چیست؟
در روشهای توسعه چابک، نرمافزار معمولاً در چرخههای کوتاه توسعه پیدا میکند و تغییرات بیشتری در بازههای زمانی کوتاه ایجاد میشوند.
به همین دلیل، تست رگرسیون باید با چرخه توسعه محصول هماهنگ باشد و مجموعه تست نیز متناسب با رشد محصول بهروزرسانی شود.
نقش تستر نرم افزار در تست رگرسیون چیست؟
نقش تستر در تست رگرسیون فقط اجرای Test Case نیست.
یکی از وظایف مهم تستر، درک تغییرات و ارزیابی ریسک ناشی از آنها است.
- چه چیزی تغییر کرده است؟
- کدام قابلیتها ممکن است تحت تأثیر قرار گرفته باشند؟
- کدام بخشها ریسک بیشتری دارند؟
- کدام تستها اهمیت بیشتری دارند؟
- آیا مجموعه تست موجود هنوز برای محصول مناسب است؟
مزایای تست رگرسیون
- کاهش ریسک ناشی از تغییرات
- شناسایی اثرات جانبی تغییرات
- افزایش اطمینان از پایداری نرمافزار
- جلوگیری از بازگشت مشکلات
- کمک به حفظ کیفیت نسخههای جدید
- شناسایی مشکلات پیش از انتشار
معایب و چالشهای تست رگرسیون
- افزایش زمان تست
- افزایش حجم مجموعه تست
- هزینه نگهداری
- دشواری انتخاب محدوده مناسب
- احتمال اجرای تستهای کمارزش
اشتباهات رایج در تست رگرسیون
- اجرای همه تستها بدون اولویتبندی
- اشتباه گرفتن تست رگرسیون با Retesting
- نادیده گرفتن وابستگی بین بخشها
- بهروزرسانی نکردن مجموعه تست
- تمرکز بیش از حد روی قابلیت جدید
- تصور اینکه تست رگرسیون فقط قبل از انتشار انجام میشود
تست رگرسیون در مقایسه با سایر انواع تست نرم افزار
| نوع تست | هدف اصلی |
|---|---|
| تست رگرسیون | بررسی اثر تغییرات بر قابلیتهای موجود |
| Retesting | بررسی رفع یک مشکل مشخص |
| Smoke Testing | بررسی اولیه سلامت Build |
| Sanity Testing | بررسی متمرکز یک تغییر یا بخش مشخص |
| Functional Testing | بررسی عملکرد سیستم در برابر نیازمندیها |
| Integration Testing | بررسی تعامل اجزای مختلف |
| System Testing | بررسی سیستم بهعنوان یک مجموعه |
| Acceptance Testing | بررسی پذیرش سیستم بر اساس نیاز کسبوکار |
تست رگرسیون در برابر تست عملکردی
تست عملکردی بررسی میکند که یک قابلیت مطابق نیازمندیهای مشخص کار میکند یا خیر.
در مقابل، تست رگرسیون به اثر تغییرات بر رفتارهای موجود توجه دارد.
جمعبندی
تست رگرسیون یکی از بخشهای مهم تست نرمافزار است که به بررسی اثر تغییرات بر قابلیتهای موجود کمک میکند.
هر بار که نرمافزار تغییر میکند، این احتمال وجود دارد که تغییر جدید به صورت مستقیم یا غیرمستقیم روی بخشهای دیگری از سیستم اثر بگذارد.
در نهایت، هدف تست رگرسیون اجرای تعداد زیادی تست نیست؛ هدف این است که با توجه به تغییرات و ریسکهای سیستم، اطمینان مناسبی از حفظ عملکرد قابلیتهای موجود به دست آید.
منابع و مراجع برای مطالعه بیشتر
برای مطالعه دقیقتر درباره تست رگرسیون و مفاهیم مرتبط با آن، منابع زیر میتوانند مفید باشند:
ISTQB Glossary – Regression Testing
– تعریف رسمی تست رگرسیون و توضیح ارتباط آن با تغییرات نرمافزار.
IBM – What is Regression Testing?
– توضیح مفهوم تست رگرسیون، زمان استفاده و نقش آن در بررسی تغییرات نرمافزار.
BrowserStack – Regression Testing
– راهنمای جامع درباره مفهوم، انواع، اهمیت و رویکردهای مختلف تست رگرسیون.
BrowserStack – Automated Regression Testing
– منبعی برای آشنایی بیشتر با تست رگرسیون خودکار و تفاوت آن با تست رگرسیون دستی.
ISTQB Standard Glossary of Terms
– مرجع اصطلاحات تخصصی مورد استفاده در تست نرمافزار.
نکته: برای تعریف اصطلاحات تخصصی تست نرمافزار، بهتر است همیشه منابع استاندارد مانند واژهنامه ISTQB را در اولویت قرار دهید و منابع آموزشی دیگر را برای تکمیل توضیحات و مثالها استفاده کنید.
سوالات متداول درباره تست رگرسیون
تست رگرسیون چیست؟
تست رگرسیون فرآیندی برای بررسی نرمافزار پس از ایجاد تغییر است تا مشخص شود قابلیتهایی که پیش از تغییر بهدرستی کار میکردند، همچنان عملکرد مورد انتظار خود را دارند.
هدف اصلی تست رگرسیون چیست؟
هدف اصلی تست رگرسیون شناسایی مشکلاتی است که ممکن است در نتیجه تغییرات جدید در قابلیتهای موجود ایجاد شده باشند.
تست رگرسیون چه زمانی انجام میشود؟
بعد از تغییراتی مانند رفع باگ، اضافه شدن قابلیت جدید، تغییرات مهم کد، تغییرات ساختاری و پیش از انتشار نسخه جدید میتوان تست رگرسیون را انجام داد.
تفاوت تست رگرسیون و تست مجدد چیست؟
تست مجدد برای بررسی رفع یک مشکل مشخص انجام میشود، در حالی که تست رگرسیون بررسی میکند تغییرات انجامشده باعث ایجاد مشکل در سایر قابلیتهای موجود نشده باشند.
انواع تست رگرسیون چیست؟
در منابع مختلف دستهبندیهای متفاوتی وجود دارد. از جمله رویکردهای رایج میتوان به تست رگرسیون اصلاحی، انتخابی، جزئی، کامل و Progressive اشاره کرد.
تست رگرسیون دستی چیست؟
در تست رگرسیون دستی، تستر قابلیتهای موجود را بدون تکیه بر اجرای خودکار تستها بررسی میکند.
تست رگرسیون خودکار چیست؟
در تست رگرسیون خودکار، ابزارها و اسکریپتهای تست برای اجرای خودکار مجموعهای از تستهای رگرسیون استفاده میشوند.
آیا تست رگرسیون بعد از هر تغییر لازم است؟
لزوم و دامنه تست رگرسیون به نوع تغییر، میزان ریسک، پیچیدگی سیستم و ارتباط تغییر با سایر قابلیتها بستگی دارد.
تست رگرسیون چه تفاوتی با Smoke Testing دارد؟
Smoke Testing معمولاً برای بررسی اولیه سلامت یک Build انجام میشود، در حالی که تست رگرسیون روی بررسی اثر تغییرات بر قابلیتهای موجود تمرکز دارد.
تست رگرسیون چه تفاوتی با Sanity Testing دارد؟
Sanity Testing معمولاً محدودتر و متمرکزتر است و برای بررسی یک تغییر یا بخش مشخص استفاده میشود، در حالی که تست رگرسیون میتواند دامنه گستردهتری از قابلیتهای تحت تأثیر تغییر را پوشش دهد.
آیا تست رگرسیون همان تست عملکردی است؟
خیر. تست عملکردی بررسی میکند قابلیتها مطابق نیازمندیها کار میکنند یا خیر، اما تست رگرسیون بررسی میکند تغییرات جدید عملکردهای موجود را دچار مشکل نکرده باشند.
آیا تست رگرسیون باید دستی باشد یا خودکار؟
هر دو رویکرد میتوانند مناسب باشند. انتخاب بین آنها به اندازه پروژه، تعداد تستها، دفعات اجرا، سرعت انتشار، هزینه نگهداری و ماهیت تستها بستگی دارد.
