۱۲۰ بررسی رابط کاربری در شش دقیقه اجرا شده‌اند، همه سبزند و Dashboard ادعا می‌کند ۱۰۰٪ مسیرهای حیاتی پوشش داده شده‌اند؛ آیا کاربر می‌تواند با موفقیت خرید کند؟ هنوز معلوم نیست. شاید Locator روی دکمهٔ اشتباه کلیک کرده، Toast موفقیت دیده شده اما Order ساخته نشده، Retry نخستین Failure را پنهان کرده، تست فقط با Mouse و یک Viewport اجرا شده یا Evidence به Build دیگری تعلق دارد.

اتوماسیون تست رابط کاربری زمانی ارزشمند است که یک User-visible Claim را از راه Interaction و Observation قابل بازتولید بسنجد. واحد مهندسی این راهنما UI Interaction & Observation Contract است: User Task/Visible Behavior → Subject/State/Data → semantic Locator → Actionability/Interaction → Synchronization → UI و business-side-effect Oracle → Browser/Viewport/Locale → Evidence/Trace → Failure attribution → Repair/Correction.

این صفحه مالک تعداد مناسب Unit/Integration/E2E نیست؛ آن تصمیم در راهنمای عملی هرم تست بررسی می‌شود. اینجا می‌پرسیم: وقتی UI سطح درست Observation است، چگونه Checkی بسازیم که واقعاً همان رفتار مورد نظر را ببیند و Failure آن قابل توضیح باشد؟

پاسخ کوتاه: UI Automation خوب چه ویژگی دارد؟

Check خوب از Task و رفتار قابل مشاهدهٔ کاربر شروع می‌شود، نه از DOM. هدف را با Locator معنایی و یکتا پیدا می‌کند؛ پیش از Action، State و Actionability را بررسی می‌کند؛ به‌جای Sleep ثابت منتظر Condition مرتبط می‌ماند؛ هم Feedback رابط و هم Side effect مهم را با Oracle نسخه‌دار می‌سنجد؛ Config مرورگر/نمایش/Locale را پین می‌کند؛ و برای هر Attempt، Trace و Evidence قابل نسبت می‌سازد.

  • Click succeeded به معنای Task succeeded نیست.
  • Element visible به معنای قابل‌استفاده یا درست‌نام‌گذاری‌شده نیست.
  • Toast success به معنای ایجاد اثر کسب‌وکاری نیست.
  • Screenshot equal به معنای رفتار یا دسترس‌پذیری درست نیست.
  • UI PASS به معنای نبود باگ، Coverage کافی یا آمادگی انتشار نیست.

مرز این راهنما با اتوماسیون عمومی، Framework و Pyramid

پرسشمالک محتواییمرز این صفحه
اصلاً چه چیزی را خودکار کنیم؟راهنمای اتوماسیون تستکاندیدا، معماری، هزینه و Pilot عمومی
هر Automated Check چه Claim و lifecycle دارد؟Automation Claim & LifecycleOracle/Evidence/Quarantine/Retirement مستقل از Interface
Framework را چگونه انتخاب کنیم؟انتخاب فریم‌ورک اتوماسیونCriteria، Architecture و PoC ابزار
Unit/Integration/E2E چه نسبتی داشته باشند؟هرم تست در عملRisk portfolio و layer placement
Interaction و Observation در UI چگونه معتبر شوند؟همین راهنماLocator، actionability، wait، config، evidence و repair

UI Check، E2E، Browser Test و Visual Test یکی نیستند

نوعSubject/Observationادعای مجاز نمونه
Component UIComponent render + interaction در HarnessState/props مشخص رفتار قابل مشاهدهٔ تعریف‌شده می‌سازند
Browser integrationUI با چند جزء/سرویس کنترل‌شدهInteraction در Config مشخص به Effect منتخب متصل است
System UIسامانهٔ مستقر با Dependencyهای تعریف‌شدهJourney محدود در Build/Environment مشخص کامل می‌شود
E2Eزنجیرهٔ واقعی‌تر بین Boundaryهای متعددچند جزء برای Task نام‌دار همکاری می‌کنند
Visual regressionرندر پیکسلی/ساختاری در Baseline مشخصDiff از Tolerance تعریف‌شده عبور نکرده است
Accessibility checkRule/interaction/AT observationRule یا معیار محدود در Config آزموده شده است

UI بودن، E2E بودن را تضمین نمی‌کند؛ E2E بودن نیز به معنای واقعی‌بودن همهٔ Dependencyها نیست. نام Test باید Boundary و Fidelity را نشان دهد، نه ارزش یا جامعیت آن را.

UI Interaction & Observation Contract چیست؟

این Contract رابطهٔ بین قصد کاربر، Target رابط، Action ماشینی، State/زمان و Observation را نسخه‌دار می‌کند. هدف تحمیل قالب سنگین به هر Check نیست؛ هدف آشکارکردن فرض‌هایی است که در «کلیک کن و منتظر Toast بمان» پنهان می‌شوند.

UIInteractionObservationContract
  checkId / version / portfolio / risk / basis
  userTask / visibleBehavior / boundedClaim / claimLimit
  UIContract / immutableSubject / preconditions / initialState
  data / namespace / cleanup / dependency
  locator.semantics / contract / strictness / ambiguity
  interaction.intent / actionability / focus / keyboard / pointer
  scroll / overlay / dialog / upload-download
  readiness / condition / timeoutBudget / asyncBoundary / clock
  oracle.source / uiRule / sideEffectRule / tolerance / window
  browser / version / OS / viewport / scale / locale / timezone
  font / colorScheme / reducedMotion / zoom / network
  isolation / parallelPartition / resultVocabulary / retry
  evidenceManifest / trace / DOM / network / console / digest
  failureClass / observation / hypothesis / causeEvidence
  repairTrigger / affectedScope / verification / correction
  owner / triageSLA / reviewDue / cost / measure / guardrail

چه زمانی UI سطح درست Observation است؟

UI را وقتی انتخاب کنید که Risk به Interaction، rendering، focus، browser behavior، integration از مسیر واقعی کاربر یا feedback قابل مشاهده وابسته است. اگر Question فقط منطق محاسبه، schema validation یا API contract است، UI ممکن است Setup و Noise غیرضروری اضافه کند. اما «همیشه به لایهٔ پایین‌تر منتقل کن» نیز غلط است؛ حذف UI می‌تواند Integration و User-agent behavior را نامرئی کند.

پرسشObservation point محتملچرا؟
فرمول تخفیف درست است؟Unit/domainUI Interface مرتبط نیست
API خطای duplicate را برمی‌گرداند؟API/contractپاسخ Protocol مستقیم‌تر است
کاربر با Keyboard فرم را Submit می‌کند؟Browser UIFocus/order/semantics لازم‌اند
پس از Submit، effect و feedback هماهنگ‌اند؟UI + side-effect observationمرز نمایش و سیستم باید متصل شود
Layout در فونت فارسی نمی‌شکند؟Visual/browser matrixرندر واقعی لازم است
Journey در PSP واقعی موفق است؟کنترل چندسطحی/محدودUI تنها Cause/Boundary را جدا نمی‌کند

مرحله ۱: User Task را به Claim محدود تبدیل کنید

از «Checkout را تست کن» شروع نکنید. Actor capability، هدف، نقطهٔ شروع، Interaction mode، Expected visible behavior و Effect مهم را بنویسید. Claim باید Subject و Config را محدود کند. Claim limit نیز چیزهایی مانند UX quality، همهٔ Browserها، دسترس‌پذیری کامل و financial correctness را خارج نگه دارد.

userTask: ثبت سفارش با صفحه‌کلید
visibleBehavior:
  - هنگام pending دکمه قابل submit دوباره نیست
  - یک status confirmation قابل مشاهده/اعلام است
boundedClaim:
  BUILD-R22 در Chromium/config مشخص، برای Order مصنوعی
  دقیقاً یک confirmation و یک Ledger effect می‌سازد
claimLimit:
  نه UX، WCAG conformance، coverage، absence of defects یا release

مرحله ۲: UI Contract را از DOM فعلی جدا کنید

DOM یک Implementation snapshot است؛ UI Contract معنای مورد اتکای کاربر/آزمون را ثبت می‌کند: Role/name، label-control relation، state، status semantics، Test ID قراردادی یا Domain component interface. تغییر Class ممکن است Contract را عوض نکند؛ تغییر Accessible name یا Action semantics ممکن است بدون Diff ظاهری Contract را بشکند.

Contract باید Owner، version، consumerها و change policy داشته باشد. Test-specific attribute همیشه بد یا خوب نیست: اگر معنای پایدار و governance دارد مفید است؛ اگر برای دورزدن Interface یا انتخاب عنصر مبهم ساخته شود، Test به چیزی غیر از تجربهٔ کاربر متصل می‌شود.

مرحله ۳: Locator معنایی و یکتا بسازید

Locator باید Target مورد قصد را در لحظهٔ Action پیدا کند. Role/name، label، text، alt یا Test ID نسخه‌دار گزینه‌اند؛ هیچ اولویت مطلقی برای همهٔ UIها وجود ندارد. Contract را بر معنایی بنا کنید که تغییر آن واقعاً باید Review تست را برانگیزد.

LocatorSignal تغییرخطر
role + accessible nameمعنا/نام قابل درک تغییر کردهترجمه یا نام تکراری نیاز به Scope دارد
labelرابط label-control تغییر کردهlabel ناقص خودش Defect محتمل است
visible textمتن مصرفی تغییر کردهlocale/copy variation
test id قراردادیAutomation interface تغییر کردهممکن است semantics کاربر را نسنجد
CSS/XPath ساختاریDOM implementation تغییر کردهFalse Fail ناشی از Refactor بی‌معنا

Strictness مهم است: اگر دو Target match شدند، انتخاب first() یا index ثابت شاید Test را سبز ولی Intent را مبهم کند. Ambiguity باید Failure قابل‌طبقه‌بندی بسازد، نه انتخاب تصادفی.

مرحله ۴: Actionability را صریح کنید

وجود Element در DOM برای Click کافی نیست. Target ممکن است hidden، disabled، moving، covered، خارج Viewport یا detached باشد. Frameworkها مجموعه‌ای از Actionability check دارند، اما semantics Product را نمی‌دانند؛ Element فنی قابل کلیک ممکن است طبق Rule کسب‌وکار هنوز نباید قابل استفاده باشد.

  • Visible، stable، enabled و capable of receiving event را از state کسب‌وکاری جدا کنید.
  • Overlay، sticky header، animation و re-render را در Failure evidence نگه دارید.
  • Force click را فقط با دلیل و Claim محدود استفاده کنید؛ این گزینه می‌تواند رفتار واقعی کاربر را دور بزند.
  • Hover، touch، long-press و drag هرکدام Input semantics و Config متفاوت دارند.

مرحله ۵: Mouse، Keyboard، Touch و Assistive مسیرهای متفاوت‌اند

Click ماشینی جای مسیر Keyboard یا Touch را نمی‌گیرد. Focus order، focus visibility، keyboard activation، touch target، pointer capture، IME و Screen reader interaction Failure modeهای جدا دارند. برای Risk مهم، Interaction mode را در Population و Claim بنویسید.

یک Check با element.click() ممکن است event را مستقیم فراخوانی کند و scrolling/actionability واقعی را نبیند. انتخاب API سطح پایین یا بالا باید آگاهانه باشد و در Contract ثبت شود.

مرحله ۶: Focus را به‌عنوان State قابل مشاهده ببینید

Focus فقط جزئیات دسترس‌پذیری نیست؛ تعیین می‌کند input بعدی کجا می‌رود، dialog چگونه بسته می‌شود و کاربر پس از Validation error چه می‌بیند. Initial focus، tab order، focus trap، restoration و visible indicator را در UI Contract بنویسید. Assertion باید Target و زمان مناسب را بسنجد.

اجرای خودکار Keyboard می‌تواند بخشی از رفتار را بسنجد، اما Conformance یا usability کاربران دارای معلولیت را ثابت نمی‌کند. راهنمای کامل در تست دسترس‌پذیری WCAG ۲.۲ قرار دارد.

مرحله ۷: Synchronization را بر Condition مرتبط بنا کنید

sleep(5000) نه می‌داند چه چیزی باید آماده شود و نه پس از پنج ثانیه چه وضعی معتبر است. اگر سیستم سریع باشد زمان هدر می‌رود؛ اگر کند باشد Test هنوز می‌شکند. Readiness باید از state قابل مشاهده مشتق شود: Role ظاهر شده، response نام‌دار تکمیل، spinner حذف، state transition رخ داده یا side effect در window تعریف‌شده مشاهده شده است.

انتظار ضعیفCondition بهترمحدودیت
Sleep 5sstatus به state نهایی نام‌دار برسدStatus شاید side effect را نبیند
network idleresponse/operation مشخص + UI stateBackground traffic ممکن است دائمی باشد
element existselement معنایی actionability و state درست داردBusiness readiness جداست
spinner goneOutcome/Effect مشخص در windowSpinner implementation detail است
retry assertion foreverbounded polling با diagnostic observationTimeout باید consequence-based باشد

مرحله ۸: Timeout بودجه است، نه درمان Flakiness

افزایش Timeout می‌تواند Failure را دیرتر نشان دهد یا variation واقعی را مخفی کند. بودجه را بین Navigation، readiness، interaction و eventual side effect تقسیم کنید؛ مقدار را با SLO/Environment baseline و Consequence تعیین کنید. در Timeout evidence بنویسید آخرین State چه بود، نه فقط «timed out».

Clock، animation، debounce، token expiry و scheduled job باید کنترل یا ثبت شوند. Timezone و DST نیز بخشی از Config هستند. Fake clock فقط بخش تحت کنترل را deterministic می‌کند و رفتار real-time dependency را تضمین نمی‌کند.

مرحله ۹: UI Oracle را از پیام موفقیت فراتر ببرید

UI Oracle می‌تواند visible state، role/status، field error، route یا DOM semantics را بسنجد. برای Taskهایی که effect مهم دارند، Oracle دوم لازم است: API query، event، database projection، stub record یا audit entry کنترل‌شده. این Observation باید از مسیر مستقل و با key هویتی همان Subject باشد.

oracle.source:
  BASIS-v9:R-IDEMP-6 + UI-CONTRACT-v5
uiRule:
  exactly one role=status confirmation for Order identity
sideEffectRule:
  exactly one Ledger effect by tenant+order+event
window:
  UI 5s; effect within 10s synthetic window
claimLimit:
  no inference about other PSP modes, UX, finance or release

مرحله ۱۰: State و Data را برای UI ایزوله کنید

Shared account، موجودی مشترک، سبد باقی‌مانده و Order تصادفی از Database باعث collision و order dependence می‌شوند. هر Check باید Namespace، Seed، Tenant/actor، initial state و cleanup محدود داشته باشد. Login state reuse می‌تواند سرعت بدهد، اما باید Scope، freshness، privilege و mutation contract داشته باشد.

Isolation به معنای ساخت کامل دنیا برای هر Check نیست. Dependencyهای گران می‌توانند shared اما read-only یا partitioned باشند؛ Trade-off را صریح کنید و Parallel capacity را آزمایش کنید.

مرحله ۱۱: Browser Context و Session را کنترل کنید

Cookie، local/session storage، cache، permission، service worker، IndexedDB و feature flag State رابط‌اند. Context تازه بسیاری از leakageها را کم می‌کند، ولی اگر هدف persistence یا upgrade است باید همان State را عمدی بسازید. Check independent بودن را با اجرای تنها، ترتیب تصادفی و parallel آزمایش کنید.

مستند رسمی Selenium دربارهٔ پرهیز از State مشترک دادهٔ مستقل، پاک‌سازی دادهٔ کهنه و Driver تازه را توصیه می‌کند. خود Selenium این مطالب را guideline وابسته به Context می‌نامد؛ آن را با محدودیت سامانهٔ خود تطبیق دهید.

مرحله ۱۲: Config مرورگر و نمایش را هویت بدهید

نام Chrome کافی نیست. Browser build، engine/channel، OS/image، viewport، device scale، input device، locale، timezone، font، zoom، color scheme، reduced motion، contrast preference، permission و network profile بر رفتار و رندر اثر دارند. Project config را به Evidence Manifest پیوند دهید.

ConfigFailure modeنمونه Evidence
Viewport/zoomresponsive layout، overlap، target offscreendimensions + screenshot + DOM
Locale/fonttext expansion، glyph، number/date parsinglocale/font digest
Timezone/clockcutoff، expiry، relative timeISO instant + timezone
Reduced motionanimation path/transition timingmedia setting + trace
Network profilelate response، retry، offline/partial stateHAR/network events
Browser versionengine/API/permission behaviorbinary/version/image digest

مرحله ۱۳: Browser Matrix را از Risk مشتق کنید

«همهٔ Browserها» Population تعریف‌شده نیست. Analytics معتبر، Supported platform policy، Contract، Risk، capability و change profile را ترکیب کنید. Smoke گسترده و Journey عمیق می‌توانند Matrix متفاوت داشته باشند. نتیجهٔ Chromium را به Safari/WebKit، Mobile viewport یا Screen reader تعمیم ندهید.

برای انتخاب Browser/OS/Device و روش Sampling از راهنمای Cross-browser Testing استفاده کنید؛ این صفحه فقط Contract هر اجرای UI را پوشش می‌دهد.

مرحله ۱۴: Dependency خارجی را به Product خود نسبت ندهید

سرویس ثالث، CAPTCHA، OTP، Payment gateway، Email و CDN خارج کنترل ممکن است Test را کند، غیرقطعی یا خطرناک کنند. در بیشتر CIها Stub/virtual service با Contract روشن Signal تشخیصی‌تر می‌دهد؛ تعداد کمی Probe کنترل‌شده می‌تواند Integration واقعی را جدا بسنجد. شکست Third party را از Product/Testware/Environment جدا طبقه‌بندی کنید.

Mock همه‌چیز را درست نمی‌کند: اگر Model کهنه یا بیش‌ازحد خوش‌بین باشد، UI سبز و Production ناسازگار می‌شود. Contract test، version، scenario parity و confirmation point لازم است.

مرحله ۱۵: Result Vocabulary تشخیصی بسازید

Resultمعنااقدام
PASSObservation با Oracle همین Subject/Config سازگار بودClaim محدود؛ نه Release
FAIL_PRODUCTناسازگاری معتبر با evidence منتسب به ProductFinding/Defect triage
FAIL_TESTWAREContract/Locator/Oracle/Implementation تست مشکل داردRepair با Review
ERROR_ENVBrowser/grid/deploy/config اجرای معتبر را نگذاشتEnvironment response
ERROR_DATASeed/state/partition معتبر نبودData response
ERROR_DEPENDENCYDependency خارج مرز شکستDependency policy
SKIPPEDطبق Rule اجرا نشدDenominator/Reason
INCONCLUSIVEEvidence برای Attribution کافی نیستUnknown + next observation

این Classification خودکار ممکن است Candidate باشد، نه حقیقت Cause. Observation، Hypothesis و confirmed cause را جدا نگه دارید.

مرحله ۱۶: Trace را به Screenshot تقلیل ندهید

Screenshot آخرین Frame را نشان می‌دهد، نه مسیر Interaction، DOM پیشین، request/response، console یا timing. Evidence bundle متناسب می‌تواند Trace، DOM/accessibility snapshot، Screenshot failure-only، network events، console، video محدود، raw result و Manifest هویت را نگه دارد. همهٔ Artifactها را همیشه ضبط نکنید؛ هزینه و حریم خصوصی دارند.

UIEvidenceManifest
  check: UI-CHECKOUT-IDEMP-22@5
  subject: BUILD-R22 / DEPLOY-R22
  config: Chromium fictional-140 / Linux R22 / fa-IR / 1280x720
  run / attempt / startedAt / finishedAt / outcome
  trace / screenshot / DOM / network / console / raw
  dataNamespace / dependency versions
  digest / redaction / retention / unknowns
  claimLimit: no UX, conformance, coverage, quality or release proof

Playwright Best Practices برای failureهای CI استفاده از Trace Viewer را توصیه می‌کند و timeline، DOM snapshot و network را در دسترس می‌گذارد. این قابلیت ابزار، Cause را خودکار اثبات نمی‌کند؛ Evidence باید به Claim و Subject شما متصل شود.

مرحله ۱۷: Retry نخستین Failure را پاک نکند

FAIL سپس PASS یک PASS ساده نیست؛ Variation مشاهده شده است. همهٔ Attemptها، Config/Seed/time و Artifact را حفظ کنید. Summary میان PASS_FIRST_TRY، PASS_AFTER_RETRY، CONSISTENT_FAIL، MIXED و ERROR_AFTER_RETRY تمایز بگذارد. Retry policy باید هدف داشته باشد: جمع‌آوری Evidence، تحمل transient تعریف‌شده یا تأیید Variation.

Retry-until-green و حذف Attempt اول، pass rate را آرایش می‌کند. Quarantine نیز باید Owner، expiry، Risk impact، Control جایگزین و re-entry داشته باشد؛ وگرنه Suite با حذف Signalهای بد ظاهراً پایدار می‌شود.

مرحله ۱۸: Flaky، Brittle، False Fail و False Pass را جدا کنید

برچسبتعریف قابل آزمونEvidence لازم
FlakyOutcome بین اجراهای معادل طبق Contract تغییر می‌کندcontrolled series + equivalence proof
Brittleتغییر غیرمرتبط با Claim، Testware را با repair پرهزینه می‌شکندrepresentative change experiment
False FailCheck Fail می‌دهد ولی Claim نقض نشدهindependent observation/cause
False PassCheck PASS می‌دهد ولی Claim نقض شدهinjected fault/independent oracle
SlowLatency از budget/decision need عبور می‌کندdistribution + queue/run split

UI Test ذاتاً Flaky یا Brittle نیست؛ Boundary بیشتر و browser state، failure opportunity را افزایش می‌دهد. معماری Product، Testability، Contract، Data و Environment تعیین‌کننده‌اند. Unit Test نیز می‌تواند کند، شکننده و بی‌ارزش باشد.

مرحله ۱۹: Failure Attribution را پیش از Repair انجام دهید

«Element not found» Cause نیست؛ Observation ابزار است. Candidateها شامل تغییر UI Contract، locator scope، render failure، auth redirect، data state، overlay، network، browser crash یا wrong Build‌اند. Triage packet باید Fact، Hypothesis و cause evidence را جدا کند.

FailureAttribution
  observation: submit locator matched zero elements at 08:00:04Z
  facts: route=/checkout; status API=200; form role absent
  hypotheses:
    H1 auth redirect race
    H2 feature flag disabled form
    H3 UI contract intentionally changed
  evidenceNeeded: trace step, DOM before action, flag snapshot, C22 diff
  cause: UNKNOWN until evidence confirms
  prohibited: auto-update locator merely to make the test green

مرحله ۲۰: Repair Contract و blast radius بسازید

Repair باید Trigger، confirmed cause، change type، affected consumers، Reviewer و Verification داشته باشد. تغییر central Page/Component abstraction می‌تواند صدها Check را تغییر دهد؛ Blast radius و representative fixtures را اجرا کنید. Auto-heal بدون Review ممکن است Target مشابه اما غلط را انتخاب و False Pass بسازد.

Page Object یک الگوی ممکن برای پنهان‌کردن UI details و ارائهٔ service interface است؛ اجباری یا تضمین‌کننده نیست. Abstraction بسیار بزرگ Intent و Failure location را پنهان می‌کند. الگو را با rate of change و team review fit انتخاب کنید.

مرحله ۲۱: Visual Regression را مستقل مهندسی کنید

Screenshot comparison به Baseline، viewport، OS/browser، font، animation/clock، content masking، color profile، threshold و Diff triage نیاز دارد. برابر بودن Screenshot رفتار صحیح را ثابت نمی‌کند؛ متفاوت‌بودن نیز لزوماً Defect نیست. Visual output باید یک Oracle محدود با approved change history باشد.

طراحی کامل Baseline، mask، tolerance و Diff review در راهنمای Visual Regression Testing آمده است. UI functional Check را با VRT مخلوط نکنید مگر Claim ترکیبی روشن باشد.

مرحله ۲۲: Accessibility Automation را محدود گزارش کنید

Rule engine می‌تواند برخی violationهای قابل محاسبه را بیابد؛ Keyboard sequence، semantic assertion و accessibility tree نیز Observationهای مفیدند. اما اسکن سبز، Conformance WCAG یا usability کاربران دارای معلولیت را ثابت نمی‌کند. Population page/state/component و Rule set/version را ثبت کنید.

W3C در راهنمای Understanding Techniques صریحاً می‌گوید آزمون Techniqueها به‌تنهایی آزمون Conformance کل WCAG نیست و ارزیابی باید فراتر برود. User agent و assistive technology support نیز با زمان تغییر می‌کند.

مرحله ۲۳: Layer placement را با Observation gap تصمیم بگیرید

برای هر UI Check بپرسید کدام بخش Claim را می‌توان در Component/API/Contract سریع‌تر و تشخیصی‌تر سنجید و کدام بخش فقط در UI دیده می‌شود. ممکن است یک Journey به چند Check کوچک‌تر و یک UI seam check تبدیل شود. اما تعداد کم/زیاد به‌تنهایی هدف نیست؛ Risk و Observation gap مهم‌اند.

Test Pyramid یک heuristic است، نه نسبت ثابت. عبارت «UI باید کوچک‌ترین لایه باشد» ممکن است برای Productهای UI-heavy، legacy یا thin-client نیاز به تفسیر داشته باشد. Portfolio را با latency، diagnostic value، fidelity، cost و blind spot بازبینی کنید.

مرحله ۲۴: Pipeline placement را از Suite design جدا کنید

یک UI Check خوب الزاماً در PR اجرا نمی‌شود. Smoke سریع ممکن است pre-merge، Matrix گسترده nightly و system/canary check پس از deploy باشد. Trigger را با Change impact، Environment availability، execution cost، signal latency و consequence تنظیم کنید. Queue time و provisioning را از test duration جدا بسنجید.

Parallelism فقط تعداد Worker نیست؛ Data partition، rate limit، dependency capacity و artifact collision لازم‌اند. Sharding نادرست ممکن است Setup را چند برابر و Environment را اشباع کند.

راهنمای رسمی Playwright چه می‌گوید و چه نمی‌گوید؟

مستند رسمی Playwright توصیه می‌کند رفتار قابل مشاهدهٔ کاربر آزموده شود، Locatorهای user-facing/explicit contract ترجیح داده شوند، Checkها تا حد ممکن isolated باشند، از web-first assertion استفاده شود و Trace برای Debug در CI به کار رود. Locatorها strictness و auto-waiting دارند و generated locator قابل ویرایش است.

این توصیه‌ها تضمین Resilience، Coverage، UX، Accessibility یا Product quality نیستند. Auto-waiting business readiness را نمی‌فهمد، Locator generator Intent دامنه را نمی‌داند و Trace Cause را خودکار ثابت نمی‌کند. Version و Context ابزار را در تصمیم محلی نگه دارید.

Selenium چرا از عبارت Best Practice پرهیز می‌کند؟

Selenium Encouraged Behaviors عمداً می‌گوید هیچ رویکردی برای همهٔ موقعیت‌ها مناسب نیست و مطالب را guideline/recommendation می‌نامد. همچنین روشن می‌کند Selenium تعامل Browser را ممکن می‌سازد، اما Suite خوش‌معماری را برای شما طراحی نمی‌کند.

بنابراین Page Object، fresh browser، locator style یا mock service را قانون ثابت تلقی نکنید. Failure mode، Team skill، Product architecture و Evidence need را بسنجید.

آزمایش بازتولیدپذیر: ۱۲۰ Check سبز در برابر ۱۱۵ Failure

Fixture کاملاً مصنوعی و آفلاین SYN-UI-INTERACTION-OBSERVATION-01 با Node.js v24.۱۸.۰ ساخته شد؛ Browser، شبکه، Database یا Product واقعی ندارد. Dashboard سطحی فقط ۱۲۰/۱۲۰ Green، «۱۰۰٪ مسیر حیاتی» و شش دقیقه را دید و PASS داد.

{
  "ruleCount": 115,
  "superficial": {
    "status": "PASS",
    "message": "120/120 UI checks green; 100% critical journeys; 6 minutes"
  },
  "contractAudit": {
    "status": "HOLD",
    "findingCount": 115
  }
}

ممیزی همهٔ ۱۱۵ Rule را Fail کرد: دوازده Portfolio/Product/Goal/Risk/Basis/Repository/Commit/Build/Deployment/UI Contract/Environment/Data identity کهنه؛ Check ID تکراری و Question/Claim/Task/State/Data ناقص؛ DOM locator غیرsemantic و مبهم؛ نبود Actionability و همهٔ Interaction modeها؛ Sleep ثابت و نبود readiness/timeout/async/clock؛ Toast-only Oracle؛ فقدان browser/render/locale/network Config؛ نبود isolation/dependency/vocabulary؛ Evidence/Trace/DOM/network/console/raw/time/digest/Unknown/redaction/retention؛ Retry پنهان؛ Attribution و Repair بی‌مدرک؛ Owner/cost/measure؛ و ۲۲ ادعای مطلق دربارهٔ User success، Coverage/Release، ذات UI/Unit، نسبت Pyramid، Screenshot، Accessibility، Automation، Tool/Pattern/Locator و Green confidence.

نسخهٔ اصلاح‌شدهٔ آزمایش چه کرد؟

نسخهٔ اصلاح‌شده UI-PORT-۲۲/SYN-CHECKOUT/PG-۱۵/RISK-v11/BASIS-v9/checkout-ui-tests/C22/BUILD-R22/DEPLOY-R22/UI-CONTRACT-v5/ENV-UI-R22/DATA-SYN-۲۲ را پین کرد. Check یکتا Task صفحه‌کلید، visible behavior، semantic strict Locator، actionability/focus/keyboard/pointer، condition-based wait، UI+Ledger Oracle، Chromium/OS/viewport/locale/font/motion/network Config، isolation، Result vocabulary و Evidence کامل ساخت.

Retry همهٔ Attemptها را حفظ کرد؛ Failure attribution و Repair/Correction contract، Owner/SLA/Review، Cost/Measure/Guardrail کامل شد و ادعاهای مطلق حذف شدند. Validator با صفر Finding وضعیت READY_FOR_UI_REVIEW داد؛ عمداً نه حقیقت/کفایت Oracle/Evidence، Coverage، موفقیت کاربر، Accessibility conformance، نبود باگ، Product quality یا Release را ثابت کرد.

آزمایشگاه Checkout فارسی و ایرانی

Lab یک Checkout جدا از شبکه با Order، PaymentAttempt، PSP Stub جعلی، Callback، Ledger Stub و Reconciliation مصنوعی است. Scenarioها شامل submit تکراری، timeout قبل/بعد از fake commit، duplicate/late/reordered Callback، خطای Validation، pending state، reload و Tenant isolation هستند.

بعدقرارداد Fixtureمحدودیت
پولمقدار canonical ساختگی بر حسب IRR؛ تومان فقط view برچسب‌دارنه ادعای مالی/بانکی ایران
متن/رقمارقام فارسی/عربی/لاتین، Unicode normalization، RTL/LTR و stable Latin IDنه پوشش همهٔ Localeها
زمانISO instant/UTC؛ view در Asia/Tehran؛ جلالی فقط presentationنه قاعدهٔ حقوقی/تسویه
UI Configفونت Fixture، ۱۲۸۰×۷۲۰، reduced motion، zoom ۱۰۰%نه Browser/device matrix کامل
هویتTenant/Order/Attempt/Event/Ledger/Run/Build/Deploy/Evidence جدانه مشتری یا تراکنش واقعی

هیچ Network، Production، شرکت، کاربر، پرداخت، بانک، PSP، نام، موبایل، ایمیل، IP، حساب، PAN، CVV2، OTP، Cookie، Token، Credential، Screenshot یا Log واقعی استفاده نمی‌شود. Lab توصیهٔ بانکی، مالی، حقوقی، مالیاتی، امنیتی، حریم خصوصی یا Compliance ایران نیست.

امنیت و حریم خصوصی Evidence رابط کاربری

  • Screenshot/Video/Trace/DOM/HAR ممکن است PII، Token و محتوای حساس داشته باشند؛ Redaction را آزمون کنید.
  • Credential را در Source، command line، report، query string یا attachment ذخیره نکنید.
  • Test account کم‌اختیار، synthetic data و Namespace محدود داشته باشد.
  • Artifact access، encryption، retention و deletion evidence را Policy کنید.
  • Download/upload Fixture از Production یا فایل واقعی استفاده نکند.
  • Cleanup فقط Resourceهای دارای Run identity را حذف کند.

AI و Self-healing در UI Automation

AI می‌تواند Locator candidate، Test draft، Failure cluster یا Repair diff پیشنهاد کند. Model/version، input Artifact، confidence، alternatives و Reviewer را ثبت کنید. Self-heal نباید Target را بی‌صدا عوض و Outcome قبلی را سبز کند؛ semantic distance و affected Claim باید Review شوند.

Visual AI، screenshot diff یا agentic browser به‌تنهایی Oracle نیست. Prompt injection در page content، destructive action، credential exposure، nondeterministic plan و unverifiable summary Failure modeهای اضافی‌اند. Action allowlist، synthetic environment، deterministic assertion و human gate لازم است.

متریک‌های UI Automation با Countermetric

Measureتعریف لازمCountermetric
First-attempt valid signalOutcome معتبر در Attempt اول بر eligible checksSKIPPED/ERROR/Quarantine
False-result rateFalse Pass/Fail تأییدشده با independent evidenceverification opportunity
Feedback latencyTrigger تا Evidence قابل مصرف؛ queue و run جداsignal quality/cost
Repair timeاز confirmed testware cause تا verified repairblast radius و recurrence
Contract churnUI Contract changeهای واقعی بر consumerهاProduct change rate
Isolation failureOrder/parallel/shared-state collision در seriescapacity و setup cost
Evidence diagnostic yieldTriageهایی که bundle علت را سریع‌تر محدود کردstorage/privacy overhead
Observation gapRiskهای UI-dependent بدون Control نمایندهduplicate low-level checks

Test count، Pass rate، UI درصد Portfolio یا Automation coverage را برای رتبه‌بندی افراد استفاده نکنید. این Incentive به Testهای کوتاه، assertion ضعیف، Retry پنهان و حذف Checkهای دشوار منجر می‌شود.

Pilot سی‌روزهٔ یک UI Interaction Contract

بازهکارخروجی/گیت
روز ۱–۵یک User Task/Risk مصرف‌شده و Baseline false signal/repair/latency را انتخاب کنیدQuestion/Claim/Non-goals
روز ۶–۱۰UI Contract، Locator semantics، State/Data و Oracle دوگانه را طراحی کنیدDesign review و injected fault
روز ۱۱–۱۵Actionability، keyboard/pointer، synchronization و Config را اجرا کنیدcontrolled wait/input experiments
روز ۱۶–۲۰isolation/random-order/parallel/network/failure modes را آزمون کنیدseries و classification report
روز ۲۱–۲۵Trace/Evidence/Retry/Attribution/Repair/Correction را تمرین کنیدTriage game day
روز ۲۶–۳۰Signal/latency/cost/privacy/observation gap را Review کنیدKeep/Adapt/Move/Retire/Scale decision

Pilot موفق با Demo سبز یا Test بیشتر تعریف نمی‌شود؛ باید یک تغییر نماینده و یک Fault تزریق‌شده را با Verdict درست، Evidence تشخیصی و Repair قابل Review مدیریت کند.

۳۲ ضدالگوی UI Automation

  • Checkout works به‌عنوان Claim؛ Click=Success؛ Toast=Effect؛ UI PASS=Release؛ ۱۰۰٪ Journey=Coverage.
  • CSS/XPath ساختاری پیش‌فرض؛ nth-child/first برای ambiguity؛ test-id همیشه بهترین؛ auto-heal بی‌Review.
  • Sleep ثابت؛ Timeout نامحدود؛ network-idle جهانی؛ force click؛ bypass Actionability.
  • فقط Mouse؛ focus نادیده؛ Keyboard/Touch/IME یکسان؛ scanner=WCAG؛ screenshot=Visual correctness.
  • latest/nightly/staging؛ Browser بدون version؛ Viewport بدون scale/zoom؛ فونت/Locale/Timezone فراموش.
  • Shared account/order؛ cleanup گسترده؛ وابستگی به ترتیب؛ parallel بدون partition؛ state reuse بی‌Freshness.
  • Third party واقعی در هر PR؛ Mock بدون parity؛ CAPTCHA bypass مخفی؛ Dependency FAIL=Product bug.
  • سبز/قرمز دوحالته؛ ERROR/SKIPPED در PASS؛ Retry-until-green؛ Attempt اول حذف؛ Quarantine بی‌Expiry.
  • Screenshot-only evidence؛ Trace حاوی Secret؛ Artifact همیشه روشن؛ Retention همیشگی؛ DOM/HAR عمومی.
  • Element not found=Cause؛ هر Failure=Defect؛ هر UI change=Test repair؛ Repair مرکزی بدون blast-radius.
  • UI ذاتاً کند/شکننده؛ Unit همیشه سریع/ارزان؛ Pyramid نسبت ثابت؛ UI همیشه کوچک‌ترین و happy-path-only.
  • Page Object اجباری؛ Tool=Architecture؛ Green build=Confidence؛ AI-generated/healed=Correct.

چک‌لیست ۲۶ نقطه‌ای ممیزی UI Check

  • Portfolio/Product/Goal/Risk/Basis/Repository/Commit/Build/Deploy پین شده‌اند.
  • UI Contract/Environment/Data Pack نسخه و Owner دارند.
  • Check ID/version، User Task، Question، bounded Claim و Claim limit روشن‌اند.
  • Visible behavior و Side effect مورد انتظار جدا تعریف شده‌اند.
  • Precondition/initial State/Data/Namespace/Cleanup معلوم‌اند.
  • Locator به semantic/explicit contract متصل است.
  • Strictness/uniqueness و ambiguity failure policy اعمال می‌شوند.
  • Interaction intent و Actionability ثبت شده‌اند.
  • Focus/Keyboard/Pointer/Scroll/Dialog/File mode متناسب پوشش دارند.
  • Readiness و condition جای Sleep ثابت را گرفته‌اند.
  • Timeout budget/async boundary/clock کنترل شده‌اند.
  • Oracle دارای Source/UI rule/side-effect rule/tolerance/window است.
  • Browser/version/OS/viewport/scale/locale/timezone/font مشخص‌اند.
  • Color scheme/reduced motion/zoom/network profile ثبت شده‌اند.
  • Context/State/Data isolation و parallel partition آزموده شده‌اند.
  • Dependency/Stub version و parity/confirmation معلوم‌اند.
  • Vocabulary Product/Testware/Env/Data/Dependency/Skipped/Unknown را جدا می‌کند.
  • Manifest/Trace/Screenshot/DOM/network/console/raw/time/digest کامل‌اند.
  • Redaction/Access/Retention و Secret/PII policy اعمال می‌شوند.
  • همهٔ Retry Attemptها حفظ شده و Failure اول پنهان نیست.
  • Observation/Hypothesis/Cause evidence جدا هستند.
  • Repair trigger/type/reviewer/affected scope/verification تعریف شده‌اند.
  • Correction/Supersession برای Outcome نامعتبر وجود دارد.
  • Owner/Triage SLA/Review due/Cost/Measure/Guardrail مشخص‌اند.
  • Visual و Accessibility claim محدود گزارش می‌شوند.
  • PASS به User success، Coverage، Conformance، Quality یا Release تعمیم نمی‌یابد.

جمع‌بندی: UI را مثل Interface مشاهده‌پذیر مهندسی کنید

مشکل UI Automation «بالای هرم بودن» یا نام ابزار نیست. شکست زمانی رخ می‌دهد که Interaction با Intent، Wait با State، UI feedback با Side effect و Artifact با Subject پیوند ندارد. Check خوب مسیر کاربر را تقلید صرف نمی‌کند؛ یک Claim محدود را در Config مشخص با Evidence قابل نقد می‌سنجد.

با یک User Task پرریسک شروع کنید. Faultی تزریق کنید که Toast می‌آید اما Effect ساخته نمی‌شود، Locator را مبهم کنید، Network را کند و Config فارسی را تغییر دهید. اگر Suite Verdict درست و علت قابل بررسی نساخت، قبل از افزودن Check بعدی Contract مشاهده را اصلاح کنید.

سوالات متداول اتوماسیون تست رابط کاربری

اتوماسیون تست UI دقیقاً چه چیزی را می‌سنجد؟

به Contract بستگی دارد. معمولاً Interaction با رابط و رفتار قابل مشاهده در Browser/Config مشخص را می‌سنجد و می‌تواند یک Side effect نام‌دار را هم بررسی کند. UI Check به‌خودی‌خود UX، همهٔ لایه‌ها، همهٔ Browserها، نبود باگ یا موفقیت کاربر را اثبات نمی‌کند.

بهترین Locator برای تست رابط کاربری چیست؟

Locator جهان‌شمولی وجود ندارد. Role/name، label، text یا Test ID قراردادی را بر اساس معنایی انتخاب کنید که تغییر آن باید Review تست را فعال کند. Locator باید scoped، یکتا و strict باشد؛ ambiguity نباید با first/index پنهان شود. CSS/XPath ساختاری برای Intent کاربر معمولاً ضعیف‌تر است.

چگونه Flaky Test رابط کاربری را کم کنیم؟

ابتدا با series کنترل‌شده Flakiness را اثبات کنید. سپس State/Data/Context را ایزوله، Sleep را با Condition مرتبط جایگزین، Browser/Environment را پین، Dependency را کنترل و همهٔ Attemptها/Trace را حفظ کنید. Retry نهایی راه‌حل نیست؛ Variation باید Owner، Cause investigation و re-entry evidence داشته باشد.

آیا باید تعداد تست‌های UI همیشه کم باشد؟

نه به‌عنوان قانون عددی. هر Check باید Risk و Observation gap منحصربه‌فرد، Signal مصرف‌شده و هزینهٔ پذیرفتنی داشته باشد. بخشی از Claim را می‌توان به سطح تشخیصی‌تر منتقل کرد، اما رفتار واقعاً وابسته به UI باید در UI بماند. Portfolio را با Evidence، latency، cost و blind spot بازبینی کنید.

آیا تست خودکار UI برای دسترس‌پذیری و Visual کافی است؟

خیر. Rule scan، semantic assertion، Keyboard Check و Screenshot diff فقط Claimهای محدود خود را پشتیبانی می‌کنند. WCAG conformance به ارزیابی معیارها، Context، user agent/assistive technology و قضاوت انسانی نیاز دارد؛ Visual equality نیز رفتار یا usability درست را ثابت نمی‌کند.

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