دو مشتری آخرین واحد یک کالا را تقریباً هم‌زمان می‌خرند. هر دو صفحه «سفارش ثبت شد» می‌بینند، Callback پرداخت دوبار می‌رسد، دو Job ارسال ساخته می‌شود و چند دقیقه بعد یک Event قدیمی موجودی، محصول را دوباره In Stock نشان می‌دهد. هیچ خطای ۵۰۰ رخ نداده است؛ بااین‌حال فروشگاه Oversell، Fulfillment تکراری و وعده موجودی غلط دارد. تست فروشگاه اینترنتی باید این زنجیره را ببیند، نه فقط Buttonها را.

در این راهنما، Journey تجارت الکترونیک را از Catalog و Variant تا Offer، Cart، Quote، Checkout، Order، Inventory Reservation، Payment، Fulfillment، Delivery، Cancellation، Return و Refund به Contract و Evidence تبدیل می‌کنیم. یک آزمایش کاملاً ساختگی نیز نشان می‌دهد چرا Snapshot ساده موجودی و Callback بدون Deduplication برای سفارش قابل اتکا نیست.

مرز ادعا: تست می‌تواند رفتار Build و Scope مشخص را با Oracle نسخه‌دار مقایسه کند؛ تجربه بی‌نقص، افزایش Conversion، فروش، وفاداری، امنیت، انطباق یا نبود Oversell را تضمین نمی‌کند. قیمت‌گذاری، موجودی، مالیات، ارسال، مرجوعی، حریم خصوصی، امنیت و قوانین بازار باید توسط صاحبان صلاحیت محصول و حوزه قضایی تعیین شوند. مثال‌های این مقاله داده واقعی، توصیه حقوقی یا قاعده عمومی تجارت نیستند.

خلاصه عملی تست فروشگاه اینترنتی

پرسششاهد ضعیفشاهد بهتر
آیا محصول قابل خرید است؟PDP باز می‌شودVariant/Offer معتبر، Price و Availability تازه، Eligibility و Fulfillment روشن‌اند
آیا سبد درست است؟Badge عدد را نشان می‌دهدLine identity، quantity، price snapshot، merge و expiry Contract آزموده شده‌اند
آیا Checkout موفق است؟Success pageQuote پذیرفته، Order یکتا، Reservation، Payment state و downstream effects reconcile شده‌اند
آیا موجودی درست است؟عدد Database غیرمنفی استOn-hand/available/reserved/safety stock، concurrent reservations و release/expiry سازگارند
آیا ارسال انجام شد؟Job ساخته شدهر Fulfillment group یکتا، قابل پیگیری و با Order lines/Reconciliation منطبق است
آیا Release آماده است؟Happy Path و Pass rateCritical journey invariants، failure/recovery، Unknown، monitor و owner ثبت شده‌اند

ابتدا مدل کسب‌وکار را مشخص کنید

Ecommerce فقط فروش یک کالای فیزیکی از یک انبار نیست. Marketplace، کالای دیجیتال، Subscription، Preorder، Click-and-collect، چندفروشندگی، B2B، خدمات رزروی و فروش بین‌المللی Contractهای متفاوت دارند. Test plan عمومی بدون مدل عملیاتی، مسیرهای مهم را پنهان می‌کند.

مدلریسک محوریInvariant نمونهOwner نمونه
کالای فیزیکیموجودی، انبار، ارسال، مرجوعیهر line به Fulfillment قابل انجام نگاشت شودCommerce/Inventory/Operations
کالای دیجیتالEntitlement، download، revokeدسترسی فقط برای Order state مجازProduct/Entitlement
SubscriptionRenewal، proration، cancellationTerm و charge schedule نسخه‌دارBilling/Product/Legal
MarketplaceSeller، split order، commission، disputeمالک هر Offer/line/fulfillment روشنMarketplace/Finance/Trust
Preorder/Backorderوعده آینده و تغییر ETAAvailability و promise type صریحMerchandising/Supply
Pickup/Omnichannelموجودی Location و handoffStore/slot/reservation identity ثابتRetail/Store Operations

صفحه ۱۸۱۶ دقیقاً مالک چه Intentی است؟

این صفحه مالک تست Lifecycle سفارش تجارت الکترونیک است: Catalog → Cart → Quote → Checkout → Order → Inventory → Fulfillment → Return. جزئیات Money/Ledger/Reconciliation مالی در راهنمای تست نرم‌افزار مالی و اتصال IPG در راهنمای تست درگاه پرداخت عمیق‌تر پوشش داده شده‌اند.

Performance، Security، Usability، Accessibility، Compatibility و Localization برای فروشگاه ضروری‌اند، اما صفحات تخصصی خود را دارند. اینجا آن‌ها را به Journey وصل می‌کنیم تا هم‌نوع‌خواری محتوایی و Checklist بی‌مالک ساخته نشود.

Commerce Context Contract بنویسید

Commerce Context Contract
Business model:       [retail/marketplace/digital/subscription/...]
Channels:             [web/app/store/call-center/feed]
Markets/locales:      [approved scope]
Customer modes:       [guest/member/B2B/...]
Catalog sources:      [product/variant/offer authorities]
Price sources:        [rules, currency and quote policy]
Inventory sources:    [location, reservation and freshness]
Order source of truth:[states and ownership]
Payment boundary:     [intent/auth/capture/settlement references]
Fulfillment boundary: [warehouse/seller/carrier/digital]
Return/refund policy: [version and applicability]
Partner contracts:    [API/event/feed versions]
Excluded journeys:   [explicitly out of scope]
Release identities:  
Evidence owners:      [roles and decisions]

عبارت «خرید موفق» را در Contract نشکنید. ممکن است Order ایجاد، موجودی Reserve و Payment Authorized شده باشد اما Fulfillment هنوز ممکن نباشد. برای هر Stage، source، state، ID، side effect و کاربر/عملیات مسئول را بنویسید.

شناسه‌ها را از نام و URL جدا کنید

Product، Variant، SKU، Offer، Seller، Location، Cart، Quote، Order، Order line، Reservation، Payment، Fulfillment، Shipment، Return و Refund یک شناسه نیستند. استفاده از title، slug یا index آرایه به‌عنوان Identity می‌تواند تغییر Variant، ترجمه یا reorder را به کالای دیگری وصل کند.

EntityIdentityVersion/Stateرابطه حیاتی
ProductproductIdcontent/versionhas variants
Variant/SKUvariantId/SKUattributes/activesellable unit
OfferofferIdprice/eligibility/windowseller+variant+market
Cart linelineIdquantity/selectionoffer/variant snapshot
QuotequoteIdversion/expirypriced cart + delivery options
Order lineorderLineIdordered/cancelled/fulfilled/returned qtyimmutable commercial snapshot
ReservationreservationIdheld/committed/released/expiredSKU+location+order/quote
FulfillmentfulfillmentIdplanned/packed/shipped/deliveredspecific order lines/quantities

Catalog Contract: Product، Variant و Offer را قاطی نکنید

Product توضیح مفهومی کالا است؛ Variant ترکیب قابل انتخاب مانند اندازه/رنگ؛ SKU واحد عملیاتی؛ و Offer پیشنهاد فروش از Seller/Market با Price و Availability است. مدل واقعی محصول ممکن است متفاوت باشد، اما QA باید نام‌ها را به رفتار مشخص وصل کند.

Catalog Offer Contract
productId / variantId / sku: stable identities
offerId / sellerId / market: selling context
attributes:                   versioned selectable dimensions
title/media/content:          locale and source
price/currency:               canonical values and display rule
availability/promise:         state, quantity policy and freshness
eligibility:                  customer/region/channel constraints
effective window:             startsAt/endsAt/timezone
fulfillment methods:          ship/pickup/digital/... 
return policy reference:      versioned, not copied prose
feed/structured-data mapping: field-level lineage
updatedAt/version:            ordering and staleness control
  • Variant combination ناموجود قابل انتخاب و Add-to-cart نباشد.
  • تعویض Variant، تصویر، SKU، قیمت، موجودی و URL/State مرتبط را هم‌زمان به‌روز کند.
  • Disabled/archived Offer در Cart قدیمی بی‌صدا قابل خرید نشود.
  • Seller یا Location اشتباه در Checkout تغییر نکند.
  • Effective window با timezone و cache invalidation آزموده شود.
  • Content ترجمه‌شده Identity یا Attribute canonical را عوض نکند.
  • Feed، PDP، structured data و Checkout به Version قابل پیگیری وصل باشند.

قیمت و موجودی را میان Surfaceها تطبیق دهید

قیمت یا Availability ممکن است در Search feed، Landing page، Structured Data، API، Cart و Checkout متفاوت باشد. این اختلاف همیشه bug نیست—Shipping، Tax، membership یا regional rule می‌تواند تفاوت موجه بسازد—اما علت و breakdown باید Contract داشته باشد.

مشخصات جاری Product Data در Google Merchant Center برای استفاده از آن سرویس، سازگاری price/currency و availability را میان product data، Landing page، structured data و Checkout می‌خواهد. این یک Requirement خاص Google/Merchant Center است، نه قانون عمومی Ecommerce و نه تضمین رتبه یا نمایش.

SurfacePrice fieldsAvailabilityFreshness/identity evidence
Feedamount+currency+sale windowfeed enum/valuefeed run/item/version
Structured dataOffer price/currencyschema availabilityrendered page/canonical
PDPselected Variant/Offer displaypromise text/actionvariant/offer IDs
Cartline price and change noticesoft validationcart version
Quote/Checkoutauthoritative breakdownreservation eligibilityquote ID/version/expiry
Orderimmutable accepted snapshotordered quantity/stateorder line provenance

Search، Category و Facet را فقط با چند Query تست نکنید

Search باید lexical/semantic policy، typo، synonym، locale، SKU، attribute، ranking و unavailable handling مشخص داشته باشد. Category و Facet نیز AND/OR semantics، count، URL، pagination، canonical/noindex policy و reset/back navigation می‌خواهند. نتیجه «مرتبط» بدون Oracle و query intent قابل سنجش نیست.

  • Exact SKU و Product title با Unicode/اعداد مختلف؛
  • ی/ی، ک/ک، فاصله و نیم‌فاصله و جمع/املای مصوب؛
  • Variant attribute و ترکیب Facetها؛
  • Out-of-stock policy، preorder و hidden products؛
  • Zero-result، spell suggestion و recovery path؛
  • Pagination/infinite scroll بدون duplicate یا missing item؛
  • Sort stability هنگام update موجودی/قیمت؛
  • Authorization/market-specific catalog isolation؛
  • Analytics event schema بدون duplicate impression/click.

راهنمای رسمی Google Search برای ساختار Ecommerce توضیح می‌دهد Productهایی که فقط از Search box قابل دسترسی‌اند ممکن است با Crawl navigation پیدا نشوند و استفاده از لینک‌های واقعی میان Category/Subcategory/Product اهمیت دارد. این توصیه را با sitemap، canonical، internal link و crawl test بیازمایید؛ نتیجه رتبه‌بندی را تضمین نکنید.

Cart Contract: سبد یک آرایه موقت نیست

Cart Contract
cartId / owner:        guest session or customer identity
version:               optimistic concurrency / change sequence
lineId:                stable line identity
variant/offer/seller:  selected sellable context
quantity:              min/max/step and current eligibility
price reference:       display estimate vs locked quote
promotion state:       entered/applied/rejected + reasons
fulfillment choice:    if known, versioned
market/currency:       explicit, not inferred silently
expiry:                cart and line policy
merge policy:          guest→member conflict resolution
reprice policy:        what changes and how user is informed
audit/events:          minimal and privacy-aware
ScenarioتزریقInvariant
Double addدو tap/retry هم‌زمانquantity طبق intent، نه duplicate side effect
Guest mergeسبد مهمان و حساب line مشابه دارندmerge policy صریح؛ no silent loss/double
Stale offerقیمت/موجودی تغییر می‌کندrevalidate/reprice و change disclosure
Variant removedOffer غیرفعال می‌شودCheckout block یا replacement choice؛ no substitution silent
Multi-tabدو نسخه Cart تغییر می‌کنندversion conflict/merge deterministic
Quantity boundary۰، منفی، بیش از limit، decimaldomain-specific validation server-side
Market switchlocale/currency/region تغییر می‌کندeligible lines re-evaluated و notice

Quote را Snapshot قابل قبول و منقضی‌شونده ببینید

Cart ممکن است تخمینی و mutable باشد؛ Quote باید مجموعه‌ای مشخص از lineها، قیمت، تخفیف، هزینه ارسال، مالیات/عوارض مصوب، currency، promise، policy و expiry را به Checkout وصل کند. اگر هر input مهم تغییر کرد، Quote قبلی نباید بی‌صدا اجرا شود.

Quote Contract
quoteId / version / createdAt / expiresAt
customer/guest/market/currency context
lines: variant + seller + quantity + unit price
discounts: rule/version/allocation/reason
shipping: method/price/promise/source
tax/charges: approved rule/source/breakdown
total: canonical money contract
inventory policy: checked vs held vs reserved
address/input fingerprint
terms/policy references
acceptance action and authorization
revalidation triggers and changed-field disclosure
  • Quote expired درست reject/reprice شود.
  • همان Quote دوبار Order نسازد.
  • تغییر Address یا shipping method Quote را version کند.
  • Line حذف‌شده و total جدید پیش از تأیید آشکار باشند.
  • Currency/market switch Quote قدیمی را invalidate کند.
  • Server amount را از Client hidden fields نپذیرد.
  • Order accepted snapshot دقیقاً به Quote پذیرفته‌شده trace شود.

Promotion و Coupon را Rule Engine تست کنید

«کد اعمال شد» کافی نیست. Eligibility، window، market، customer segment، usage limit، per-account/global limit، stacking، minimum spend، eligible lines، allocation، cancellation و refund behavior باید Contract داشته باشند. Conversion هدف Product است؛ QA صحت Rule و Evidence را می‌سنجد.

بعدCaseخطر
زمانقبل/در/بعد start-end و timezoneفعال‌ماندن یا شروع زودهنگام
مصرفدو Checkout هم‌زمان آخرین quotaعبور از global/user limit
Stackingترتیب دو Promotiontotal وابسته به order ناخواسته
Minimumمرز قبل/بعد discount/shippingbase مبهم
Allocationتخفیف روی چند line و residualrefund breakdown غلط
Eligibilityseller/variant/customer/marketاعمال به Offer نامجاز
ReplayOrder retry یا Coupon reuseمصرف دوباره یا quota leak
CancellationOrder لغو می‌شودquota restoration طبق policy

Inventory: On-hand با Available یکی نیست

موجودی می‌تواند On-hand، Reserved، Available-to-promise، Safety stock، Damaged، In-transit یا Backordered داشته باشد. فرمول و Source باید برای محصول مشخص شود. نمایش «موجود» بدون Location، freshness و promise ممکن است در Checkout فروبریزد.

Inventory Contract
sku / location / inventoryVersion
onHand:          physically/accounted quantity per source
reserved:        active holds not yet committed/released
safetyStock:     protected quantity per policy
available:       approved formula, not assumed universally
incoming:        quantity + confidence + expected time
promiseState:    in_stock/out_of_stock/preorder/backorder/... 
reservationId:  owner/order/quote/quantity/expiry
commit/release:  legal state transitions and idempotency
oversellPolicy:  prohibited or explicit controlled policy
freshness:       source timestamp/version and stale behavior
reconciliation: inventory source vs reservations/orders

Reservation و Oversell را با Concurrency تست کنید

دو Request می‌توانند هر دو Available=۱ بخوانند و هر دو Order بسازند. Test باید Schedule را کنترل کند: هر دو پس از Read متوقف، سپس هم‌زمان Reserve کنند. نتیجه طبق Policy ممکن است یک Winner و یک Failure/Backorder باشد؛ QA Policy را اختراع نمی‌کند.

RaceScheduleInvariant
Last unitدو reservation روی Available=۱Oversell فقط اگر policy صریح اجازه دهد
Expiry vs commitTTL هم‌زمان با Payment successیک transition نهایی و compensating path
Cancel vs packلغو هم‌زمان با Fulfillment claimstate conflict بدون double release/ship
Quantity updateCart از ۱ به ۲ هنگام stock changereservation delta atomic
Location selectionدو warehouse candidateیک allocation یا split صریح
Inventory event orderv2 out سپس v1 inCurrent version عقب نرود
Import duplicationsnapshot/delta دوبارهquantity دو بار اعمال نشود

Checkout را State Machine و Saga ببینید

Checkout چند side effect در سیستم‌های مختلف دارد. Atomic transaction واحد معمولاً همه Partnerها را پوشش نمی‌دهد؛ پس هر Step و compensation باید state، identity و retry Contract داشته باشد. ترتیب دقیق محصول می‌تواند متفاوت باشد.

Checkout Saga — illustrative
Quote accepted
  → inventory reserve
  → order create/pending
  → payment intent/authorization
  → order confirm
  → reservation commit
  → fulfillment request
  → notification

At each boundary:
- command/event ID and idempotency scope
- expected state/version
- side effect evidence
- timeout/unknown handling
- retry rule
- compensation owner/action
- reconciliation query
- user-visible message and next step
  • Refresh و Back/Forward Order دوم نسازند.
  • Double submit و mobile retry اثر یکتا داشته باشند.
  • Payment unknown با Failed قطعی یکی نشود.
  • Reservation failure پس از Payment به compensation/operations روشن برود.
  • Order create success و response loss با lookup/retry بازیابی شود.
  • Notification failure Order را ناموجود یا rollback خام نکند مگر Contract چنین باشد.
  • هر State برای Customer support قابل توضیح و traceable باشد.

Address، Delivery Option و Promise را Contract کنید

Address validation نباید بر حدس عمومی یا API خارجی تنها تکیه کند. فیلد، format، normalization، serviceability، privacy و fallback را برای بازار هدف تعیین کنید. Delivery promise نیز quote است، نه ضمانت؛ منبع، cut-off، calendar، capacity و exception باید ثبت شوند.

ناحیهScenarioOracle
Unicodeفارسی/عربی/لاتین، نیم‌فاصله، خط جدیدپذیرش/نمایش/برچسب طبق carrier contract
Normalizationپلاک/واحد/کدپستی تغییر formatمعنا حفظ و تغییر به کاربر نشان داده شود
Serviceabilityمنطقه پشتیبانی‌نشدهoption نامعتبر پیشنهاد نشود
Cut-offقبل/بعد زمان روز کاریpromise/date مطابق calendar version
Capacityدو نفر آخرین slotreservation concurrency کنترل شود
Address changeپس از Quote یا Orderreprice/revalidate و authorization
Provider downrate API timeoutfallback/hold روشن؛ no invented price

Order Contract: Snapshot تجاری را حفظ کنید

Order نباید هنگام مشاهده آینده از Catalog زنده title، price یا seller را دوباره بخواند و تاریخ را تغییر دهد. Order line باید Snapshot پذیرفته‌شده و referenceهای provenance را نگه دارد؛ اصلاحات با Event/Version جدید انجام شوند.

Order Contract
orderId / orderVersion / customer-or-guest reference
market / locale / canonical currency
order lines: stable IDs + product/variant/offer/seller snapshots
quantity states: ordered/cancelled/allocated/fulfilled/returned
accepted quote: quoteId/version and amount breakdown
inventory: reservation/allocation references
payment: intent/auth/capture references and states
fulfillment groups: line quantities + location/method
policy snapshots: return/cancellation/terms references
timestamps: created/effective/confirmed with timezone context
events/audit: immutable business history
manual changes: role/reason/approval/evidence

Payment را به Order وصل کنید، اما یکی نکنید

Payment Captured ممکن است با Order Cancelled یا Fulfillment blocked هم‌زمان شود. Order و Payment state باید جدا و با rules/reconciliation مرتبط باشند. Success callback یا Return URL منبع قطعی Order fulfillment نیست؛ server-side evidence و idempotent processing لازم است.

حالت ترکیبیمسئلهExpected path
Order pending + payment authorizedreservation/confirm در حال انجامbounded unknown، retry/reconcile
Order confirmed + payment unknownresponse گم شدهprovider lookup؛ no blind repay
Payment captured + inventory failedcompensation لازمhold/refund/manual path طبق policy
Duplicate capture eventFulfillment job دومevent dedupe و unique business effect
Payment failed + late successstate orderingversion/source rules و reconcile
Refund complete + return missingpolicy یا fraud/ops exposurecross-domain exception workflow

قواعد Amount، Currency، Idempotency، Ledger و Settlement در راهنمای مالی لینک‌شده بررسی می‌شوند. Checkout QA نباید اطلاعات کارت، OTP یا credential واقعی در Fixture یا Log نگه دارد.

Fulfillment را از یک Status ساده فراتر ببرید

یک Order می‌تواند به چند Seller، Warehouse، Package یا Shipment تقسیم شود. Fulfillment group باید line quantity دقیق، source Location، method، promise و lifecycle داشته باشد. ساخت Label یا Tracking ID به‌تنهایی Shipment واقعی یا Delivery را ثابت نمی‌کند.

  • Allocation مجموع quantity سفارش را بدون overlap/gap پوشش دهد.
  • Split و partial fulfillment State line و Order summary را درست به‌روز کنند.
  • Duplicate payment/order event Job یا Label دوم نسازد.
  • Pack short/damaged item به exception و inventory adjustment وصل شود.
  • Carrier timeout-after-create با idempotent lookup/retry مدیریت شود.
  • Tracking eventهای out-of-order Current status را عقب نبرند.
  • Delivery event بدون proof/contract لازم خودکار پایان همه Workflowها نشود.
  • Notification به package/shipment درست و locale مناسب اشاره کند.

Cancellation را در هر Boundary تست کنید

لغو قبل از Payment، پس از Authorization، پس از Capture، پس از Allocation یا هنگام Pack اثر یکسانی ندارد. Eligibility، actor، deadline، inventory release، payment action، coupon quota، seller/carrier cancellation و customer message را per-state تعریف کنید.

BoundaryRaceInvariant
Before confirmcancel vs submitیک نتیجه نهایی و no orphan hold
Reservedcancel vs reservation expiryquantity یک بار آزاد شود
Payment pendingcancel vs late successreconcile/compensate طبق policy
Allocatedcancel vs warehouse claimline quantity conflict کنترل شود
Packed/Shippedcancel درخواست می‌شودreject/intercept/return path صریح
Partial orderبرخی lineها لغوtotals/discount/shipping/refund reallocation درست

Return، Refund و Restock را سه Workflow جدا ببینید

Return درخواست/حرکت کالا است؛ Refund اثر مالی؛ Restock تصمیم موجودی/کیفیت. ممکن است Refund بدون Return یا Return بدون Restock طبق Policy رخ دهد. سیستم نباید آن‌ها را با یک Boolean ببندد.

Return Contract
returnId / orderId / orderLineId / quantity
policyVersion / eligibility / window / reason
requested → approved/rejected → in_transit → received → inspected → resolved
resolution: refund/replacement/store-credit/repair/... per product
refund reference and amount breakdown
restock disposition: sellable/damaged/quarantine/no-restock
shipping/fee responsibility per approved policy
duplicate request and concurrent quantity rules
evidence: item/condition/actor/timestamps with privacy controls
  • مجموع return quantity از fulfilled quantity مجاز عبور نکند.
  • دو Return هم‌زمان برای آخرین واحد race را کنترل کنند.
  • Refund retry اثر مالی دوم نسازد.
  • Replacement Order با Return و Inventory references trace شود.
  • Restock فقط پس از disposition مناسب مقدار را تغییر دهد.
  • Partial return، discount allocation و shipping policy نسخه‌دار باشد.
  • Policy تغییرکرده Order تاریخی را بی‌صدا بازتفسیر نکند.

Marketplace: Seller و Line ownership را حفظ کنید

در Marketplace، Cart واحد می‌تواند چند Seller و چند Offer داشته باشد. Order split، commission، fulfillment، cancellation، return، dispute و payout به مالک line وابسته‌اند. تعویض Seller هنگام reprice یا fallback نباید بدون consent/Contract رخ دهد.

ScenarioخطرEvidence
Offer winner changesSeller/price/promise silent substitutionquote fingerprint و user confirmation
Multi-seller cartshipping/discount allocation غلطper-line/seller breakdown
Seller suspensionCart/Order قدیمیeligibility transition and ops path
Partial cancellationseller دیگر تحت تأثیرisolated state/totals
Return routingکالا به مقصد اشتباهseller/fulfillment ownership
Payout readinessdelivery/refund/dispute lagfinancial reconciliation reference

کالای دیجیتال و Subscription Contract متفاوت دارند

کالای دیجیتال Inventory فیزیکی ندارد، اما Entitlement، download limit، region/device، license، version و revoke دارد. Subscription نیز Term، renewal، trial، proration، grace، failed charge و cancellation effective date دارد. این صفحه فقط مرزها را مشخص می‌کند؛ Billing policy باید جدا تصویب شود.

نوعInvariant نمونهFailure case
Digital entitlementOrder/payment state مجاز ↔ access یکتاduplicate callback دو license می‌سازد
Downloadsigned link scope/expiry/download policyURL share یا replay
Trialstart/end/eligibility/version روشنtrial stacking یا early charge
Renewalone billing event per termjob retry charge دوباره
Plan changeeffective date/proration approveddouble entitlement یا gap
Cancellationaccess end و future charge طبق policycancel UI ولی renewal فعال

Notification شاهد Delivery نیست

ارسال Email/SMS/Push پایان Order نیست و Delivery پیام نیز خواندن یا فهمیدن را ثابت نمی‌کند. Notification باید از State معتبر ساخته، با Event ID deduplicate، شامل حداقل داده و لینک امن، و با retry/expiry/locale درست باشد.

  • Order confirmation فقط پس از State تعریف‌شده ارسال شود.
  • Duplicate event پیام تکراری ناموجه نسازد.
  • Late event پیام قدیمی پس از State جدید نفرستد.
  • Template version با locale و RTL صحیح باشد.
  • PII، token و جزئیات حساس بیش از نیاز نمایش داده نشود.
  • Unsubscribe/transactional classification طبق تصمیم حقوقی محصول باشد.
  • Failure notification در Queue قابل مشاهده و replay امن باشد.
  • Support timeline بین notification و Order state reconcile شود.

Usability، Accessibility و Conversion را جدا گزارش کنید

Functional pass می‌گوید Button عمل کرد؛ Usability study می‌سنجد کاربر هدف Task را چگونه انجام داد؛ Accessibility بررسی می‌کند افراد با نیازها و فناوری‌های کمکی می‌توانند perceivable/operable/understandable/robust تعامل کنند؛ Conversion metric رفتار Aggregated Production است. هیچ‌کدام به‌تنهایی دیگری را ثابت نمی‌کند.

برای طراحی مطالعه از راهنمای تست کاربردپذیری و برای WCAG ۲.۲، Keyboard، Focus، Name/Role/Value، Error و Status message از راهنمای تست دسترس‌پذیری استفاده کنید. صفحه رسمی Understanding WCAG ۲.۲ از W3C منبع تفسیری معیارهاست؛ Accessibility conformance هم موفقیت تجاری را تضمین نمی‌کند.

Evidenceمی‌گویدنمی‌گوید
Functional assertionState/DOM/API طبق Oracle بودکاربر می‌فهمد یا فروش بالا می‌رود
Task successشرکت‌کننده Task تعریف‌شده را انجام دادهمه کاربران یا همه Contextها موفق‌اند
Accessibility testمعیار/مسیر مشخص evidence داردتمام معلولیت‌ها یا تجربه کامل پوشش دارد
A/B experimentدر طراحی/جمعیت/زمان مشخص تفاوت مشاهده شدcausality خارج طرح یا کیفیت فنی کامل
Conversion rateنسبت تعریف‌شده در داده مشاهده شدچرا تغییر کرد یا کاربر راضی است

Compatibility را بر Risk واقعی بنا کنید

فهرست Chrome/Firefox/Safari/Edge برای پوشش کافی نیست. Browser engine/version، OS، viewport، input، network، storage/cookie policy، WebView، payment redirect، autofill، locale، assistive technology و traffic/support data ماتریس را می‌سازند.

  • Same-site/third-party cookie policy و return from provider؛
  • Back-forward cache و resubmit Checkout؛
  • Mobile WebView و deep link return؛
  • Autofill address و validation interaction؛
  • Low-memory reload و Cart persistence؛
  • Offline/online transition و duplicate command؛
  • Touch/keyboard/zoom/reflow؛
  • RTL mixed-content، تاریخ/عدد و چاپ Order؛
  • Browser extension/content blocker impact در analytics versus core flow.

راهنمای طراحی Browser و Device Matrix روش انتخاب ترکیبات و گزارش Unsupported/Unknown را توضیح می‌دهد. «روی موبایل تست شد» بدون Device/OS/Browser/build evidence کافی نیست.

فارسی، RTL، ریال و تومان را End-to-End تست کنید

Localization فقط ترجمه Label نیست. Catalog، Search، Variant، Price، Address، Checkout، Order، Invoice، Notification، Tracking و Return باید در فارسی بررسی شوند. Currency canonical را از display unit جدا نگه دارید؛ «تومان» label و conversion rule صریح می‌خواهد.

  • ی/ی، ک/ک، ارقام ۰۱۲/۰۱۲/۰۱۲ و normalization جستجو؛
  • نیم‌فاصله، wrapping، font fallback و truncation نام Product؛
  • RTL Grid، breadcrumb، filter drawer، carousel و mixed LTR SKU؛
  • Amount/currency order، separator و ریال/تومان؛
  • آدرس چندخطی، پلاک/واحد و label چاپ؛
  • UTC/Asia-Tehran و تاریخ شمسی فقط به‌عنوان نمایش قراردادی؛
  • Dynamic variables در Email/SMS و bidi isolation؛
  • Alt، accessible name و validation message فارسی؛
  • Fallback locale و missing translation بدون نمایش key خام.

چک‌لیست عمیق‌تر در راهنمای تست i18n و L10n فارسی/RTL آمده است. نمایش درست رقم فارسی صحت Money Contract یا Order total را ثابت نمی‌کند.

Security و Privacy را به Journey وصل کنید

Cart price tampering، IDOR Order، coupon abuse، inventory hoarding، bot checkout، credential stuffing، seller isolation، admin adjustment و return fraud نمونه‌هایی از Business/Access risk هستند. Client validation یا پنهان‌کردن Button کنترل server-side نیست.

BoundaryThreat/Privacy questionControl evidence
Catalog/priceClient amount یا seller قابل دستکاری است؟server reprice/authorization
Cart/checkoutCart دیگر یا coupon quota قابل حدس/مصرف است؟object/action authorization
Orderکاربر به Order/Address دیگری دسترسی دارد؟tenant/customer scope tests
InventoryBot با reservation موجودی را قفل می‌کند؟limits/expiry/detection/release
Admin/supportAdjustment بدون role/reason/approval؟least privilege/audit
Analytics/session replayPII/secret/payment fields ضبط می‌شوند؟data minimization/masking/access
NotificationLink/token یا جزئیات حساس نشت می‌کند؟scope/expiry/minimal content

برای Threat modeling و روش‌های AppSec از راهنمای تست امنیت نرم‌افزار استفاده کنید. Heatmap، session recording و analytics نیز data flow، consent/notice، masking، retention و vendor review می‌خواهند؛ ابزار UX خودکار مجوز جمع‌آوری داده نیست.

Performance را با Campaign و Correctness همراه کنید

ادعای عمومی «هر یک ثانیه X درصد Conversion کم می‌کند» بدون Context و منبع معتبر برای سایت شما Oracle نیست. Performance target را از Journey، device/network، SLO، ظرفیت، داده و Risk بگیرید. پس از Load فقط latency را نبینید؛ Order، Reservation و Fulfillment invariants را هم بررسی کنید.

WorkloadMetricCorrectness companion
Browse/search burstp50/p95/p99، cache hit، errorprice/availability version/freshness
Flash sale add-to-cartthroughput/queue/lockquantity/offer eligibility
Last-unit checkoutconflict/retry latencyno unapproved oversell
Payment callback burstconsumer lagunique Order/Fulfillment effect
Campaign promotionrule latency/saturationquota/stack/allocation invariants
Carrier/provider slowtimeout/retry/backlogbounded unknown/no duplicate
Recovery catch-upoldest age/time to drainreconciliation after replay

ساخت مدل بار و معیار پذیرش در راهنمای برنامه تست عملکرد پوشش داده شده است. Flash sale فقط Stress test نیست؛ inventory fairness، queue policy، abuse controls و customer messaging نیز تصمیم محصول/عملیات‌اند.

Fault Injection را در Boundaryهای Order اجرا کنید

Failureهای ارزشمند بین دو اثر رخ می‌دهند: Reserve انجام و Response گم؛ Payment ثبت و Order confirm crash؛ Label در Carrier ساخته و local record ذخیره نشده. در محیط مجاز response، ack، network، clock یا process را دقیقاً در Boundary قطع کنید.

Fault pointUnknownRecovery evidence
بعد Reserve/قبل responseCart نمی‌داند hold ساخته شدidempotent lookup/retry/expiry
بعد Order createClient دوباره submit می‌کندsame order result
بعد Payment successOrder pending استprovider→order reconciliation
بعد Fulfillment createJob/label local unknownexternal reference lookup
قبل Event ackdelivery دوبارهdedupe/no second side effect
Catalog delta missingprice/stock staleversion lag alert/full reconciliation
Notification downCustomer informed نیستretry/escalation بدون Order duplication

Test Data را قابل‌خرید اما غیرواقعی بسازید

Fixture باید Catalog و Order relation واقعی‌نما داشته باشد، اما به Customer، Seller، Warehouse، Carrier، Card، Phone یا Address واقعی وصل نباشد. Namespace ساختگی، Egress denial و Stubهای محلی مانع ارسال اشتباه می‌شوند.

Synthetic Commerce Fixture Manifest
generatorVersion / seed / checksum
products / variants / SKUs / offers / sellers
prices / currencies / promotion rule versions
locations / inventory / reservation clocks
guest/member synthetic identities
addresses marked non-routable and fictional
quotes / orders / payments / fulfillments / returns
partner stubs and deterministic fault scripts
expected state transitions and invariants
network deny/allow list
retention / cleanup / access owner
  • Productها با `SYN-` و تصویر/متن ساختگی مشخص باشند.
  • Address و Phone هیچ فرد یا مقصد واقعی را تقلید نکنند.
  • هیچ PAN، CVV2، OTP، token، credential یا API key واقعی وجود نداشته باشد.
  • Email/SMS/Carrier sink محلی باشد و خروجی واقعی نداشته باشد.
  • SKU/Variant/Offer collision و edgeهای Unicode عمداً ساخته شوند.
  • Time با clock قابل کنترل و event ordering deterministic باشد.
  • Fixture expected Order/Inventory/Fulfillment graph داشته باشد.
  • پس از Run، orphan reservation/job/data cleanup و verify-absent شود.

Migration و Reindex را با Count تمام نکنید

تعویض Commerce platform، Search index، Catalog model یا Order service می‌تواند Identity و History را بشکند. Count برابر با Variant/Offer mapping، price version، reserved quantity یا Order line lineage درست نیست.

ناحیهکنترلFailure نمونه
Catalogproduct→variant→offer graphدو Variant merge شده‌اند
URL/SEOcanonical/redirect/internal link/feedProduct orphan یا duplicate URL
Pricecurrent+future rule/versionsale window timezone جابه‌جا
Inventoryon-hand/reserved/available per locationactive reservations جا مانده‌اند
Cartoffer eligibility/reprice policyline قدیمی silent substitute
Orderimmutable snapshots/history/quantitiescatalog live history را عوض می‌کند
Searchpopulation/version/query suiteindex success ولی products missing
Cutoversnapshot+delta+dual-write/reconcilegap یا duplicate order

Production Monitoring را به Journey و Invariant وصل کنید

Conversion، Revenue یا Error rate تنها کافی نیستند. Conversion کاهش می‌یابد اما علت را نمی‌گوید؛ Revenue بالا می‌رود اما duplicate charge را پنهان می‌کند؛ Error پایین است اما Queue عقب افتاده. Funnel را با technical/business state و reconciliation همراه کنید.

SignalCounter-signalSliceOwner action
PDP viewsoffer/stock stale errorsmarket/variant/channelcatalog/feed inspect
Add-to-cartreprice/invalid offer rateseller/promotioncontract drift review
Checkout startsquote expiry/address/payment unknownstep/device/providerjourney trace
Orders createdunique quote/order ratiochannel/retry classidempotency review
Reservationsexpired/orphan/negative/oversellSKU/locationinventory reconcile
Payment successorder confirm/fulfillment lagprovider/statecross-system reconcile
Fulfillment jobsunique order-line effectwarehouse/sellerdedupe/hold
Returnsrefund/restock mismatch agingreason/policyexception workflow

Metric و Event analytics باید schema/version، identity، missing/duplicate rate و consent/privacy controls داشته باشند. Session recording یا heatmap نباید password، address، payment field یا پیام خصوصی را ضبط کند.

Release Identity و Evidence Pack را کامل کنید

Commerce Release Identity
code/image digest:          ___
database schema/migrations: ___
catalog/search index build: ___
price/promotion rules:      ___
inventory/reservation policy:___
quote/order state versions: ___
payment/fulfillment mappings:___
shipping/calendar/cut-off:  ___
return/refund policy:       ___
feature flags/routing:      ___
locale/templates/content:   ___
synthetic fixture/seed:     ___
evidence pack/checksum:     ___

Config، Promotion، Catalog feed، Search synonym، inventory safety stock، shipping calendar و Return policy می‌توانند بدون Deploy کد Journey را تغییر دهند. Impact analysis باید Evidence مرتبط را stale علامت بزند.

Release Gate را با Critical Journey بسازید

Ecommerce Release Memo
Scope/business model/channels:      ___
Release identity:                  ___
Critical journeys and invariants:  ___
Catalog/price/inventory evidence:  ___
Checkout/order/payment evidence:   ___
Fulfillment/return evidence:       ___
Security/privacy/a11y/performance: ___
Failure/recovery/reconciliation:   ___
Open defects and customer exposure:___
Blocked/inconclusive/stale evidence:___
Rollback/feature flags/runbooks:   ___
Production monitors and owners:   ___
Residual risk and limitations:    ___
Recommendation: Go / Conditional / Hold
Authorized decision and expiry:   ___
Gateنمونه شرطاشتباه رایج
Catalogcritical SKUs/Offers valid and freshفقط PDP screenshot
PriceQuote/Order breakdown with versionفقط total UI
Inventorylast-unit concurrency و orphan scansingle-user stock test
Orderdouble submit/timeout recoveryHappy Path only
Fulfillmentunique line effects and split/partialjob count only
Unknownblocked/inconclusive exposure explicitskipped as neutral
Operationsrollback/reconcile/runbooks rehearseddashboard exists

آزمایش بازتولیدپذیر: Last Unit و Callback تکراری

Fixture `fictional-ecommerce-order-v1` کاملاً ساختگی و آفلاین است. یک SKU خیالی `SKU-SYN-A` فقط یک واحد Available دارد. دو Cart هم‌زمان هر کدام Quantity=۱ می‌خواهند. سپس یک Payment capture Event برای Order برنده دو بار Deliver می‌شود و Availability v2=`out_of_stock` پیش از Event قدیمی v1=`in_stock` می‌رسد.

Inputs
initialAvailable = 1
checkouts = CART-SYN-A + CART-SYN-B
payment deliveries = PAY-CAP-SYN-A twice
availability events = v2 out_of_stock, then v1 in_stock

Naive model
- both checkouts read the same snapshot
- every payment delivery creates a fulfillment job
- last arrival becomes displayed availability

Contract-aware model
- atomic reservation consumes available quantity
- eventId has one business effect
- only greater availability version becomes current
روشOrder resultAvailable/OversellFulfillment jobsDisplayed availability
Naive snapshot/arrival-wins۲ confirmed−۱ / Oversell=۱۲in_stock از v1 قدیمی
Contract-aware۱ reserved، ۱ inventory_unavailable۰ / Oversell=۰۱؛ duplicate ignored=۱out_of_stock v2؛ stale ignored=۱
{
  "fixture": "fictional-ecommerce-order-v1",
  "naive": {
    "confirmedOrders": 2,
    "resultingAvailable": -1,
    "oversoldUnits": 1,
    "fulfillmentJobs": 2,
    "displayedAvailability": "in_stock"
  },
  "contractAware": {
    "reservedOrders": 1,
    "inventoryUnavailableOrders": 1,
    "resultingAvailable": 0,
    "oversoldUnits": 0,
    "fulfillmentJobs": 1,
    "duplicatePaymentEventsIgnored": 1,
    "displayedAvailability": "out_of_stock",
    "availabilityVersion": 2,
    "staleAvailabilityEventsIgnored": 1
  }
}

این خروجی فقط مکانیک یک Simulation تک‌پردازه و عمدی را نشان می‌دهد. Database isolation، distributed lock، Queue، Payment، Warehouse، Customer، UI، شبکه، امنیت، عدالت تخصیص یا Policy واقعی را آزمایش نمی‌کند. اعداد فروش، Conversion، Traffic، احتمال Oversell، Capacity یا Benchmark نیستند. مدل قراردادی نیز «راه‌حل عمومی» نیست؛ فقط Invariantهای Fixture را حفظ کرده است.

درس محدود: تست Checkout باید simultaneous reservation، duplicate Event و out-of-order version را کنار Happy Path اجرا کند و اثر را در Order، Inventory و Fulfillment با هم بسنجد.

سناریوی بومی: فروشگاه فارسی کاملاً مصنوعی

یک فروشگاه آزمایشی داخلی را با Product، Variant، Seller، Order و Addressهای `SYN-*` بسازید. Currency canonical در Fixture برابر IRR است و UI می‌تواند تومان را فقط با label و conversion مصوب نشان دهد. هیچ درگاه، PSP، بانک، Carrier، پیامک، Email، Warehouse، Seller، Customer یا نشانی واقعی متصل نیست و درباره قوانین یا شبکه تجارت ایران ادعایی ندارد.

ریسکتزریق ساختگیInvariantEvidence
Product identityدو Variant با عنوان مشابهSKU/Offer صحیح در Cart/OrderID graph
فارسی/RTLی/ی، ک/ک، سه رقم، mixed SKUSearch/display/selection consistentAPI/UI/print
ریال/تومانIRR API و تومان UIQuote/Order canonical بدون ضریب اشتباهbreakdown trace
Last unitدو Checkout هم‌زمانOversell طبق Policyreservation schedule
Callback duplicateCapture event دوباریک Fulfillment effectdedupe/job trace
TimeUTC نزدیک cut-off، تهران/شمسی نمایشRule بر instant/business date مصوبquote/promotion timeline
FailureStub response بعد Commit حذفsame Order lookup/retryidempotency/reconcile
No egressتلاش Notification/Carrier/Paymentlocal sink یا fail closednetwork policy log

نقش‌ها و Decision Rights

نقشمسئولیت نمونهنباید به‌تنهایی ادعا کند
Commerce ProductJourney، State، Promise، Policyصحت فنی یا قانونی بدون Evidence
Merchandising/PricingCatalog/Offer/Promotion rulesAccount/Payment correctness
Inventory/Fulfillment Opsstock/reservation/allocation/shippingتغییر silent customer contract
Engineeringidentity، concurrency، events، observabilityپذیرش مستقل residual risk
QA/Testrisk scenarios، execution، evidence/limitsتضمین Conversion/فروش/انطباق
UX/Research/Accessibilityparticipant/task/a11y evidenceمنطق Order/Inventory کامل
Security/Privacy/Legalthreat/data/applicability requirementsعملکرد Journey بدون Test
Operations/Risk ownerrunbook، release و risk acceptanceپنهان‌کردن Unknown یا override بدون expiry

برنامه ۳۰روزه Pilot

هفتهخروجیفعالیتمعیار پایان
۱: ContextCommerce context و entity mapیک SKU/Offer و Journey محدود، owners/sourcesSuccess و source of truth روشن‌اند
۲: ContractsCart/Quote/Inventory/Order contractsstate، version، idempotency، policiescritical invariants approved
۳: EvidenceSynthetic deterministic suitelast unit، duplicate، timeout، stale، partialFailureها reproducible و traceable‌اند
۴: Operationsmonitor/reconcile/release memofault rehearsal، unknown review، runbooksdecision/owner/expiry ثبت شده‌اند
  • با یک Variant، یک Offer و یک Location شروع کنید.
  • Entity IDs و Source of Truth را پیش از UI tests رسم کنید.
  • Quote و Order snapshot را به Price/Policy version وصل کنید.
  • Last-unit race، double submit و duplicate callback را اجباری کنید.
  • یک partial fulfillment و یک partial return اجرا کنید.
  • پس از Failure، Order/Inventory/Payment/Fulfillment را reconcile کنید.
  • در Retrospective بپرسید چه Unknownی تصمیم Release را تغییر داد.

ضدالگوهای رایج تست Ecommerce

ضدالگومسئلهاصلاح
تست تضمین فروش/Conversionعلت و بازار را ساده می‌کندرفتار محدود + experiment/analytics جدا
PDP opens = buyableOffer/stock/eligibility گم استOffer contract
Product=SKU=OfferVariant/Seller mismatchentity identity map
Price UI onlyFeed/quote/order mismatchsurface reconciliation
Cart total mutable silentcustomer accepts unknown quoteversion/reprice disclosure
Stock check then decrementlast-unit raceatomic reservation test
Payment callback = fulfillmentduplicate/out-of-order effectsdedupe/state/reconcile
Success page = complete orderunknown downstream statesaga evidence
One Order statusline/payment/fulfillment differencesseparate state machines
Return=Refund=Restockpolicy/quantity errorslinked workflows
Average latency + 7% claimContext/causality نداردsite-specific workload/evidence
Mobile emulator onlybrowser/device/input gapsrisk-based matrix
Heatmap without privacyPII/secret capturedata-flow/consent/masking
Production orders in testreal-world side effectssynthetic namespace/no egress
Load test without invariantsسریع اما Oversold/duplicatepost-load reconciliation
Blocked test hiddenUnknown حذف می‌شودexposure in release gate

چک‌لیست نهایی تست فروشگاه اینترنتی

  • Business model، channel، market، customer mode و excluded journeys روشن‌اند.
  • Product، Variant، SKU، Offer، Seller و Location شناسه مستقل دارند.
  • Price/availability میان Feed، Structured Data، PDP، Cart، Quote و Order trace می‌شوند.
  • Category/Search/Facet، Unicode، pagination و crawl navigation آزموده شده‌اند.
  • Cart line identity، version، guest merge، expiry و reprice policy دارد.
  • Quote amount/currency/breakdown/policy/expiry و acceptance snapshot دارد.
  • Promotion eligibility، stacking، quota، time و allocation version شده‌اند.
  • Inventory on-hand/reserved/available/safety/freshness semantics روشن است.
  • Last-unit، reservation expiry/commit و stale availability race اجرا شده‌اند.
  • Checkout Saga برای هر boundary idempotency، unknown و compensation دارد.
  • Address، delivery option، slot/capacity و promise طبق بازار آزموده‌اند.
  • Order line snapshot از Catalog زنده مستقل و history immutable است.
  • Payment و Order state جدا و با evidence/reconciliation پیوند دارند.
  • Fulfillment split/partial، duplicate job و tracking order بررسی شده‌اند.
  • Cancellation در boundaryهای Reserve/Pay/Allocate/Pack/Ship آزموده شده است.
  • Return، Refund و Restock workflow/quantity مستقل و linked دارند.
  • Marketplace Seller/line ownership و multi-seller totals حفظ می‌شوند.
  • Digital entitlement یا Subscription فقط اگر در Scope است Contract دارد.
  • Notification duplicate/stale/locale/privacy و retry behavior آزموده شده است.
  • Usability، Accessibility، Conversion و Functional evidence جدا گزارش می‌شوند.
  • Browser/device/WebView/cookie/back/low-memory matrix مبتنی بر Risk است.
  • فارسی/RTL، سه نوع رقم، ریال/تومان، آدرس و زمان End-to-End آزموده‌اند.
  • Security/Privacy شامل object/action authorization و analytics data flow است.
  • Load/Failure tests با Order/Inventory/Fulfillment invariants همراه‌اند.
  • Fixtureها synthetic، seeded، no-egress و قابل cleanup هستند.
  • Migration علاوه بر Count، graph، lineage، history و cutover را می‌سنجد.
  • Monitoring funnel را با unique effects، lag، mismatch و aging همراه می‌کند.
  • Release identity شامل Config/Rule/Index/Policy/Template و Code است.
  • Blocked/Inconclusive/Stale به‌عنوان Unknown در Release Memo می‌آیند.

سؤالات متداول تست فروشگاه اینترنتی

تست تجارت الکترونیک دقیقاً چیست؟

طراحی و تولید Evidence برای Journey و سامانه‌های Commerce است: Catalog، Search، Offer، Cart، Quote، Checkout، Order، Inventory، Payment boundary، Fulfillment و Return، همراه با Quality characteristicهای مرتبط. نتیجه تست به Build، Context، داده و Oracle محدود است و فروش یا تجربه بی‌نقص را تضمین نمی‌کند.

مهم‌ترین سناریوی Checkout برای شروع چیست؟

یک Last-unit scenario با دو Checkout هم‌زمان، double submit و timeout-after-commit بسیار آموزنده است. بررسی کنید فقط نتیجه مجاز Inventory ساخته شود، Order یکتا بماند، Payment unknown قابل بازیابی باشد و Fulfillment job تکراری ایجاد نشود. Policy Oversell و compensation را Product/Ops تعیین می‌کنند.

آیا موفقیت پرداخت یعنی سفارش کامل شده است؟

خیر. Payment، Order، Reservation و Fulfillment Stateهای جدا دارند. حتی Capture موفق می‌تواند کنار inventory failure یا Order pending باشد. Source evidence، idempotency، reconciliation و compensation تعیین می‌کنند سیستم چگونه به وضعیت قابل توضیح می‌رسد.

چگونه Oversell را تست کنیم؟

Available را به مقدار مرزی برسانید، دو یا چند Reservation را با Barrier هم‌زمان کنید و State/quantity نهایی را با Contract مقایسه کنید. سپس expiry-versus-commit، cancel-versus-pack، duplicate inventory event و recovery را اجرا و Order/Reservation/Inventory را reconcile کنید.

آیا تست کامل فروشگاه باعث افزایش نرخ تبدیل می‌شود؟

تست می‌تواند Defect و مانع را آشکار و uncertainty را کم کند، اما Conversion به قیمت، محصول، بازار، ترافیک، پیام، فصل، رقابت و عوامل دیگر وابسته است. اثر تغییر را با Experiment و Analytics معتبر بسنجید و آن را با Functional، Usability و Accessibility evidence یکی نگیرید.

جمع‌بندی: Journey را به زنجیره Contract و Evidence تبدیل کنید

تست فروشگاه اینترنتی با کلیک‌کردن از Home تا Success تمام نمی‌شود. Catalog identity و Offer قابل خرید، Cart/Quote نسخه‌دار، Reservation اتمیک، Checkout Saga قابل بازیابی، Order snapshot، Payment boundary، Fulfillment یکتا و Return/Refund/Restock جدا، ستون‌های اصلی‌اند. Qualityهای امنیت، کاربردپذیری، دسترس‌پذیری، سازگاری، بومی‌سازی و Performance باید به همین Journey وصل شوند.

به‌جای «سایت کار می‌کند»، بپرسید: کدام Variant و Offer با چه Price/Availability پذیرفته شد؟ آخرین واحد را چه کسی Reserve کرد؟ هر Callback چند اثر ساخت؟ Order line چگونه Fulfill و Return شد؟ کدام اختلاف هنوز Unknown است و چه کسی ریسک آن را می‌پذیرد؟

روش تدوین و منابع

این راهنما با بازبینی انتقادی نسخه قبلی، حذف وعده‌های Conversion/فروش/اعتماد و تفکیک intent از صفحات مالی، IPG، Security، Usability، Accessibility، Compatibility و Performance تدوین شد. آزمایش با Node.js ۲۴.۱۸.۰، بدون dependency، deterministic و با داده کاملاً ساختگی اجرا شد.

  • Google Merchant Center Product Data Specification: سازگاری Price/Currency/Availability برای Merchant Center، نه قانون یا تضمین رتبه.
  • Google Search Central Ecommerce Site Structure: crawlable navigation و ارتباط Category/Product.
  • W3C Understanding WCAG ۲.۲: منبع تفسیری Accessibility criteria، نه تضمین تجربه/Conversion.
  • منابع داخلی تخصصی سایت برای Money/Ledger، IPG، Security، Usability، Accessibility، Compatibility، Performance و فارسی/RTL.

بازبینی محتوایی: مرداد ۱۴۰۵. Feed specification، Search guidance، WCAG interpretation، Partner API، Price/Inventory/Return policy و قانون تغییر می‌کنند؛ نسخه و Applicability محصول خود را تأیید کنید.

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