Cart Management Testing Checklist (2026)

The Cart Management Testing Checklist (2026) gives engineers a concrete, step‑by‑step matrix for validating every facet of a shopping‑cart feature before it reaches production. Modern e‑commerce platf

March 23, 2026 · 18 min read · Testing Checklists

Cart Management Testing Checklist (2026) – Why It Matters

The Cart Management Testing Checklist (2026) gives engineers a concrete, step‑by‑step matrix for validating every facet of a shopping‑cart feature before it reaches production. Modern e‑commerce platforms expose carts to a wide variety of user behaviors, device contexts, and backend interactions; a single missed condition can lead to abandoned checkouts, revenue loss, or compliance violations. By treating the checklist as a living test suite—rather than a one‑off document—teams can catch regressions early, automate repetitive checks, and focus exploratory effort on the areas that truly need human judgment. The sections below break the checklist into discrete, measurable items, provide pass/fail criteria, show real‑world examples, and illustrate how an autonomous explorer such as SUSA can exercise most of these points in a single pass.

---

Happy Path Test Matrix

A reliable cart must first succeed under ideal conditions. The happy‑path matrix covers the core flow a typical user follows: discovering a product, adding it to the cart, reviewing the cart, adjusting quantities, applying discounts, and moving to checkout. Each item includes a clear pass criterion and a minimal manual test script, followed by an automated equivalent that can be dropped into a CI pipeline.

Add Item to Cart

StepActionExpected ResultPass CriteriaManual TestAutomated (Appium)
1Navigate to product detail page (PDP) for SKU APDP loads, price displayed, “Add to Cart” button enabledPage returns HTTP 200, button not disabledOpen PDP, verify buttondriver.findElement(By.id("add-to-cart")).click();
2Tap “Add to Cart”Cart badge increments by 1, toast shows “Item added”Badge = previous + 1, toast appears within 2 sObserve badge, toastassertEquals(driver.findElement(By.id("cart-badge")).getText(), "1");
3Verify cart persistenceItem appears in cart list with correct name, price, quantity = 1Cart DB row matches PDP dataOpen cart, check line itemList items = driver.findElements(By.className("cart-item")); assertEquals(items.size(), 1);

View Cart Summary

StepActionExpected ResultPass CriteriaManual TestAutomated (Playwright)
1Open cart page from header iconCart page loads, shows list of items, subtotal, tax, totalNo 5xx errors, subtotal = Σ(price × qty)Navigate, verify totalsawait page.goto('/cart'); await expect(page.locator('.subtotal')).toHaveText('$45.00');
2Verify empty state when no itemsMessage “Your cart is empty” displayed, CTA to shopMessage visible, primary button enabledRemove all items, reloadawait expect(page.locator('.empty-cart')).toBeVisible();

Update Quantity

StepActionExpected ResultPass CriteriaManual TestAutomated (Appium)
1Increase quantity of SKU A to 3 using “+” buttonQuantity field updates, line total reflects 3 × price, cart total adjustsQuantity = 3, line total = 3 × unit priceTap “+” twice, verifydriver.findElement(By.id("qty-plus")).click(); driver.findElement(By.id("qty-plus")).click();
2Decrease quantity to 1 using “‑” buttonQuantity returns to 1, line total recalculatesQuantity = 1Tap “‑” twicedriver.findElement(By.id("qty-minus")).click(); driver.findElement(By.id("qty-minus")).click();
3Set quantity to 0 via input field (if allowed)Item removed, cart badge decrements, empty state shown if no other itemsItem disappears, badge = 0 or previous‑1Input 0, press Enterdriver.findElement(By.id("qty-input")).clear(); driver.findElement(By.id("qty-input")).sendKeys("0"); driver.findElement(By.id("qty-input")).sendKeys(Keys.ENTER);

Remove Item

StepActionExpected ResultPass CriteriaManual TestAutomated (Playwright)
1Swipe left on cart item (mobile) or click “×” (web)Item removed, cart updates instantlyItem no longer in DOM, badge reducedSwipe/click, verifyawait page.locator('.cart-item').first().hover(); await page.click('.remove-btn');
2Verify undo toast appears (if implemented)Toast with “Undo” action visible for 5 s, clicking restores itemToast present, undo restores itemWait for toast, click Undoawait expect(page.locator('.undo-toast')).toBeVisible({timeout: 5000}); await page.click('.undo-toast button');

Apply Promo / Coupon

StepActionExpected ResultPass CriteriaManual TestAutomated (Appium)
1Open coupon field, enter valid code “SAVE10”Discount applied, coupon line shows –10 %, total reduced accordinglyDiscount field not empty, total = subtotal × 0.9Enter code, applydriver.findElement(By.id("coupon-input")).sendKeys("SAVE10"); driver.findElement(By.id("apply-coupon")).click();
2Attempt invalid code “FAKE123”Error message “Invalid coupon”, cart unchangedError visible, totals unchangedEnter bad codeassertTrue(driver.findElement(By.id("coupon-error")).isDisplayed());
3Remove coupon via “×”Discount line disappears, totals revert to pre‑coupon stateNo discount line, total = original subtotalClick removedriver.findElement(By.id("remove-coupon")).click();

Proceed to Checkout

StepActionExpected ResultPass CriteriaManual TestAutomated (Playwright)
1Click “Checkout” buttonNavigation to checkout page, cart data passed via URL or stateCheckout page loads, cart summary matches cart pageClick, verify URLawait page.click('#checkout-btn'); await expect(page).toHaveURL(/.*checkout/);
2Verify cart immutability during navigationNo background requests modify cart while in checkoutCart GET returns same items as before navigationDevTools network, verifyawait page.route('**/api/cart', route => { const req = request(); return req.method() === 'GET' ? route.fulfill({json: expectedCart}) : route.continue(); });

Each happy‑path row can be copied into a test case management tool (e.g., TestRail) with the manual steps as the “test case” and the automated snippet as the “automation script”. When the feature is stable, the automated scripts become the regression gate.

---

Error Handling and Validation

Even a flawless happy path fails if the system does not react correctly to invalid input, unexpected states, or external perturbations. This section enumerates validation checks that guard against data corruption, user frustration, and downstream failures.

Invalid Quantity Inputs

Test IDInputExpected System ReactionPass Criteria
QTY‑01Negative number (‑2)Field rejects, shows “Quantity must be ≥ 1”Error message appears, cart unchanged
QTY‑02Non‑numeric text (“abc”)Input ignored or cleared, validation errorNo change to quantity, error visible
QTY‑03Decimal (1.5) when only whole numbers allowedRounded down to 1 or rejected per business ruleSystem follows defined rule, consistent message
QTY‑04Exceeds max allowed (e.g., 999)Either capped at max or error “Maximum quantity exceeded”Behavior matches spec, no overflow

*Manual*: Open quantity input, type each value, press Enter or click away, observe feedback.

*Automated*: Parameterized test feeding each value, asserting presence of error element and unchanged cart total.

Price Modification During Session

ScenarioTriggerExpected ResultPass Criteria
PRICE‑01Backend price drops 20 % while item in cartCart shows stale price until refreshed; optional “Price updated” bannerNo silent overcharge; user sees discrepancy or update notice
PRICE‑02Tax rate changes mid‑sessionSubtotal unchanged, tax line reflects new rate on next page loadTax calculation uses latest rate at checkout
PRICE‑03Currency switch (USD → EUR) while item in cartCart converts using latest FX rate, shows conversion noticeConversion uses service rate, rounding to 2 dp

*Manual*: Use a proxy (e.g., Charles) to modify API responses, verify UI response.

*Automated*: Mock the price endpoint in test harness, assert UI shows either original price with banner or updated price per spec.

Stock‑out While Item in Cart

ConditionActionExpected ResultPass Criteria
STOCK‑01Inventory goes to 0 after addCart displays “Item out of stock”, remove‑only button enabledUser cannot increase quantity, can remove
STOCK‑02Partial stock (e.g., only 2 left, cart has 3)Cart auto‑reduces quantity to available stock, shows warningQuantity adjusted, warning visible
STOCK‑03Item becomes unavailable (deleted)Cart removes line item, shows “Item no longer available”Line item gone, cart total updated

*Manual*: Adjust inventory via admin API, refresh cart, observe.

*Automated*: In test, call inventory‑decrement endpoint, then assert cart DOM changes.

Session Timeout / Cookie Loss

TestActionExpected ResultPass Criteria
SESS‑01Leave cart idle longer than server session timeout (e.g., 30 min)Upon next action, redirected to login or cart restored via persistent tokenNo loss of cart data if persistent storage used; otherwise, else graceful redirect
SESS‑02Clear browser cookies mid‑sessionCart disappears if relying solely on cookies; if using server‑side cart, data persistsVerify storage mechanism matches design
SESS‑03Incognito tab → add item → close tab → reopen incognitoCart empty (if session‑only) or restored (if using localStorage)Behavior matches spec

*Manual*: Use browser dev tools to clear cookies, wait, attempt checkout.

*Automated*: Set cookie expiration via Selenium driver.manage().deleteCookieNamed("JSESSIONID"), then attempt navigation and assert redirect or cart state.

Network Failure Mid‑Operation

TestActionExpected ResultPass Criteria
NET‑01Simulate loss of connectivity after “Add to Cart” but before server ACKClient shows optimistic UI update, then error toast when timeout occurs, option to retryUI does not permanently show false success; retry restores correct state
NET‑02Intermittent 500 errors on cart‑update endpointClient queues request, retries with exponential backoff, shows “Updating…” spinnerEventually succeeds or shows persistent error after max retries
NET‑03Slow response (>10 s) on cart‑loadLoading spinner displayed, fallback to cached cart if availableUser sees indication of wait, not a frozen UI

*Manual*: Use Chrome DevTools → Network → Throttle → Offline or custom latency.

*Automated*: With Playwright, await page.route('**/api/cart', route => route.abort()); then check for error handling.

---

Edge and Boundary Cases

Boundary testing pushes the cart to its limits, uncovering issues that rarely appear in functional tests but can cause catastrophic failures under load or unusual user patterns.

Maximum Cart Size

LimitTestExpected ResultPass Criteria
MAX‑ITEMSAdd items until cart holds 500 distinct SKUs (or platform‑defined max)Cart loads, scrollable, performance stays within 2 s for initial renderNo UI freeze, memory usage < 150 MB
MAX‑QTY‑PER‑SKUSet quantity of a single SKU to 999 999 (if allowed)Cart calculates total correctly, no integer overflowTotal uses 64‑bit arithmetic, displays correctly formatted number
TOTAL‑VALUE‑CAPAdd high‑priced items to exceed $1 000 000 subtotalSystem either blocks with “Order value exceeds limit” or allows with fraud‑check flagBehavior matches financial‑risk policy

*Manual*: Use a script to add items via API, then verify UI via browser.

*Automated*: Loop via API calls, then assert cart endpoint returns correct counts and totals.

Concurrent Modifications

ScenarioActorsExpected ResultPass Criteria
CONC‑01Two tabs of same user, each adds different item simultaneouslyFinal cart contains both items, quantities correctNo lost updates, final state = union of actions
CONC‑02One user adds item, another admin deletes the SKU from catalogCart shows item removed or marked unavailable, with warningGraceful degradation, not a 500 error
CONC‑03User applies coupon while another user (same account) removes item from cart on different deviceCoupon remains valid only if cart still meets coupon conditions; otherwise, coupon removed with noticeConditional logic respects cart state at validation time

*Manual*: Open two browser windows, perform actions, refresh, verify.

*Automated*: Use Selenium Grid with two sessions targeting same user token, assert final cart via API.

Device Orientation & Form‑Factor Changes

TestActionExpected ResultPass Criteria
ORIENT‑01Start in portrait, add item, rotate to landscapeCart page re‑flows, all controls accessible, no overlappingLayout adapts, touch targets ≥ 48 dp
ORIENT‑02Foldable device: switch from single screen to dual‑screen modeCart persists, no data loss, UI uses available screen real‑estateState unchanged, UI renders correctly on both screens
ZOOM‑01Pinch‑zoom to 200 % on cart pageText scales, layout remains usable, no horizontal scroll unless intentionalWCAG 1.4.4 resize text compliance

*Manual*: Use device emulator or real device, rotate, fold, zoom.

*Automated*: Appium driver.rotate(ScreenOrientation.LANDSCAPE); then assert element visibility.

Internationalization & Localization

TestLocaleExpected ResultPass Criteria
I18N‑01English (US) → German (DE)All cart labels, placeholders, error messages translated, numbers use comma as decimal separatorLanguage files loaded, UI mirrors design
I18N‑02Right‑to‑left (Arabic)Cart layout mirrors, icons flipped appropriately, text aligns rightDirectionality attributes (dir="rtl") present
I18N‑03Japanese (JP) with cart containing > 10 itemsLine wrapping respects word‑break rules, no overflowNo clipped text, line-height adequate

*Manual*: Change device language, verify each string.

*Automated*: Use Playwright await page.context().setLocale('de-DE'); then assert text content matches translation file.

---

Accessibility Testing

Accessibility is not an afterthought; it expands market reach and satisfies legal obligations. The following items map to WCAG 2.2 AA (and where relevant, AAA) criteria, with concrete checks and pass criteria.

Screen Reader Compatibility

CheckTechniqueExpected ResultPass Criteria
SR‑01Navigate cart with TalkBack (Android) or VoiceOver (iOS)Each cart item announced as “Product name, price, quantity, remove button”All meaningful content has accessible label or aria‑label
SR‑02Activate “Add to Cart” via screen reader gestureAnnouncement: “Add to Cart button, tapped” followed by success toast spokenFeedback delivered via live region (aria-live="polite" )
SR‑03Read coupon error messageError announced immediately after input loses focusError message wrapped in

*Manual*: Enable TalkBack, swipe through cart, listen.

*Automated*: Use axe‑core with axe.run({rules: {screenreader: {enabled:true}}}) and assert no violations.

Keyboard Navigation

CheckActionExpected ResultPass Criteria
KB‑01Tab through cart pageFocus moves logically: product name → quantity input → +/− buttons → remove → proceedNo focus traps, visible focus outline (≥ 2 px contrast)
KB‑02Activate quantity input, use Arrow Up/DownQuantity increments/decrements by 1 (or step defined)Step behavior matches spec
KB‑03Invoke cart page via shortcut (e.g., Alt + C)Focus lands on cart header or first itemCustom shortcuts documented and functional

*Manual*: Keyboard only, no mouse.

*Automated*: Use Playwright await page.keyboard.press('Tab'); then await expect(page.locator(':focus')).toHaveAttribute('id', 'qty-input');.

Color Contrast & Visual Presentation

CheckToolExpected ResultPass Criteria
CC‑01Contrast ratio between cart item background and textMinimum 4.5:1 for normal text, 3:1 for large textMeets WCAG AA
CC‑02Focus indicator contrastContrast ≥ 3:1 against adjacent colorsVisible for low‑vision users
CC‑03Error message background vs. textContrast ≥ 4.5:1Errors readable by all

*Manual*: Use Chrome DevTools → Contrast checker.

*Automated*: Run axe with color-contrast rule enabled.

Touch Target Size

CheckMeasurementExpected ResultPass Criteria
TT‑01Touch area of “Remove” button≥ 48 × 48 dp (or 48 px)No mis‑taps
TT‑02Spacing between adjacent interactive elements≥ 8 dpPrevents accidental activation

*Manual*: Use UI‑Automatorviewer or Android Studio layout inspector.

*Automated*: Appium can retrieve element bounds and assert width/height ≥ 48.

Reduced Motion & Animation Preferences

CheckActionExpected ResultPass Criteria
RM‑01Enable “Reduce Motion” in OS settingsCart page animations (e.g., fade‑in of toast) either disabled or replaced with static fallbackRespects prefers-reduced-media: reduce
RM‑02Animate quantity changeIf reduce‑motion on, change is instant, no transitionNo motion sickness triggers

*Manual*: Toggle OS setting, observe.

*Automated*: Use Playwright await page.evaluate(() => window.matchMedia('(prefers-reduced-media: reduce)').matches); then check for absence of CSS transitions.

---

Security and Privacy

Cart data often contains personally identifiable information (PII) and pricing details that, if exposed, enable fraud or regulatory penalties. This section outlines security‑focused tests that can be automated via OWASP ZAP, custom scripts, or integrated into the CI pipeline.

Data Exposure in Network Calls

TestMethodExpected ResultPass Criteria
SEC‑01Sniff traffic (e.g., with mitmproxy) while adding itemRequest/response contains only necessary fields (productId, quantity, token); no raw PII such as full name, emailPayload minimized
SEC‑02Inspect cart GET responseDoes not include user’s address, payment token, or order historyOnly cart‑specific data returned
SEC‑03Check for caching headersCache-Control: private, no-store for cart endpointsPrevents proxy caching of sensitive data

*Manual*: Use proxy, view request/response bodies.

*Automated*: In test, assert that JSON schema does not contain disallowed fields (ajv.validate(schema, response.body)).

Cross‑Site Request Forgery (CSRF)

TestActionExpected ResultPass Criteria
CSRF‑01Submit a form to /api/cart/add from a different origin without tokenServer rejects with 403 ForbiddenCSRF token validated
CSRF‑02Attempt to reuse a valid token after session logoutRequest fails, token invalidatedToken bound to session
CSRF‑03Check SameSite attribute on session cookieSameSite=Strict or LaxMitigates CSRF via cookie settings

*Manual*: Craft HTML form hosted on external domain, submit, observe response.

*Automated*: Use REST-assured to send request without header, assert 403.

Cross‑Site Scripting (XSS) via Cart‑Generated Content

TestVectorExpected ResultPass Criteria
XSS‑01Inject into product name via admin API (if allowed)Cart page renders text escaped, script not executedOutput encoding applied
XSS‑02Attempt to store script in coupon code fieldCoupon rejected or escaped; no script executionInput validation + output encoding
XSS‑03Evaluate DOM after cart render for any