Accessibility Settings Testing Checklist (2026)

Accessibility Settings Testing Checklist (2026) provides a concrete, repeatable matrix for validating every toggle, slider, dialog, and persistence behavior that users encounter when they adjust syste

June 28, 2026 · 19 min read · Testing Checklists

Accessibility Settings Testing Checklist (2026)

Accessibility Settings Testing Checklist (2026) provides a concrete, repeatable matrix for validating every toggle, slider, dialog, and persistence behavior that users encounter when they adjust system or app‑level accessibility options. The checklist groups 30+ items into happy‑path, error handling, edge/boundary, accessibility‑specific, security/privacy, performance, and release‑readiness categories, each with clear pass criteria and real‑world examples. By following this guide, engineers can catch regressions that only appear after a setting is changed, verify that assistive technologies remain functional, and ensure that the settings UI itself conforms to WCAG 2.2 before a release ships.

---

1. Foundations of Accessibility Settings Testing

Understanding why settings merit dedicated test effort prevents teams from treating them as after‑thoughts. Accessibility settings control how the OS or an app presents content, accepts input, and communicates state to assistive technologies. A mis‑configured toggle can silently break screen‑reader navigation, cause touch targets to shrink below the 48 dp minimum, or expose personal data through logging.

Regulatory context – In 2026, many jurisdictions enforce WCAG 2.2 AA as a baseline for digital products sold to government or public‑sector clients. Settings that affect contrast, text scaling, or captioning are directly auditable; failure can result in non‑compliance penalties.

User personas – The checklist is exercised against eight personas defined by SUSA’s autonomous explorer:

PersonaPrimary interaction styleTypical setting changes
CuriousExplores every toggle, reads descriptionsEnters deep menus, tries undocumented combos
ImpatientUses quick‑settings, expects immediate effectTaps apply without reading warnings
NoviceRelies on defaults, needs clear labelsAvoids advanced options, may miss save button
AdversarialAttempts to break validationEnters out‑of‑range values, injects scripts
ElderlyPrefers large text, high contrast, reduced motionIncreases font size, enables grayscale
AccessibilityRelies on screen reader, switch control, voiceVerifies announcements, focus order
Power userScripts settings via ADB or CLI, profilesApplies batch changes, restores backups
Privacy‑consciousAudits logging, data sharing, permission promptsDisables telemetry, reviews data usage

Designing tests that satisfy each persona ensures the settings UI works for the full spectrum of real‑world usage.

---

2. Happy Path Test Items

Happy‑path verification confirms that each setting behaves as documented when a user follows the intended flow. The items below are grouped by control type; each includes a pass criterion and a concrete example.

#### 2.1 Toggles (switches)

#SettingActionExpected resultPass criteria
1TalkBack (screen reader)Toggle ON → OFF → ONTalkBack starts/stops instantly; accessibility service bound/unboundService appears in adb shell dumpsys accessibility; no delay >200 ms
2Color inversionToggle ONUI colors invert immediately; contrast ratio ≥4.5:1 for all textScreenshot comparison shows inverted palette; no flicker
3Mono audioToggle ONAudio output merges left/right channels; volume unchangedmedia service reports mono mix; no audible distortion

*Implementation tip*: Use UI Automator to locate the switch by its content‑description, then invoke performClick() and assert the service state via AccessibilityManager.isEnabled().

#### 2.2 Sliders and range selectors

#SettingActionExpected resultPass criteria
4Font sizeDrag from 80 % → 120 % → 200 %Text scales proportionally; layout does not truncateAll visible TextViews report getTextSize() matching selected %; no clipping
5Audio balanceMove slider to -100 % (left) → 0 % → +100 % (right)Left/right gain changes linearly; center at 0 %AudioManager.getStreamVolume() shows correct channel balance
6Gesture sensitivitySet to minimum, maximum, then middleGesture recognizer thresholds adjust; no false positivesRecord gestures with GestureDetector; verify distance threshold matches slider value

*Implementation tip*: Use UiObject2.setText() to send a numeric value directly when the slider exposes an editable field; otherwise, simulate drag with dragTo().

#### 2.3 Dropdowns and pickers

#SettingActionExpected resultPass criteria
7Preferred spoken languageSelect “Spanish (Spain)”System TTS voice switches to es‑ES; subsequent announcements use that voiceTextToSpeech.getLanguage() returns Locale(“es”, “ES”)
8Notification styleChoose “Banners” → “Pop‑up” → “None”Notification appearance changes accordingly; no duplicate alertsObserve status bar; verify NotificationListenerService receives correct priority
9Zoom typePick “Full screen” → “Window” → “Magnifier window”Magnification mode changes instantly; focus follows zoomAccessibilityManager.isMagnificationEnabled() reflects selection; no lag >150 ms

#### 2.4 Text fields and custom inputs

#SettingActionExpected resultPass criteria
10Custom vibration patternEnter “200,100,200” (ms)Device vibrates with the pattern on test triggerVibrationEffect.createWaveform() matches input; no crash
11Accessibility shortcutType “power+volup”Long‑press power + volume up launches TalkBackKeyEvent sequence triggers accessibility service start
12Label edit for custom actionRename “Launch camera” to “Open cam”New label appears in accessibility actions menuAccessibilityNodeInfo.getActionLabel() returns updated string

#### 2.5 Save/Apply and persistence

#SettingActionExpected resultPass criteria
13Apply buttonChange font size, tap Apply, exit settingsNew size persists after returning to home screenHome screen launcher text reflects new size
14Auto‑saveToggle TalkBack ON, navigate away without pressing SaveSetting persists (implicit auto‑save)Same as #13
15Reset to defaultsPress “Reset all accessibility settings”All toggles revert to factory defaults; custom values clearedVerify each setting matches default values in Settings.Secure

*Implementation tip*: After each change, issue adb shell settings get accessibility to read the persisted value and compare against expectation.

---

3. Error Handling and Validation

Settings must reject invalid input gracefully, provide clear feedback, and leave the system in a stable state.

#### 3.1 Invalid numeric entry

#SettingInvalid inputExpected feedbackPass criteria
16Font size“0 %” (below minimum)Inline error: “Value must be between 50 % and 300 %”Toast or Snackbar appears; setting unchanged
17Audio balance“150” (beyond ±100)Dialog: “Please enter a number between -100 and 100”Input rejected; slider stays at previous value
18Vibration pattern“abc,def”Error: “Only numbers and commas allowed”Field highlights red; no vibration on test

*Implementation tip*: Use Espresso’s onView(withId(R.id.font_size)).perform(replaceText("0%"), closeSoftKeyboard()) then assert onView(withText("Value must be between 50 % and 300 %")).isDisplayed().

#### 3.2 Conflicting settings

#ConflictTriggerExpected system responsePass criteria
19TalkBack + Switch AccessEnable both simultaneouslySystem shows warning: “Only one accessibility service can receive touch events at a time”; one service auto‑disablesExactly one service remains enabled after warning dismissal
20High contrast text + Color inversionEnable bothSystem applies inversion first, then contrast; no visual glitchScreenshot shows legible text; contrast ratio ≥7:1
21Reduce motion + Animator duration scaleSet reduce motion ON, then animator scale to 10×System ignores animator scale for accessibility‑related animationsAnimations lasting >200 ms are still suppressed

*Implementation tip*: After enabling the first service, attempt to enable the second via UI Automator; assert that a dialog with ID android:id/alertTitle contains the warning text and that the second service’s toggle remains OFF.

#### 3.3 Persistence after crash

#SettingCrash scenarioExpected recoveryPass criteria
22Font sizeKill settings process while slider mid‑dragOn relaunch, slider returns to last valid value (not the intermediate drag)settings get accessibility font_scale matches pre‑crash value
23TalkBackForce‑stop TalkBack service via adb shell am force-stop com.google.android.marvin.talkbackTalkBack toggle stays ON; service restarts automatically within 2 sdumpsys accessibility shows TalkBack bound again
24Mono audioSystemServer crash (simulated with kill -9 )On reboot, mono audio setting restoredsettings get accessibility mono_audio returns 1

*Implementation tip*: Use adb shell am kill com.android.settings to crash the settings UI, then restart and verify via settings get.

---

4. Edge/Boundary Cases

Boundary testing exposes off‑by‑one errors, overflow conditions, and rare interaction combos that only surface under stress or specific device states.

#### 4.1 Minimum and maximum limits

#SettingMin valueMax valueTestPass criteria
25Font size50 %300 %Set to 50 % then 300 %Text remains readable; no overflow or clipping
26Gesture sensitivity1 (lowest)10 (highest)Set to 1, perform a swipe; set to 10, perform a tapLow sensitivity ignores short swipes; high sensitivity registers taps as gestures
27Audio balance-100+100Set to -100, play stereo test tone; set to +100Audio heard only on left/right channel respectively; no crosstalk >‑30 dB

*Implementation tip*: Use adb shell media volume --stream 3 --set to verify channel output programmatically.

#### 4.2 Rapid toggling

#SettingActionExpected resultPass criteria
28TalkBackToggle ON/OFF 10 times in 2 s via UI AutomatorService starts/stops each time; no leaked bound connectionsdumpsys accessibility shows service count fluctuating between 0 and 1; no “Service leaked” logs
29Color inversionRapid toggle 20 timesUI updates each time; no screen flicker >2 framesFrame capture via adb shell screencap -p shows consistent inversion state
30Mono audioToggle 15 times while music playsAudio switches mono/stereo instantly; no audible popAudio waveform analysis shows immediate channel mixing change

*Implementation tip*: Use a loop in a Python script with uiautomator2 to perform rapid clicks and monitor logcat for AudioFlinger warnings.

#### 4.3 Multi‑language and locale

#SettingLocale changeExpected resultPass criteria
31Preferred spoken languageSwitch device locale to ja_JP while TalkBack uses en_USTalkBack continues to speak in en_US unless language setting changedTextToSpeech.getLanguage() unchanged until user updates language
32Date format (accessibility clock)Change locale to ar_EGClock reads right‑to‑left; numbers use Arabic-Indic digitsUI layout direction getLayoutDirection() = RIGHT_TO_LEFT; numbers rendered with Unicode Arabic-Indic range

*Implementation tip*: Change locale via adb shell setprop persist.sys.language ja; adb shell setprop persist.sys.country JP; stop && start then verify TalkBack language.

#### 4.4 Screen reader state interaction

#SettingScreen reader stateExpected resultPass criteria
33Reduce motionTalkBack ONAnimations tied to accessibility events (e.g., menu open) are still suppressedAnimatorSet.getDuration() returns 0 for accessibility‑triggered animations
34Show accessibility buttonTalkBack OFFAccessibility button appears in navigation bar; long‑press launches TalkBackButton visible; KeyEvent long press triggers service start
35Touch explorationTalkBack ON, touch exploration disabledSingle tap activates item; double tap required to perform actionAccessibilityEvent.TYPE_VIEW_CLICKED fired on single tap; TYPE_VIEW_LONG_CLICKED on double tap

*Implementation tip*: Use AccessibilityEventRecorder to capture event types and assert correct mapping.

---

5. Accessibility‑Specific Checks

These items verify that the settings UI itself conforms to accessibility guidelines and that changes propagate correctly to assistive technologies.

#### 5.1 Screen reader announcements

#SettingActionExpected announcementPass criteria
36Font size sliderFocus slider, change value“Font size, adjustable, currently 120 percent”AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED contains the spoken string
37TalkBack toggleFocus switch“TalkBack, switch, off” (or on)Announcement includes state and role
38Color inversionFocus toggle“Color inversion, switch, off”Same as above

*Implementation tip*: Register an AccessibilityService that logs event.text.toString() and compare against expected pattern.

#### 5.2 Focus order and navigation

#SettingNavigation patternExpected focus flowPass criteria
39Settings listSwipe down/up with TalkBackFocus moves sequentially through each setting item; no skipped itemsAccessibilityEvent.TYPE_VIEW_FOCUSED follows adapter order
40Dialog with Apply/CancelTab navigation (Switch Access)Focus lands on Apply first, then Cancel, then closes dialogOrder matches logical grouping; escape closes dialog
41Nested sub‑screenBack gestureFocus returns to parent screen’s last focused itemFocus restoration verified via AccessibilityNodeInfo.getSource()

*Implementation tip*: Use UI Automator to perform swipe gestures and assert that the focused view’s contentDescription matches the expected item.

#### 5.3 Contrast and touch target size

#SettingCheckMethodPass criteria
42Toggle switchMinimum contrast 4.5:1 (AA)Use Android’s ContrastChecker on switch thumb vs trackComputed contrast ≥4.5
43Slider thumbTouch target ≥48 dpMeasure thumb bounds via getBounds()Width and height ≥48 dp
44Dialog buttonTouch target ≥48 dp, contrast ≥3:1 (large text)Same as aboveBoth criteria satisfied

*Implementation tip*: Pull the rendered view hierarchy with adb shell uiautomator dump and parse the XML for bounds and alpha to compute contrast using WCAG formula.

#### 5.4 Voice control integration

#SettingVoice commandExpected outcomePass criteria
45TalkBack toggle“Turn on TalkBack”TalkBack service startsdumpsys accessibility shows TalkBack enabled
46Font size“Set font size to 150 percent”Slider moves to 150 %settings get accessibility font_scale returns 150
47Color inversion“Enable color inversion”Toggle switches ONsettings get accessibility color_inversion returns 1

*Implementation tip*: Use Google’s Voice Access test harness (adb shell am start -n com.google.android.apps.accessibilityvoice/.VoiceAccessTestActivity) to issue commands and verify results.

#### 5.5 Dynamic type and font scaling

#SettingActionExpected resultPass criteria
48Font sizeSet to 200 %All system fonts scale; custom apps using sp units scale accordinglyResources.getConfiguration().fontScale = 2.0
49Bold textEnableText weight increases without changing sizePaint.getFakeBoldText() = true; visual weight heavier
50High contrast textEnableText color shifts to black/white; contrast ratio ≥7:1Contrast measurement passes AAA threshold

*Implementation tip*: Use adb shell settings put system font_scale 2.0 then launch an app and measure text height via View.getHeight().

#### 5.6 Reduced motion and animation duration

#SettingActionExpected resultPass criteria
51Reduce motionEnableAll property animations duration set to 0 ms; transitions use fadeAnimatorSet.getDuration() returns 0 for accessibility‑triggered anims
52Animator duration scaleSet to 0.5× while reduce motion ONNo effect; animations still 0 msSame as above
53Disable reduce motionDisableAnimations restore to system scaleDuration matches AnimatorDurationScale setting

*Implementation tip*: Use adb shell settings get global animator_duration_scale and adb shell settings get accessibility reduce_motion to verify; then trigger a menu open and measure frame timestamps with SurfaceFlinger trace.

#### 5.7 Captions and audio descriptions

#SettingActionExpected resultPass criteria
54Caption preferencesSet font size to 24 dp, color yellowVideo player captions reflect changesMediaPlayer’s TextView caption shows 24 dp, #FFFF00
55Audio descriptionEnableDescriptive narration track plays during video gapsAudioFocus request for DESCRIPTION channel; audible narration
56Mono audio + captionEnable bothCaption unaffected; audio mixed to monoVerify audio channels merged; caption unchanged

*Implementation tip*: Use ExoPlayer test app to load a video with side‑car caption file and audio description track; assert caption formatting via ClosedCaptionListener.

---

6. Security and Privacy Considerations

Accessibility settings can inadvertently expose personal data or weaken device security if not properly guarded.

#### 6.1 Data leakage via settings

#SettingRiskTestPass criteria
57Accessibility shortcutShortcut may reveal pattern to onlookersObserve shoulder‑surfing while setting shortcut; ensure no visual feedback shows the key comboNo toast or popup displays the actual key sequence
58Voice command historyStored voice inputs could be persistedCheck /data/misc/voice for logs after issuing voice commandsNo persistent audio files; only transient buffers
59Debug bridge accessEnabling USB debugging via accessibility serviceAttempt to toggle ADB via TalkBack gesturesSystem blocks ADB toggle unless developer options already enabled; logs show security exception

*Implementation tip*: Use adb shell run-as com.android.settings cat /data/misc/voice/log to verify absence of persisted voice data.

#### 6.2 Permission escalation

#SettingAttempted escalationExpected blockPass criteria
60Toggle TalkBack via SettingsUse accessibility service to grant itself SYSTEM_ALERT_WINDOWSystem denies; service cannot add overlay without explicit user grantAppOpsManager.checkOp() returns MODE_ERRORED for overlay
61Change font size via accessibility serviceTry to read Settings.Secure values for other usersAccess restricted to calling user’s own settings service onlySecurityException thrown when attempting to read another user’s settings
62Enable mono audio via intentSend broadcast to change setting without permissionBroadcast ignored unless holder of android.permission.WRITE_SETTINGSIntent resolution fails with PermissionDenial

*Implementation tip*: Use adb shell appops set SYSTEM_ALERT_WINDOW ignore then try to add a window via accessibility service; assert that WindowManager.addView() throws SecurityException.

#### 6.3 Backup and restore

#SettingBackup scenarioExpected resultPass criteria
63Font sizeEnable local backup, change size, trigger backup, wipe device, restoreRestored device applies same font sizesettings get accessibility font_scale matches pre‑wipe value
64TalkBackExclude TalkBack from backup (user choice)After restore, TalkBack remains OFF even if it was ON before backupdumpsys accessibility shows TalkBack disabled
65Color inversionBackup encrypted with PIN; restore without PINRestoration fails; user prompted for PINBackup restore activity shows authentication dialog

*Implementation tip*: Use adb shell bmgr backupnow com.android.settings then adb shell bmgr restore and verify via settings get.

---

7. Performance and Resource Impact

Changing accessibility settings should not introduce perceptible lag, excessive battery drain, or memory leaks.

#### 7.1 Launch latency

#SettingActionMeasurement methodPass criteria
66Font sizeChange from 100 % → 200 %Record time between Apply click and first frame rendered with new size using adb shell am start -W<150 ms increase over baseline
67TalkBackEnable TalkBackMeasure time to first spoken feedback after toggle<200 ms from toggle to first utterance
68Color inversionToggle ONCapture framebuffer timestamp before and after toggle<100 ms delay; no dropped frames

*Implementation tip*: Use adb shell am start -W -n com.android.settings/.Settings$AccessibilitySettingsActivity to get TotalTime; subtract baseline from a neutral setting change.

#### 7.2 Memory footprint

#SettingActionTracking methodPass criteria
69TalkBackEnable, navigate 20 screens, disableUse adb shell dumpsys meminfo before/afterHeap increase <5 MB; returns to baseline after disable
70Font sizeSet to 300 %Measure memory usage of system UI (SystemUI)No unbounded growth; GC runs within normal intervals
71Color inversionKeep ON for 30 minMonitor meminfo for leaks in SurfaceFlingerHeap stable; no continuous climb

*Implementation tip*: Script a loop that toggles the setting, forces GC (adb shell cmd activity force-stop com.android.systemui && am startservice -n com.android.systemui/.SystemUIService), then captures meminfo.

#### 7.3 Battery impact

#SettingActionMeasurementPass criteria
72TalkBackEnable, run script that navigates 100 screensUse adb shell dumpsys batterystats --charged Estimated mAh increase <2 % over baseline per hour
73Color inversionKeep ON while playing video 1 hSame batterystatsNo significant deviation; inversion is GPU‑shader based, cost <1 %
74Reduce motionEnable, run animation‑heavy appBatterystatsAnimation duration set to 0 reduces GPU work; measured mAh drop <1 %

*Implementation tip*: After each test, run adb shell battery reset to clear stats, then run the scenario and capture batterystats.

#### 7.4 UI jank and frame drops

#SettingActionToolPass criteria
75Font sizeRapidly scroll a list with 500 itemsadb shell gfxinfo framestats95th‑percentile frame time <16 ms (60 fps)
76TalkBackNavigate via swipe gesturesSame as aboveNo frames >50 ms; occasional spikes allowed only during speech start
77Color inversionToggle while animatingSameNo dropped frames >2 frames during toggle

*Implementation tip*: Use adb shell gfxinfo reset before scenario, then adb shell gfxinfo print after; parse jank count.

---

8. Release Readiness and Automation

A settings release must pass regression checks, be CI‑friendly, and benefit from autonomous exploration that can exercise most of the checklist in a single pass.

#### 8.1 Regression test matrix

Test areaManual stepsAutomated (Espresso/UI Automator)Autonomous (SUSA)Frequency
Happy‑path togglesTap each switch, verify stateonView(withId(...)).perform(click()); assert service stateSUSA explores all switches in one session, logs state changesEvery commit
Slider boundsDrag to min/max, verify valueUiObject2.setText() or dragTo(); read settingSUSA tries min, mid, max values for each sliderNightly
Error handlingEnter invalid text, check toastperform(replaceText("0, assert errorSame as manual, plus Espresso onView(withText(...))SUSA injects random strings, out‑of‑range numbers via accessibility servicePre‑release
Conflict detectionEnable two mutually exclusive services, observe warningProgrammatically enable first, then second; assert dialogSUSA attempts to enable TalkBack then Switch Access; validates warningWeekly
Persistence after crashKill settings, relaunch, verify valueadb shell am kill com.android.settings; settings getSUSA kills settings mid‑change, restarts, checks valueEvery build
PerformanceMeasure frame time, batterystatsUse adb shell gfxinfo and batterystats scriptsSUSA runs a preset navigation script while toggling each setting, collects metricsRelease candidate
Security/privacyAttempt permission bypass via serviceUse adb shell appops to test blocked opsSUSA runs a malicious‑persona script that tries to read other users’ settingsWeekly
Accessibility UIVerify announcements, contrast, touch targetCustom AccessibilityService logs events; use AndroidX Test for contrastSUSA’s explorer includes a persona with TalkBack enabled; validates announcements and contrastEvery commit

*Key*: The “Autonomous (SUSA)” column shows how SUSA’s built‑in explorer can cover many items without writing test code.

#### 8.2 Using SUSA for autonomous exploration

SUSA operates by installing an agent (pip install susatest-agent) and pointing it at the APK or a URL. The agent creates a virtual user with a selected persona, then performs taps, scrolls, text entry, and dialog handling while observing the app’s reactions. For accessibility settings testing, a typical invocation looks like:


# Install the agent (once)
pip install susatest-agent

# Run a session with the “accessibility” persona targeting the settings APK
susatest run \
    --apk path/to/Settings.apk \
    --persona accessibility \
    --output-dir ./susa-reports/settings \
    --max-steps 5000 \
    --enable-logging

During the run, SUSA:

Because the agent remembers visited screens and dead ends, subsequent runs become smarter: it skips already‑verified happy‑path steps and focuses on edge cases that previously caused failures. This reduces manual test maintenance while still delivering high coverage.

#### 8.3 Checklist for release sign‑off

Before promoting a build to production, verify the following items (✓ = required):

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