Forgot Password Testing Checklist (2026)

Forgot Password Testing Checklist (2026)

January 04, 2026 · 14 min read · Testing Checklists

Forgot Password Testing Checklist (2026)

A comprehensive, actionable matrix for validating the password‑reset flow in modern applications

---

Forgot Password Testing Checklist (2026) – Overview

The Forgot Password Testing Checklist (2026) gives you a single source of truth for exercising every observable behavior of a password‑reset feature, from the moment a user clicks “Forgot password?” to the point they successfully set a new credential. Treat this list as a living contract: each item maps to a pass/fail criterion, a concrete example, and guidance on how to automate it. By the end of this guide you will be able to copy the tables into your test‑management tool, extend them with product‑specific variations, and see how an autonomous explorer such as SUSA can hit the majority of these checks in one unattended run.

---

Happy Path Test Cases

IDDescriptionPreconditionsStepsExpected ResultPass/Fail Criteria
HP‑1User initiates reset via email linkRegistered email address on file1. Navigate to login screen 2. Tap “Forgot password?” 3. Enter valid email 4. Submit 5. Open email inbox 6. Click reset link 7. Enter new password (meets policy) 8. Confirm password 9. SubmitSystem shows “Password updated successfully” and redirects to login page✅ If success message appears and user can log in with new password
HP‑2User initiates reset via SMS OTPVerified phone number on accountSame as HP‑1 but choose “Send code via SMS”, enter OTP, then set new passwordSame as HP‑1✅ Same criteria
HP‑3Reset link expires after configured windowEmail sent at T0Wait until link expiry (e.g., 24 h) then click linkSystem shows “Link expired or invalid” and offers to resend✅ Message appears, no password change allowed
HP‑4Resend functionality worksEmail sent, user did not receiveClick “Resend link” on the reset pageNew email arrives within expected SLA (≤ 30 s)✅ New email received, old link still valid until new one used
HP‑5Password policy enforcement during resetPolicy: min 12 chars, 1 upper, 1 lower, 1 digit, 1 symbolEnter password that satisfies all rulesAcceptance✅ Password accepted
HP‑6Password policy rejection during resetSame policyEnter password missing a required classInline error indicating missing rule✅ Error shown, form not submitted

Why happy‑path matters: It establishes the baseline that the core flow works for the majority of users. Any deviation here blocks downstream scenarios such as error handling or security checks.

---

Error Handling and Validation

IDDescriptionTriggerExpected UI/UXPass/Fail
EH‑1Empty email fieldSubmit with blank emailInline error: “Email address is required”✅ Error appears, form stays on page
EH‑2Malformed email“user@” or “user@domain”Inline error: “Please enter a valid email address”✅ Same
EH‑3Non‑registered email“unknown@example.com”General message: “If this email exists, we’ve sent a reset link” (no user enumeration)✅ Generic message, no indication of existence
EH‑4Rate‑limit on request submissionSubmit > 5 times in 30 sToast: “Too many attempts, please wait 2 min”✅ Throttling enforced
EH‑5Invalid OTP lengthEnter 3‑digit code when 6 expectedInline error: “Code must be 6 digits”✅ Error shown
EH‑6OTP expiredWait > 5 min after SMS sent, then submitMessage: “Code has expired, request a new one”✅ Correct messaging
EH‑7Token tamperingModify reset link token (e.g., flip a bit) and submitSystem rejects with “Invalid or expired token”✅ No password change
EH‑8Concurrent reset attemptsUser A and B request reset for same account almost simultaneouslyOnly the latest token is valid; earlier token yields error✅ No race‑condition allowing both to succeed
EH‑9Password mismatchNew password and confirmation differInline error: “Passwords do not match”✅ Form blocked
EH‑10Password too short/long5‑char password or 200‑char passwordPolicy violation message✅ Message reflects limits

Implementation tip: Use a data‑driven test harness (e.g., TestNG + CSV) to iterate over the above triggers, asserting both UI text and HTTP response codes (where applicable).

---

Edge and Boundary Cases

IDScenarioBoundary ValueExpected Outcome
EB‑1Email length limit254 chars (RFC 5321 max)Accepted if system allows; otherwise error with clear limit
EB‑2Email length overflow255 charsRejected with “Email too long”
EB‑3Phone number international format+1‑555‑123‑4567 (E.164)Accepted if SMS gateway supports
EB‑4Phone number with leading zeros0015551234567Treated as invalid or normalized; check consistency
EB‑5Unicode in email (e.g., 用户@例子.中国)UTF‑8 local part/domainAccepted if IDN supported; otherwise punycode conversion visible
EB‑6Very long password (policy max)128 chars (if policy allows)Accepted; verify hash storage length
EB‑7Password with only spaces“     ”Rejected as per policy (usually requires non‑space)
EB‑8Simultaneous email and SMS requestChoose both channels (if UI permits)System sends both; each token works independently
EB‑9Reset after account lockoutAccount locked due to failed loginsReset still allowed (decoupled from auth) – verify
EB‑10Reset after password change within short windowChange password, then immediately request resetNew reset token invalidates previous session; old token fails
EB‑11Reset link clicked from insecure client (e.g., outdated browser)TLS 1.0 onlyServer should reject connection or force upgrade; client shows appropriate error
EB‑12Reset link clicked from email client that strips tracking parametersLink missing utm_*Core token still present; system works
EB‑13Reset request from VPN with IP‑geo mismatchLogin from US, reset from EUNo geo‑blocking on reset (unless policy says otherwise)
EB‑14Reset after account deletion request in progressAccount marked for deletion, not yet purgedSystem returns “Account not found” generic message (no leakage)
EB‑15Reset with disabled JavaScriptUser has JS turned offFallback to server‑side form works (progressive enhancement)

Testing approach: Combine manual exploratory steps with automated scripts that inject boundary values via API (if exposed) or via Selenium/Appium field manipulation.

---

Accessibility (WCAG) Considerations

WCAG GuidelineTest ItemHow to VerifyPass Criteria
1.1.1 Non‑text ContentAll icons (e.g., eye‑toggle for password visibility) have accessible namesInspect ARIA‑label or alt text✅ Each icon conveys purpose
1.3.1 Info and RelationshipsForm fields are correctly labelled ( or aria-labelledby)Use axe or manual inspection✅ No orphaned inputs
1.4.3 Contrast (Minimum)Text vs. background contrast ≥ 4.5:1Run contrast analyzer✅ All foreground/background pairs pass
1.4.4 Resize TextUI scales to 200% without loss of content or functionalityZoom browser 200%✅ No overlap, all controls reachable
2.1.1 KeyboardAll interactive elements reachable via Tab; no keyboard trapsNavigate with Tab only✅ Logical order, escape closes dialogs
2.4.7 Focus VisibleVisible focus outline on interactive elementsTab through, observe outline✅ Outline present, ≥ 2 px solid
2.5.1 Pointer GesturesNo reliance on complex gestures (e.g., multi‑touch swipe) for resetTest with mouse and single tap✅ Simple click suffices
2.5.3 Label in NameVoiceOver/TalkBack reads the purpose of buttons (e.g., “Send reset link”)Run screen‑reader, listen✅ Label matches visible text
3.2.1 On FocusChanging focus does not initiate unexpected context change (e.g., auto‑submit)Focus each field, watch for auto‑submit✅ No auto‑submit on focus
3.3.2 Labels or InstructionsInstructions for password policy are perceivableCheck for helper text or aria‑describedby✅ Policy visible or announced
4.1.2 Name, Role, ValueCustom widgets (e.g., password strength meter) expose correct role/valueInspect accessibility tree✅ Role = slider or progressbar, value announced

Automated check: Run axe‑core or Google’s Accessibility Test Suite as part of CI; treat any violation as a blocker for the forgot‑password feature.

---

Security and Privacy Checks

IDCheckMethodExpected Result
SEC‑1Token entropyInspect reset link: should be ≥ 128‑bit random, base64url✅ High entropy, no predictable pattern
SEC‑2Token expirationRequest link, wait past TTL, attempt use✅ Link rejected
SEC‑3Token reuseUse same token twice✅ Second use rejected
SEC‑4Rate limiting on token validationSend 20 rapid validation requests with same token✅ After threshold, HTTP 429 or temporary lock
SEC‑5No password leakage in logs/APIsAttempt to reset with a known password, capture network traffic, search logs✅ Password never appears in URL, headers, or response bodies
SEC‑6Secure transportVerify all reset‑related endpoints enforce HTTPS (TLS 1.2+)✅ No HTTP fallback
SEC‑7Account enumeration resistanceCompare responses for existing vs. non‑existing email (timing, message)✅ Identical generic message, timing variance < 20 ms
SEC‑8Password policy enforced server‑sideTry to set password via API directly bypassing UI, violating policy✅ Server rejects with 400 and policy message
SEC‑9Salted hash storageAfter reset, retrieve hash from DB (if accessible) and verify unique salt per user✅ Different salts for different users
SEC‑10Protection against brute‑force on OTPFail OTP 10 times, observe lockout or exponential back‑off✅ Account not locked, but OTP validation throttled
SEC‑11Privacy‑by‑design: minimal data in reset emailEmail contains only link, no user‑ID or email in plain text✅ No PII beyond the address itself
SEC‑12CSP headers on reset pageInspect response headers for Content‑Security‑Policy✅ Prevents inline script injection
SEC‑13SameSite cookie on reset sessionCookie set with SameSite=Strict or Lax✅ Mitigates CSRF
SEC‑14Logging of reset events for auditVerify that each request logs timestamp, IP, user‑id (hashed) and outcome✅ Logs available for SIEM
SEC‑15Test for token leakage via Referer headerClick reset link from third‑party site, check if token appears in Referer✅ Token stripped or not sent due to referrerpolicy=no-referrer

Tooling tip: Use OWASP ZAP or Burp Suite to automate SEC‑suite to scan for missing headers, token predictability, and information leakage.

---

Performance and Load Testing

ScenarioLoad ProfileMetrics to CaptureAcceptance Threshold
PL‑1Single user reset (baseline)End‑to‑end latency (request → password change confirmation)≤ 2 s on typical 3G/4G
PL‑2Burst of 50 reset requests within 5 s95th‑percentile latency, error rate≤ 3 s latency increase >0-------------------------------------------------------
PL‑3Sustained 10 req/s for 5 minAverage latency, CPU/Memory on auth service≤ 2.5 s latency, < 70 % CPU, < 80 % RAM
PL‑4Spike: 500 req/s for 30 s (simulating credential‑stuffing attack)Rate‑limit triggers, HTTP 429 rate, system stability≥ 90 % of requests receive 429 after threshold, no crash
PL‑5Reset via SMS gateway simulation (mock latency 800 ms)End‑to‑end latency, queue depth≤ 4 s total, queue does not grow unbounded
PL‑6Mobile client on low‑end device (CPU ≈ 500 MHz, RAM ≈ 512 MB)UI render time, battery impact (via Android Profiler)UI responsive (< 16 ms per frame), battery drain < 5 % per 10 resets

Execution: Use k6 or Gatling for server‑side load, and Appium/Espresso for client‑side performance profiling. Include network throttling (e.g., Chrome DevTools → Network → Slow 3G) to emulate real‑world conditions.

---

Release Readiness and Regression

Checklist ItemDescriptionEvidence Required
RR‑1Test coverage matrix updatedLink to test‑case repository showing all IDs from above mapped to automated scripts
RR‑2CI pipeline gatePipeline fails if any Forgot Password test returns FAIL
RR‑3Canary validationDeploy to 5 % users, monitor reset success rate > 99.5 % and no increase in error logs
RR‑4Rollback plan documentedRun‑book with steps to revert auth service version and DB schema if needed
RR‑5Security sign‑offPen‑test report shows no critical findings in reset flow
RR‑6Performance baseline storedStore latest k6 report as artifact; new build must not exceed baseline by > 10 %
RR‑7Accessibility audit passedAxe report shows zero violations (WCAG 2.1 AA)
RR‑8Documentation updatedUser‑help article and API spec reflect any changes to reset endpoint or token format
RR‑9Backward compatibility verifiedOlder client versions (n‑2) still able to consume reset links (no breaking changes)
RR‑10Feature flag toggle testedAbility to disable reset flow via flag without breaking login or other flows

Regression strategy: Keep a dedicated “forgot‑password” test suite that runs on every PR. Use contract testing (Pact) to ensure the API contract (request/response shape, status codes) stays stable.

---

How Autonomous Exploration (SUSA) Covers This Checklist

SUSA’s agent‑based testing model can exercise a large portion of the Forgot Password Testing Checklist (2026) without hand‑crafted scripts. When you point SUSA at your application (APK or web URL) and enable the “auth‑reset” persona set, the platform performs the following:

  1. Persona‑driven navigation – The curious and power‑user personas systematically explore every link and button labeled “Forgot password”, “Reset via email”, or “Send OTP”. This hits HP‑1, HP‑2, and the resend flow (HP‑4) automatically.
  2. Input fuzzing – For each discovered field, SUSA injects boundary values from its built‑in data‑set (empty strings, max‑length emails, Unicode, SQL‑style payloads). This covers EB‑1 through EB‑6, EH‑1 through EH‑10, and many SEC checks (token entropy, injection attempts).
  3. State‑machine tracking – The agent records the exact sequence of screens visited, tokens observed, and timestamps. When it encounters a reset link, it validates expiration, reuse, and rate‑limit behavior (SEC‑1, SEC‑2, SEC‑3, SEC‑4) by replaying the link with varied delays.
  4. Accessibility probing – Using integrated axe‑core, SUSA evaluates contrast, labels, and keyboard focus on every rendered reset page, satisfying WCAG items 1.1.1, 1.3.1, 1.4.3, 2.1.1, 2.4.7, and 3.3.2.
  5. Security header inspection – Each HTTP response is scanned for CSP, HSTS, SameSite, and Referrer‑Policy headers, fulfilling SEC‑12 through SEC‑15.
  6. Performance telemetry – SUSA measures time‑to‑interaction and time‑to‑completion for the reset flow under simulated 3G throttling, providing data comparable to PL‑1 and PL‑2.
  7. Logging and reporting – At the end of a run, SUSA emits a JSON report that maps each observed behavior to a checklist ID, marking PASS/FAIL based on heuristics (e.g., token entropy > 100 bits, error messages generic).

While SUSA excels at surface‑level validation, certain deep‑logic checks (e.g., server‑side password hash salting, back‑end rate‑limit algorithms, or specific cryptographic implementations) still require targeted unit or integration tests. Therefore, treat the autonomous run as a first‑line gate that catches the majority of regressions, freeing your team to focus manual effort on the higher‑risk items listed in the Security and Privacy and Release Readiness sections.

---

Quick Reference Checklist (Markdown Table)

You can copy this directly into your test‑management tool or a shared wiki.

AreaIDTitlePass CriteriaAutomation Hint
Happy PathHP‑1Email‑based reset successSuccess message + new password login worksPlaywright: fill email → click link → set password
Happy PathHP‑2SMS‑based reset successSame as HP‑1 but via OTPAppium: request OTP → fill code → set password
Error HandlingEH‑1Empty email fieldInline “required” errorSelenium: assert visibility of error
Error HandlingEH‑3Non‑registered emailGeneric message, no enumerationAPI: assert same response body for existent/non‑existent
Edge CasesEB‑1Max‑length email (254)Accepted or clear limit errorData‑driven test with 254‑char string
Edge CasesEB‑7Password only spacesRejected per policyUI: attempt submit, assert error
Accessibility1.1.1Icon has accessible nameARIA‑label or alt presentAxe: run on reset page
Accessibility2.1.1Tab order logicalNo traps, all fields reachableKeyboard navigation script
SecuritySEC‑1Token entropy ≥ 128‑bitHigh randomness, base64urlDecode token, measure bits
SecuritySEC‑7No account enumerationIdentical messages/timingMeasure response time diff < 20 ms
SecuritySEC‑12CSP header presentBlocks inline scriptcurl -I response header check
PerformancePL‑1Single‑user latency ≤ 2 sEnd‑to‑end timerk6 script with one VU
PerformancePL‑4Spike → 429 after threshold≥ 90 % 429, no crashk6 ramp‑up to 500 req/s
ReleaseRR‑1Test coverage matrix updatedAll IDs mappedLink to test repoCI badge
ReleaseRR‑6Performance baseline not degraded > 10 %Compare latest k6 report to storedStore as artifact, fail on regression

---

Closing Takeaways

A solid forgot‑password flow is more than a “nice‑to‑have” convenience; it is a gatekeeper for account recovery, a potential vector for credential‑stuffing, and a frequent source of user frustration when poorly implemented. By treating the Forgot Password Testing Checklist (2026) as a contract—complete with pass criteria, realistic examples, and automation hints—you give your team a repeatable, verifiable way to guard against regressions, security slips, and accessibility gaps.

Leverage autonomous explorers like SUSA for broad coverage, but complement them with focused unit, integration, and performance tests that validate the cryptographic guarantees, rate‑limit logic, and server‑side side‑effects that lie beneath the UI. Keep the checklist alive: whenever you add a new reset channel (e.g., magic link via push notification) or adjust policy (e.g., increase minimum length), add the corresponding rows, update the automation, and let the CI gate enforce quality.

When the reset flow passes every item on this list, you can ship with confidence that users will regain access safely, quickly, and without barriers—exactly the experience a modern authentication system should deliver.

---

*End of article.*

Test Your App Autonomously

Upload your APK or URL. SUSA explores like 10 real users — finds bugs, accessibility violations, and security issues. No scripts.

Try SUSA Free