رفتن به محتوای اصلی

تست سازگاری چیست؟ طراحی Browser و Device Matrix

راهنمای تست سازگاری با Browser و Device Matrix ریسک‌محور، Feature Detection، دستگاه واقعی، اتوماسیون و گزارش دقیق باگ.

محمد عسکری ۲۰ دقیقه مطالعه به‌روزرسانی
فهرست مطالب
  1. پاسخ کوتاه: تست سازگاری چیست؟
  2. هدف، رفتار معادل است؛ نه ظاهر کاملاً یکسان
  3. پیش از ماتریس، قرارداد پشتیبانی بنویسید
  4. قرارداد باید قابل‌نسخه‌گذاری باشد
  5. خارج از پشتیبانی یعنی چه؟
  6. ابعاد واقعی یک Compatibility Matrix
  7. مرز تست سازگاری با تست‌های همسایه
  8. چگونه ترکیب‌های ماتریس را انتخاب کنیم؟
  9. سیگنال‌های انتخاب
  10. امتیاز ریسک ساده
  11. چرا سهم بازار به‌تنهایی کافی نیست؟
  12. کاهش ترکیب‌ها با Pairwise
  13. مثال: ماتریس فروشگاه اینترنتی ایرانی
  14. Oracle نمونه برای بازگشت از درگاه
  15. Engine، Brand، Channel و WebView را یکی نگیرید
  16. Engine با Brand برابر نیست
  17. Channel بخشی از ریسک است
  18. WebView یک مرورگر معمولی نیست
  19. از قواعد ثابت درباره iOS پرهیز کنید
  20. Feature Detection و Progressive Enhancement
  21. نمونه CSS با Fallback
  22. نمونه JavaScript
  23. دستگاه واقعی، Emulator و شبیه‌سازی مرورگر
  24. مجموعه واقعی را نماینده انتخاب کنید
  25. معماری اجرای تست در CI/CD
  26. پیش از Commit یا در PR
  27. پس از Merge
  28. Nightly و Release candidate
  29. اجرای توزیع‌شده
  30. پس از انتشار
  31. اتوماسیون چه چیزی را پوشش دهد؟
  32. Visual Regression بدون آلارم کاذب
  33. Baseline معتبر
  34. محدودیت Visual diff
  35. نکات ویژه وب موبایل و اپ
  36. سازگاری فارسی و شرایط کاربران ایران
  37. متن و ورودی
  38. تاریخ، زمان و پول
  39. درگاه و محدودیت شبکه
  40. Backward و Forward Compatibility
  41. API و فایل
  42. Schema و Migration
  43. انتخاب Device Farm یا سرویس ابری
  44. فرآیند ده‌مرحله‌ای تست سازگاری
  45. Test Case سازگاری چه اجزایی دارد؟
  46. گزارش باگ سازگاری و شواهد لازم
  47. حداقل Evidence محیط
  48. عنوان خوب
  49. حریم خصوصی Evidence
  50. معیارهای سنجش اثربخشی
  51. سیاست Deprecation محیط قدیمی
  52. اشتباه‌های رایج در تست سازگاری
  53. چک‌لیست آمادگی انتشار
  54. پرسش‌های متداول
  55. تفاوت Cross-browser Testing و Compatibility Testing چیست؟
  56. آیا باید روی همه مرورگرها و دستگاه‌ها تست کنیم؟
  57. Playwright WebKit همان Safari واقعی است؟
  58. Emulator بهتر است یا دستگاه واقعی؟
  59. هر چند وقت Compatibility Matrix را بازبینی کنیم؟
  60. جمع‌بندی
تست سازگاری چیست؟ طراحی Browser و Device Matrix

«روی لپ‌تاپ من درست است» یکی از پرهزینه‌ترین جمله‌ها در روز انتشار است. همان صفحه پرداخت ممکن است در Chrome دسکتاپ بی‌نقص به نظر برسد، اما در Safari آیفون دکمه بازگشت از درگاه را پنهان کند، در یک WebView اندرویدی OTP را نپذیرد یا با فونت فارسی کاربر، مبلغ را از کادر بیرون ببرد. راه‌حل، اجرای محصول روی هر ترکیب ممکن نیست؛ چنین مجموعه‌ای عملاً پایانی ندارد.

تست سازگاری (Compatibility Testing) یعنی بررسی اینکه محصول در دامنه پشتیبانی‌شده و اعلام‌شده نتیجه‌ای معادل، قابل‌استفاده و ایمن بدهد. «معادل» الزاماً به معنی یکسان‌بودن پیکسل‌ها نیست. تیم باید ابتدا قرارداد پشتیبانی و ماتریس ریسک‌محور بسازد، سپس ترکیبی از Feature Detection، تست خودکار چندمرورگری، محیط مجازی و دستگاه واقعی را به کار بگیرد. این راهنما همین مسیر را با مثال یک فروشگاه اینترنتی ایرانی توضیح می‌دهد.

پاسخ کوتاه: تست سازگاری چیست؟

تست سازگاری ارزیابی رفتار نرم‌افزار در ترکیب‌های معنادارِ مرورگر، موتور مرورگر، سیستم‌عامل، دستگاه، اندازه و تراکم صفحه، شیوه ورودی، زبان و جهت متن، فناوری کمکی، شبکه، WebView، نسخه API و پیکربندی است. هدف آن پاسخ به سه سؤال است:

  • کدام محیط‌ها رسماً پشتیبانی می‌شوند و سطح تعهد در هرکدام چیست؟
  • آیا سفرهای حیاتی کاربر در آن محیط‌ها با نتیجه کسب‌وکاری و ایمنی معادل کامل می‌شوند؟
  • اگر قابلیتی در دسترس نیست، آیا محصول شکست کنترل‌شده، پیام روشن یا مسیر جایگزین دارد؟

ناسازگاری ممکن است به شکل خطای عملکردی، به‌هم‌ریختگی نمایش، افت کارایی، مانع دسترس‌پذیری، خرابی نصب یا شکست یکپارچه‌سازی ظاهر شود. بنابراین برچسب‌زدن آن به‌عنوان «فقط یک تست غیرعملکردی» مفید نیست؛ نوع اثر و ریسک باگ مهم‌تر از طبقه‌بندی آن است.

هدف، رفتار معادل است؛ نه ظاهر کاملاً یکسان

مرورگرها، فونت‌ها، کنترل‌های بومی سیستم‌عامل و موتورهای رندر ممکن است تفاوت‌های جزئی و قابل‌قبول داشته باشند. اصرار بر Pixel-perfect بودن همه محیط‌ها هزینه نگهداری را بالا می‌برد و گاهی دسترس‌پذیری بومی را خراب می‌کند. معیار پذیرش بهتر چنین است:

  • کاربر می‌تواند هدف اصلی، مانند جست‌وجو، ورود یا پرداخت را کامل کند؛
  • قواعد دامنه، مبلغ، مجوز و Side effect در همه محیط‌های پشتیبانی‌شده یکسان‌اند؛
  • اطلاعات ضروری خوانا و ترتیب تعامل قابل‌فهم است؛
  • تفاوت بصری مانع عمل، درک یا اعتماد نمی‌شود؛
  • امنیت، حریم خصوصی و ثبت رویداد قربانی محیط خاص نمی‌شوند؛
  • قابلیت اختیاریِ پشتیبانی‌نشده، Fallback یا پیام مناسب دارد.

قرارداد خوب نمی‌گوید «در همه دستگاه‌ها بی‌نقص است». می‌گوید «در محیط‌های Tier ۱ و Tier ۲، این سفرها با این معیارهای پذیرش پشتیبانی می‌شوند».

پیش از ماتریس، قرارداد پشتیبانی بنویسید

فهرست مرورگرها بدون سطح تعهد مبهم است. یک مدل چهارسطحی ساده، تصمیم انتشار و رسیدگی به باگ را شفاف می‌کند.

سطحتعهد پیشنهادیزمان اجرااثر شکست
Tier ۱: حیاتیتمام سفرهای درآمدی و امنیتی؛ مانع انتشار در صورت شکستروزانه و پیش از ReleaseBlocker یا تصمیم ریسک مستند
Tier ۲: پشتیبانی‌شدهرفتار کامل با تفاوت ظاهری قابل‌قبولNightly و Releaseرفع زمان‌بندی‌شده بر اساس شدت
Tier 3: Best effortمسیر پایه یا Graceful degradation؛ بدون تضمین همه قابلیت‌هاSmoke دوره‌ای و هنگام تغییر حساسبررسی موردی و اعلام محدودیت
خارج از پشتیبانیتعهد تست منظم ندارد؛ نباید به‌طور گمراه‌کننده پذیرفته شودفقط با Incident یا تصمیم تجاریپیام یا مستند روشن، نه شکست خاموش

قرارداد باید قابل‌نسخه‌گذاری باشد

نام «نسخه‌های اخیر» کافی نیست. سیاستی قابل اجرا تعریف کنید؛ برای مثال «نسخه Stable فعلی و یک نسخه پیشین از مرورگرهای Tier ۱، همراه با نسخه‌های سیستم‌عامل مشخص در جدول نسخه‌دار». تاریخ بازبینی، مالک و منبع داده را هم ثبت کنید. هر Release مرورگر، سیستم‌عامل یا SDK می‌تواند ماتریس را تغییر دهد.

خارج از پشتیبانی یعنی چه؟

خارج‌بودن از پشتیبانی مجوز نمایش صفحه سفید یا از دست‌دادن داده نیست. اگر تشخیص قابل‌اعتماد است، محدودیت و مسیر ارتقا را توضیح دهید. در غیر این صورت، Progressive enhancement اجازه می‌دهد قابلیت پایه کار کند. مسدودکردن صرفاً با User-Agent معمولاً شکننده و تبعیض‌آمیز است.

ابعاد واقعی یک Compatibility Matrix

ماتریس فقط «Chrome × Windows» نیست. بسته به معماری محصول، این ابعاد را بررسی کنید:

  • مرورگر: Engine، Brand، Channel و نسخه؛
  • سیستم‌عامل: خانواده، نسخه، Build/Patch و سیاست‌های سازمانی؛
  • دستگاه: مدل نماینده، CPU/RAM، GPU، حافظه و Thermal throttling؛
  • نمایش: Viewport، رزولوشن، Device Pixel Ratio، Zoom، Orientation، Safe area و اندازه فونت سیستم؛
  • ورودی: Touch، Mouse، Keyboard، IME، قلم، Autofill و رمز یک‌بارمصرف؛
  • زبان و منطقه: fa-IR، RTL، فونت، نیم‌فاصله، ارقام فارسی/لاتین، تقویم، منطقه زمانی و واحد پول؛
  • فناوری کمکی: Screen reader، بزرگ‌نمایی، Voice control و Keyboard-only؛
  • بستر اجرا: Browser tab، PWA، In-app browser، Android WebView یا iOS web view؛
  • قابلیت‌های سیستم: مجوزها، دوربین، مکان، Share sheet، Push، Deep link و اجرای پس‌زمینه؛
  • شبکه و پیکربندی: تأخیر، قطعی، تغییر Wi-Fi/Cellular، Proxy، VPN، Content blocker، Feature flag و CDN؛
  • نسخه‌های متصل: API، Schema، فایل، Protocol، SDK و Client قدیمی/جدید.

هر بُعد برای هر محصول لازم نیست. پرسش درست این است: «کدام تفاوت محیطی می‌تواند Oracle، سفر حیاتی یا داده ما را تغییر دهد؟» سپس فقط Valueهای نماینده و قابل‌اجرا را وارد مدل کنید.

مرز تست سازگاری با تست‌های همسایه

حوزهسؤال اصلیهم‌پوشانی با سازگاری
Responsiveچیدمان در Viewport و محتواهای مختلف چگونه تطبیق می‌یابد؟Viewport بخشی از ماتریس است، اما Device واقعی فقط Viewport نیست.
دسترس‌پذیریکاربر با توانایی‌ها و فناوری‌های کمکی مختلف می‌تواند کار را انجام دهد؟ترکیب Browser × Screen reader مهم است، ولی تست سازگاری جای ارزیابی WCAG را نمی‌گیرد.
عملکردزمان پاسخ، ظرفیت و پایداری زیر بار یا محدودیت منابع چقدر است؟دستگاه و شبکه روی تجربه اثر دارند؛ اما Emulation شبکه جای Load test را نمی‌گیرد.
Interoperabilityدو سیستم مستقل طبق قرارداد با هم تبادل درست دارند؟API/Protocol version matrix محل هم‌پوشانی است.
Portabilityانتقال یا استقرار محصول در محیط دیگر با چه هزینه‌ای ممکن است؟Compatibility بیشتر رفتار زمان اجرا را می‌سنجد.

برای جزئیات هر حوزه، از راهنمای تست دسترس‌پذیری و طراحی برنامه تست عملکرد استفاده کنید؛ گزارش نهایی باید هم‌پوشانی و Gap هر کدام را روشن کند.

چگونه ترکیب‌های ماتریس را انتخاب کنیم؟

سیگنال‌های انتخاب

ماتریس را از ترکیب داده و تعهد بسازید، نه از سلیقه تیم:

  • Analytics دست‌اول با رعایت Consent و حداقل‌سازی داده؛
  • قرارداد مشتریان، دستگاه سازمانی و الزامات قانونی؛
  • سهم درآمد، نرخ تکمیل Journey و هزینه شکست هر Cohort؛
  • تیکت‌های پشتیبانی، Incident و تاریخچه نقص‌ها؛
  • تغییرات Release: CSS جدید، SDK پرداخت، WebView، Camera یا Storage؛
  • تنوع Engine و OS، نه فقط محبوب‌ترین Brandها؛
  • حداقل/حداکثر سخت‌افزار یا نسخه اعلام‌شده محصول؛
  • دسترسی واقعی تیم به محیط و زمان بازتولید.

امتیاز ریسک ساده

برای هر ترکیب می‌توان امتیاز تقریبی زیر را در بازبینی تیمی ساخت:

Risk = Exposure × Business Impact × Change Likelihood × Detection Difficulty

اعداد حقیقت علمی نیستند؛ ابزار گفت‌وگو و اولویت‌بندی‌اند. امتیاز را با داده Incident و Production بازتنظیم کنید. یک محیط کم‌ترافیک اما قراردادی یا ایمنی‌حساس می‌تواند Tier ۱ باشد.

چرا سهم بازار به‌تنهایی کافی نیست؟

آمار عمومی ممکن است Cohort واقعی محصول شما را بازنمایی نکند، Brand را با Engine یکی بگیرد یا WebView و مرورگر درون‌برنامه‌ای را پنهان کند. از آن برای کشف فرضیه استفاده کنید، نه برای قرارداد پشتیبانی. همچنین فهرست ثابتِ «همه مرورگرهای مهم» سریعاً منقضی می‌شود.

کاهش ترکیب‌ها با Pairwise

اگر ابعاد تا حدی مستقل‌اند، ۲-way یا Mixed-strength می‌تواند پوشش Interactionها را با Row کمتر فراهم کند. اما Journey حیاتی، Incident regression، مرز عددی، حالت، توالی و ترکیب امنیتی باید Seed یا تست صریح داشته باشند. روش مدل‌سازی، Constraint و Verification در آموزش تست Pairwise و All-Pairs آمده است.

مثال: ماتریس فروشگاه اینترنتی ایرانی

فرض کنید داده محصول نشان می‌دهد بیشترین خرید از وب موبایل است و بازگشت از درگاه، ورود OTP و نمایش مبلغ نقاط پرریسک‌اند. جدول زیر نمونه است، نه نسخه آماده برای هر کسب‌وکار:

سطحمحیط نمایندهسفر/تمرکزتناوب
Tier 1Chrome Stable روی Android میانه بازارورود، جست‌وجو، سبد، درگاه، callback، رسیدهر Merge + دستگاه واقعی Release
Tier 1Safari روی iOS پشتیبانی‌شدهAutofill/OTP، بازگشت از درگاه، Safe area، Keyboardروزانه + واقعی Release
Tier 1Chrome دسکتاپ روی OS اصلی کاربرانتمام Golden path و پنل مشتریهر Merge
Tier 2Firefox و Edge در نسخه‌های قراردادیRegression اصلی، دانلود/چاپ و ورودNightly + Release
Tier 2Samsung Internet یا Brand پرترافیک واقعیپرداخت، Sticky UI، Keyboard و بازگشتNightly/هفتگی بر اساس ظرفیت
Tier 2WebView یا In-app browser مورد استفاده کمپینDeep link، Cookie، SSO و بازگشت به اپRelease و تغییر SDK
Cross-cuttingfa-IR، RTL، ارقام فارسی/لاتین، فونت بزرگمبلغ، تاریخ، آدرس، خطا و Invoiceدر تمام Tierهای منتخب
Cross-cuttingشبکه کند، قطعی و بازیابیIdempotency پرداخت، Retry و وضعیت نامشخصNightly + Exploratory

Oracle نمونه برای بازگشت از درگاه

  • Order دقیقاً یک‌بار ثبت شود، حتی با Refresh یا callback تکراری؛
  • مبلغ نمایشی، درخواست درگاه و Ledger برابر باشند؛
  • کاربر پس از بازگشت، وضعیت قطعی یا Pending قابل‌پیگیری ببیند؛
  • Back/Forward مرورگر Side effect دوم نسازد؛
  • پیام فارسی در RTL خوانا باشد و اطلاعات حساس در URL یا Console نرود؛
  • همان نتیجه با Keyboard، Touch و اندازه فونت بزرگ قابل دستیابی باشد.

برای طراحی عمیق‌تر روی نصب، مجوز، وقفه، دستگاه و Store از راهنمای تست اپلیکیشن موبایل استفاده کنید.

Engine، Brand، Channel و WebView را یکی نگیرید

Engine با Brand برابر نیست

Chrome و Edge ممکن است خانواده Engine مشترکی داشته باشند، اما Channel انتشار، Feature flag، Policy سازمانی، Codec، Extension، Integration سیستم‌عامل و زمان عرضه آن‌ها متفاوت است. اجرای Chromium متن‌باز پوشش مفیدی می‌دهد، ولی اثبات نمی‌کند رفتار Brand نصب‌شده کاربر دقیقاً همان است.

Channel بخشی از ریسک است

Stable محیط پایه است؛ Beta/Preview می‌تواند هشدار زودهنگام تغییر آینده باشد. قرار نیست همه تست‌ها روی همه Channelها اجرا شوند. یک Smoke کوچک روی Channel آینده برای محصول پرترافیک، زمان اصلاح را افزایش می‌دهد.

WebView یک مرورگر معمولی نیست

نسخه Engine، میزبان اپ، Bridge بومی، Cookie policy، Navigation delegate و Lifecycle روی رفتار اثر دارند. برای In-app browser نیز Header، Deep link، بازشدن پنجره جدید و بازگشت به میزبان را جدا بسنجید. برچسب «موبایل Chrome» برای توصیف این محیط کافی نیست.

از قواعد ثابت درباره iOS پرهیز کنید

سیاست Engine و قابلیت‌های مرورگر ممکن است با نسخه سیستم‌عامل، منطقه و مقررات تغییر کند. به‌جای جمله همیشگیِ «همه مرورگرهای iOS دقیقاً یکی‌اند»، محیط واقعیِ هدف و مستندات نسخه را بررسی و در Evidence ثبت کنید.

Feature Detection و Progressive Enhancement

تشخیص قابلیت می‌پرسد «این API یا مقدار CSS در محیط فعلی قابل استفاده است؟»؛ UA sniffing می‌پرسد «نام مرورگر چیست؟» و سپس از نام آن درباره قابلیت حدس می‌زند. راهنمای رسمی MDN درباره Feature Detection استفاده از آزمون قابلیت و سازوکارهایی مانند CSS.supports() و @supports را توضیح می‌دهد و آن را از Browser sniffing جدا می‌کند.

نمونه CSS با Fallback

.product-list {
  display: flex;
  flex-wrap: wrap;
}

@supports (display: grid) {
  .product-list {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr));
  }
}

نمونه JavaScript

if ("share" in navigator) {
  shareButton.hidden = false;
  shareButton.addEventListener("click", () => navigator.share(data));
} else {
  copyLinkButton.hidden = false;
}

وجود property فقط یک سیگنال است؛ درست‌کارکردن API، Permission، رفتار خطا و Integration را ثابت نمی‌کند. Feature Detection باید با تست رفتاری در محیط‌های Tier ترکیب شود. Polyfill نیز باید از نظر امنیت، اندازه Bundle، License و نگهداری ارزیابی شود.

دستگاه واقعی، Emulator و شبیه‌سازی مرورگر

محیطبرای چه چیزی خوب است؟چه چیزی را ثابت نمی‌کند؟
DevTools responsive modeViewport، DPR تقریبی، Orientation و بازبینی سریع CSSOS واقعی، Touch stack، فونت، GPU، باتری، Permission و WebView
Browser automation + device profileRegression سریع روی Viewport، UA، Locale، Timezone و قابلیت‌های Emulationسخت‌افزار و مرورگر Brandشده دقیق دستگاه
Simulator/Emulator سیستم‌عاملپوشش نسخه‌ای، Debug، Failure injection و اجرای تکرارپذیرهمه تفاوت‌های سنسور، OEM، Thermal، Radio و عملکرد واقعی
دستگاه واقعی محلی/ابریورودی، سخت‌افزار، OS integration، Camera، Biometrics، Push و تجربه واقعی‌ترخودبه‌خود همه شبکه‌ها، کاربران و نسخه‌ها را پوشش نمی‌دهد

نه محیط مجازی ذاتاً «کم‌دقت» است و نه دستگاه واقعی پاسخ همه سؤال‌ها. Fidelity نسبت به سؤال تست سنجیده می‌شود. برای CSS یک Viewport مجازی شاید کافی باشد؛ برای فوکوس پس از بازشدن Keyboard، NFC، مصرف باتری یا callback اپ پرداخت، دستگاه واقعی ارزش بیشتری دارد.

مجموعه واقعی را نماینده انتخاب کنید

به‌جای خرید ده‌ها مدل مشابه، مجموعه‌ای با تنوع OS، RAM/CPU، اندازه، OEM و Cohort درآمدی بسازید. هر دستگاه باید دلیل حضور، مالک، نسخه، وضعیت باتری/فضا و برنامه به‌روزرسانی داشته باشد. دستگاه‌های رهاشده با نسخه تصادفی، ماتریس قابل اعتماد نمی‌سازند.

معماری اجرای تست در CI/CD

پیش از Commit یا در PR

  • Lint و بررسی Static برای APIهای ناسازگار؛
  • Component test روی Breakpointها و متن‌های بلند فارسی؛
  • یک Browser/Engine سریع برای Golden path؛
  • Feature Detection و Fallbackهای قابل تست؛
  • Visual diff محدود و پایدار برای اجزای حساس.

پس از Merge

Regression حیاتی را روی چند Engine اجرا کنید. مستندات رسمی Playwright Projects نشان می‌دهد یک Suite را می‌توان با پیکربندی‌های مختلف Browser و Environment اجرا کرد. مستندات Emulation پلی‌رایت پارامترهایی مانند دستگاه، Locale، Timezone، Permission و Media را توضیح می‌دهد. این Profileها سریع و مفیدند، اما معادل خودکارِ همه دستگاه‌های Brandشده نیستند.

Nightly و Release candidate

  • ماتریس گسترده‌تر OS/Browser و Network profile؛
  • ترکیب‌های Pairwise و Regression نقص‌های گذشته؛
  • تست روی Browser channel آینده برای هشدار زودهنگام؛
  • دستگاه واقعی برای سفرهای Tier ۱؛
  • Exploratory charter روی تغییر پرریسک؛
  • نسخه Client قدیمی در برابر Backend جدید.

اجرای توزیع‌شده

Selenium Grid اجرای WebDriver را روی ماشین‌ها و محیط‌های مختلف توزیع می‌کند. Grid یا سرویس ابری ظرفیت می‌دهد، ولی انتخاب ماتریس، Isolation داده، تشخیص خطای زیرساخت و Oracle همچنان مسئولیت تیم است. ابتدا یک Pilot کوچک بسازید و هزینه Flake و Queue را اندازه بگیرید.

پس از انتشار

تست پیش از انتشار تمام تفاوت‌های Production را نمی‌بیند. Error، Core journey completion، نسخه Browser/OS در حد نیاز و با حریم خصوصی، و تیکت‌های پشتیبانی را پایش کنید. Telemetry باید سیگنال بازنگری ماتریس باشد، نه ابزار Fingerprinting بی‌ضابطه.

اتوماسیون چه چیزی را پوشش دهد؟

تست خودکار برای مسیرهای تکراری، Assertionهای دامنه‌ای و اجرای چندپیکربندی عالی است. اما هدف «هر Case روی هر ترکیب» نیست؛ این کار هزینه، زمان و Flake را ضرب می‌کند. راهبرد بهتر:

  • Smoke بسیار کوچک روی همه Rowهای ماتریس؛
  • Regression عمیق روی Tier ۱ و تغییرات حساس؛
  • تست Component برای حالت‌های بصری و فارسی؛
  • Contract test برای نسخه‌های API و Schema؛
  • تست دستی/اکتشافی برای Interaction، حس کاربری و محیط جدید؛
  • Real-device test محدود برای قابلیت‌های وابسته به سخت‌افزار یا OS.

هزینه انتخاب، نگهداری و سنجش بازگشت سرمایه در راهنمای اتوماسیون تست تشریح شده است.

Visual Regression بدون آلارم کاذب

Screenshot diff می‌تواند بریدگی متن، جابه‌جایی دکمه و تغییر ناخواسته CSS را پیدا کند؛ اما بدون کنترل محیط به نویز تبدیل می‌شود.

Baseline معتبر

  • Browser/OS/Font و رزولوشن Baseline نسخه‌دار باشند؛
  • داده، ساعت، Animation و تبلیغ پویا ثابت یا Mask شوند؛
  • Threshold با نمونه واقعی Anti-aliasing تنظیم شود؛
  • هر تغییر Baseline مالک و توضیح Review داشته باشد؛
  • تصویر واقعی حساس پیش از Archive پاک‌سازی شود.

محدودیت Visual diff

شباهت Screenshot ثابت نمی‌کند Keyboard navigation، نام دسترس‌پذیر، رویداد پرداخت یا API درست است. Snapshot را کنار Assertion رفتاری و تست دسترس‌پذیری قرار دهید، نه به‌جای آن.

نکات ویژه وب موبایل و اپ

  • بازشدن و بسته‌شدن Keyboard، تغییر Viewport و حفظ فوکوس؛
  • Safe area، بریدگی صفحه، Landscape و Multi-window؛
  • Permissionهای Denied/Ask every time و بازگشت از Settings؛
  • Deep link و Universal/App link در حالت نصب/عدم نصب؛
  • قطع و وصل شبکه، تغییر Wi-Fi به Cellular و Resume پس از Background؛
  • Autofill، OTP، Password manager و IME فارسی؛
  • Share، Upload، Camera، Download و بازکردن فایل؛
  • به‌روزرسانی اپ با داده نسخه پیشین و Rollback پشتیبانی‌شده؛
  • مصرف حافظه و رفتار Low-memory روی دستگاه ضعیف؛
  • In-app browser، Cookie/SSO و بازگشت به میزبان.

سازگاری فارسی و شرایط کاربران ایران

متن و ورودی

واژه طولانی، نیم‌فاصله، ترکیب فارسی و لاتین، اعداد ۱۲۳ و ۱۲۳، ایمیل/کدملی/شماره کارت، Cursor در RTL و Copy/Paste را تست کنید. فونت Web ممکن است دیر لود شود یا در شبکه محدود در دسترس نباشد؛ Fallback باید خوانا و بدون Layout shift مخرب باشد.

تاریخ، زمان و پول

تقویم شمسی، ISO date، منطقه زمانی ایران، تغییر روز در نیمه‌شب، جداکننده هزارگان و واحد ریال/تومان را در مدل دامنه روشن کنید. نمایش «۱۰۰,۰۰۰» بدون واحد و قرارداد تبدیل، مسئله سازگاری نیست؛ مسئله محصول و داده است.

درگاه و محدودیت شبکه

Redirect، تب جدید، Cookie، callback، Back و Retry را روی مرورگرهای Tier و WebViewهای واقعی بسنجید. وابستگی خارجی ممکن است از برخی شبکه‌ها، DNSها یا IPها رفتار متفاوت داشته باشد. نتیجه را با چند مسیر کنترل‌شده بررسی کنید و اطلاعات پرداخت یا PII را در HAR، Video و Console نگه ندارید.

Backward و Forward Compatibility

سازگاری فقط UI نیست. در Rolling deployment، نسخه جدید Backend ممکن است هم‌زمان به Client قدیمی و جدید پاسخ دهد. یک جدول حداقل بسازید:

ClientBackendانتظار
قدیمیِ هنوز پشتیبانی‌شدهجدیدقرارداد قبلی حفظ یا پاسخ ارتقا روشن؛ بدون Corruption
جدیدقدیمی در حین RolloutFeature negotiation/Fallback و عدم ارسال اجباری فیلد ناشناخته
جدیدجدیدرفتار کامل قابلیت تازه
قدیمی خارج از پشتیبانیجدیدخطای نسخه‌دار، امن و قابل‌فهم طبق سیاست

API و فایل

فیلد اختیاری، Enum تازه، ترتیب، Null، Idempotency، Content-Type و خطای نسخه را آزمایش کنید. جزئیات Contract و Negative testing در راهنمای تست API آمده است.

Schema و Migration

Expand–Migrate–Contract، خواندن داده قدیمی، Backfill قابل‌ازسرگیری و Rollback واقعی را در ترکیب نسخه‌ها بسنجید. حذف زودهنگام ستون یا Constraint جدید ممکن است Client قدیمی را فقط در بخشی از Rollout بشکند. برای الگوهای Integrity و Migration به راهنمای تست پایگاه داده مراجعه کنید.

انتخاب Device Farm یا سرویس ابری

نام ابزار به‌تنهایی راهبرد نیست. یک Proof of Concept با Journey واقعی اجرا و این معیارها را ثبت کنید:

  • واقعی یا مجازی‌بودن محیط و امکان اثبات مدل/نسخه دقیق؛
  • موجودی Browser/OS/Device موردنیاز و زمان انتظار؛
  • Concurrency، مدت Session، Retry و قیمت نهایی با Video/Artifact؛
  • Local tunnel، Proxy، IP allowlist و دسترسی به محیط آزمایش؛
  • محل پردازش/نگهداری داده، Retention، حذف Session و کنترل دسترسی؛
  • مدیریت Secret، Mask ورودی، Redaction و Audit log؛
  • Console، Network، HAR، Video، Crash و Export شواهد؛
  • پایداری اتصال و امکان پرداخت/پشتیبانی برای تیم مستقر در ایران؛
  • API/CLI، Pin نسخه، Integration با CI و خروج از Vendor lock-in؛
  • تفکیک شکست محصول از شکست زیرساخت و SLA سرویس.

داده Production واقعی را وارد دستگاه مشترک نکنید. حساب، کارت و شماره تماس مصنوعی بسازید و Cleanup قابل‌اثبات داشته باشید.

فرآیند ده‌مرحله‌ای تست سازگاری

  1. Scope محصول: Journey، Platform و ریسک خارج از محدوده را مشخص کنید.
  2. قرارداد پشتیبانی: Tier، نسخه، تاریخ بازبینی و مالک را بنویسید.
  3. جمع‌آوری شواهد: Analytics، قرارداد، Incident، معماری و تغییر Release را مرور کنید.
  4. مدل ابعاد: Browser/Engine/OS/Device/Locale/AT/WebView/API را فقط در حد مرتبط انتخاب کنید.
  5. کاهش ترکیب: Risk score، Partition، Constraint، Pairwise و Seedهای اجباری را اعمال کنید.
  6. تعریف Oracle: نتیجه دامنه، UI، ایمنی، Accessibility و Side effect را قابل سنجش کنید.
  7. انتخاب Fidelity: مشخص کنید هر سؤال به DevTools، Automation، Emulator یا دستگاه واقعی نیاز دارد.
  8. ساخت Laneها: PR، Merge، Nightly، Release و Production monitoring را جدا کنید.
  9. اجرای Pilot: یک سفر حیاتی را اجرا، Flake/هزینه/زمان بازتولید را اندازه‌گیری و ماتریس را اصلاح کنید.
  10. بازنگری دوره‌ای: با Releaseهای محیط، افت Usage، Incident و تغییر قرارداد، Tierها را نسخه‌گذاری کنید.

Test Case سازگاری چه اجزایی دارد؟

Case: بازگشت موفق از درگاه در iOS Safari

Environment:
- Device model / OS build
- Browser brand, channel, exact version
- App/Web build and feature flags
- Locale=fa-IR, RTL, Persian font
- Network profile

Precondition:
- سفارش مصنوعی یکتا و درگاه Sandbox
- Session تازه؛ بدون داده واقعی مشتری

Actions:
1. افزودن کالا و رفتن به پرداخت
2. ارسال یک‌باره درخواست
3. بازگشت از درگاه
4. Refresh کنترل‌شده صفحه نتیجه

Oracle:
- یک Order و یک Payment effect
- مبلغ و شناسه مرجع منطبق
- وضعیت قطعی یا Pending قابل بازیابی
- دکمه‌ها قابل لمس و متن بدون بریدگی
- Secret/PII در URL، Console و Artifact نیست

Case باید محیط را قابل بازسازی کند، نه اینکه فقط بنویسد «روی موبایل تست شد». Version و Build بخشی از ورودی تست‌اند.

گزارش باگ سازگاری و شواهد لازم

حداقل Evidence محیط

  • Browser Brand، Channel، نسخه دقیق و در صورت نیاز Engine build؛
  • OS version/build، Device model یا VM image؛
  • Viewport، DPR، Zoom، Orientation و اندازه فونت؛
  • Locale، جهت، Timezone، Keyboard/IME و فناوری کمکی؛
  • App/Web/WebView build، Feature flag و Account cohort مصنوعی؛
  • Network profile، Proxy/VPN و وضعیت Online→Offline؛
  • مراحل حداقلی، نتیجه موردانتظار و نتیجه واقعی؛
  • Screenshot/Video، Console، stack trace و HAR پاک‌سازی‌شده؛
  • محیط مشابهی که Pass می‌شود برای مقایسه.

عنوان خوب

به‌جای «صفحه در آیفون خراب است» بنویسید: «[iOS ۱۸.x / Safari Stable / fa-IR] پس از بازگشت از درگاه، دکمه مشاهده سفارش زیر Keyboard باقی می‌ماند». ساختار کامل و مثال‌های قابل استفاده در راهنمای گزارش باگ حرفه‌ای آمده است.

حریم خصوصی Evidence

HAR و Video ممکن است Token، شماره تماس، آدرس و داده پرداخت داشته باشند. پیش از ضمیمه‌کردن Redact کنید، دسترسی و Retention را محدود نگه دارید و از حساب مصنوعی استفاده کنید. شواهد بیشتر همیشه بهتر نیست؛ شواهد دقیق و حداقلی بهتر است.

معیارهای سنجش اثربخشی

  • درصد Cohort پشتیبانی‌شده بر اساس کاربر یا درآمد، همراه با منبع و تاریخ؛
  • پوشش Journeyهای حیاتی در هر Tier، نه فقط تعداد Browserها؛
  • نرخ Pass/Fail/Blocked به تفکیک Product و Infrastructure؛
  • زمان بازتولید نقص سازگاری و کامل‌بودن Evidence؛
  • Escape به Production بر اساس بُعد جاافتاده یا Environment gap؛
  • Flake و Queue time هر Lane و هزینه اجرای هر Signal؛
  • تفاوت کشف روی محیط مجازی و دستگاه واقعی؛
  • Usage محیط‌های در حال Deprecation و تعداد مشتری قراردادی؛
  • نقص‌های ناشی از Client/Server version skew؛
  • زمان از Release مرورگر/OS تا Smoke تأییدشده.

«۱۰۰٪ ترکیب‌ها Pass شدند» اگر ترکیب‌ها کم‌ریسک، Oracle ضعیف یا Artifact ناقص باشد، معنای زیادی ندارد. KPI فردی بر اساس تعداد باگ نیز رفتار نامطلوب ایجاد می‌کند.

سیاست Deprecation محیط قدیمی

  1. Usage، قرارداد، هزینه نگهداری و ریسک امنیتی را مستند کنید.
  2. مشتریان و پشتیبانی را پیش از تصمیم نهایی درگیر کنید.
  3. تاریخ پایان، نسخه جایگزین و مسیر ارتقا را اعلام کنید.
  4. Telemetry حداقلی برای سنجش مهاجرت تعریف کنید.
  5. در دوره گذار، Banner یا پیام قابل دسترس نشان دهید؛ کاربر را غافلگیر نکنید.
  6. Fallback یا Export داده را برای Journeyهای لازم بررسی کنید.
  7. پس از تاریخ، Matrix، مستندات، CI و SLA پشتیبانی را هم‌زمان به‌روز کنید.

UA block خام ممکن است Browser پشتیبانی‌شده را اشتباه رد کند. Capability و خطای واقعی را ترجیح دهید و تصمیم پشتیبانی را در Backend و Frontend سازگار نگه دارید.

اشتباه‌های رایج در تست سازگاری

  • وعده تجربه کاملاً یکسان یا بی‌نقص در همه محیط‌ها؛
  • استفاده از فهرست ثابت مرورگر و OS بدون تاریخ و قرارداد؛
  • برابرگرفتن Browser Brand با Engine متن‌باز؛
  • فرض اینکه Responsive mode همان دستگاه واقعی است؛
  • اصرار بر دستگاه واقعی برای هر سؤال یا حذف کامل آن از Release؛
  • انتخاب فقط بر اساس سهم بازار عمومی و ندیدن مشتری قراردادی؛
  • اعتماد به UA sniffing به‌جای Feature Detection و Fallback؛
  • اجرای کل Regression روی تمام ترکیب‌ها و ساختن Suite کند و Flaky؛
  • ندیدن WebView، Keyboard، Autofill، RTL و فونت فارسی؛
  • نادیده‌گرفتن API/Schema version skew در Rolling deployment؛
  • پذیرفتن Visual diff به‌عنوان اثبات رفتار یا دسترس‌پذیری؛
  • گزارش «روی موبایل خراب است» بدون Version، Build و Artifact؛
  • ذخیره Token و PII در Video/HAR سرویس ابری؛
  • حذف محیط قدیمی بدون Notice، داده و مسیر مهاجرت؛
  • شمردن تعداد ترکیب‌ها به‌جای پوشش ریسک و Journey.

چک‌لیست آمادگی انتشار

  • قرارداد Tierها نسخه، تاریخ بازبینی و مالک دارد.
  • ماتریس از Analytics، قرارداد، Incident و معماری تغذیه شده است.
  • Engine، Brand، Channel، WebView و Device در صورت نیاز تفکیک شده‌اند.
  • Journeyهای درآمدی، امنیتی و داده‌ای Seed صریح دارند.
  • Pairwise/Constraintها Review و Coverage آن‌ها Verify شده است.
  • Feature Detection و Fallback برای قابلیت‌های اختیاری وجود دارد.
  • RTL، متن بلند، ارقام، تاریخ، Timezone، Keyboard و فونت آزمایش شده‌اند.
  • Screen reader/Keyboard و Performance روی ترکیب‌های هدف جداگانه سنجیده شده‌اند.
  • PR، Nightly، Release و Real-device lane هدف و SLA روشن دارند.
  • Visual baseline پایدار، نسخه‌دار و دارای مالک Review است.
  • Client قدیمی/جدید با Backend قدیمی/جدید در Rollout بررسی شده است.
  • Evidence شامل نسخه دقیق است و Secret/PII ندارد.
  • شکست زیرساخت از شکست محصول در گزارش جدا می‌شود.
  • Monitoring پس از انتشار و معیار بازنگری Matrix فعال است.
  • سیاست Deprecation و پیام کاربر با تیم پشتیبانی هماهنگ است.

پرسش‌های متداول

تفاوت Cross-browser Testing و Compatibility Testing چیست؟

Cross-browser زیرمجموعه‌ای از سازگاری و متمرکز بر تفاوت مرورگرها و Engineهاست. Compatibility دامنه بزرگ‌تری دارد و OS، Device، Locale، WebView، شبکه، سخت‌افزار و نسخه API/Schema را نیز در صورت ارتباط پوشش می‌دهد.

آیا باید روی همه مرورگرها و دستگاه‌ها تست کنیم؟

خیر. فضای ترکیب‌ها عملاً نامحدود است. قرارداد پشتیبانی، داده کاربران، ارزش کسب‌وکاری، تاریخچه Incident و تغییر فنی را مبنا قرار دهید؛ Tier ۱ را عمیق، Tier ۲ را دوره‌ای و بقیه را طبق سیاست روشن پوشش دهید.

Playwright WebKit همان Safari واقعی است؟

اجرای WebKit سیگنال سریع و ارزشمندی درباره یک Engine می‌دهد، اما Browser Brand، OS integration، Codec، فونت، Policy و سخت‌افزار محیط واقعی را کامل بازنمایی نمی‌کند. برای Journey حیاتی Safari، اجرای محدود روی محیط واقعی هدف لازم است.

Emulator بهتر است یا دستگاه واقعی؟

هیچ‌کدام مطلقاً بهتر نیست. Emulator برای پوشش سریع نسخه‌ها، Debug و شرایط تکرارپذیر مناسب است؛ دستگاه واقعی برای Touch، سخت‌افزار، OEM، Permission، Push، Battery و عملکرد واقعی‌تر. Fidelity را بر اساس سؤال و ریسک انتخاب کنید.

هر چند وقت Compatibility Matrix را بازبینی کنیم؟

حداقل در هر چرخه برنامه‌ریزی Release و هنگام عرضه نسخه مهم Browser/OS، تغییر SDK، Incident یا تغییر قرارداد. یک بازبینی ماهانه یا فصلی ثابت مفید است، اما Triggerهای رویدادمحور را جایگزین نمی‌کند.

جمع‌بندی

تست سازگاری مسابقه جمع‌کردن دستگاه و مرورگر نیست؛ مدیریت شفاف ریسک در یک دامنه پشتیبانی‌شده است. از قرارداد Tier شروع کنید، ماتریس را با داده واقعی و تنوع فنی بسازید، Feature Detection و Fallback را در طراحی وارد کنید و برای هر سؤال Fidelity مناسب—از Component test تا دستگاه واقعی—را برگزینید. در پایان، ارزش برنامه با تعداد ترکیب‌ها سنجیده نمی‌شود؛ با این سنجیده می‌شود که سفر حیاتی در محیط‌های متعهدشده نتیجه معادل دارد، شکست قابل تشخیص و بازتولید است و تغییرات آینده بدون غافلگیری مدیریت می‌شوند.

این مقاله را با دیگران به اشتراک بگذارید

نویسنده

محمد عسکری

محمد هستم، توسعه‌دهنده وب با بیش از ده سال تجربه در برنامه‌نویسی سمت سرور و کاربر. به یادگیری و اشتراک‌گذاری دانش علاقه‌مندم و اخیراً تمرکزم را روی حوزه تست نرم‌افزار گذاشته‌ام تا تجربیاتم را در این زمینه نیز به اشتراک بگذارم و به درک بهتر کیفیت نرم‌افزار کمک کنم.

همه مقاله‌ها

ادامه مطالعه

دیدگاهتان را بنویسید

ایستگاه بعدی شما

TestRail را همین حالا در محیط دمو ببینید.

محیط تست آماده

دسترسی به دمو TestRail

قبل از ورود، مشخصات زیر را در صفحه ورود محیط دمو وارد کنید.

آدرس دمو

https://demo.testrail.ir

ایمیل ورود

demo@testrail.ir

رمز عبور

demo_user