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
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:
| Persona | Primary interaction style | Typical setting changes |
|---|---|---|
| Curious | Explores every toggle, reads descriptions | Enters deep menus, tries undocumented combos |
| Impatient | Uses quick‑settings, expects immediate effect | Taps apply without reading warnings |
| Novice | Relies on defaults, needs clear labels | Avoids advanced options, may miss save button |
| Adversarial | Attempts to break validation | Enters out‑of‑range values, injects scripts |
| Elderly | Prefers large text, high contrast, reduced motion | Increases font size, enables grayscale |
| Accessibility | Relies on screen reader, switch control, voice | Verifies announcements, focus order |
| Power user | Scripts settings via ADB or CLI, profiles | Applies batch changes, restores backups |
| Privacy‑conscious | Audits logging, data sharing, permission prompts | Disables 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)
| # | Setting | Action | Expected result | Pass criteria |
|---|---|---|---|---|
| 1 | TalkBack (screen reader) | Toggle ON → OFF → ON | TalkBack starts/stops instantly; accessibility service bound/unbound | Service appears in adb shell dumpsys accessibility; no delay >200 ms |
| 2 | Color inversion | Toggle ON | UI colors invert immediately; contrast ratio ≥4.5:1 for all text | Screenshot comparison shows inverted palette; no flicker |
| 3 | Mono audio | Toggle ON | Audio output merges left/right channels; volume unchanged | media 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
| # | Setting | Action | Expected result | Pass criteria |
|---|---|---|---|---|
| 4 | Font size | Drag from 80 % → 120 % → 200 % | Text scales proportionally; layout does not truncate | All visible TextViews report getTextSize() matching selected %; no clipping |
| 5 | Audio balance | Move slider to -100 % (left) → 0 % → +100 % (right) | Left/right gain changes linearly; center at 0 % | AudioManager.getStreamVolume() shows correct channel balance |
| 6 | Gesture sensitivity | Set to minimum, maximum, then middle | Gesture recognizer thresholds adjust; no false positives | Record 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
| # | Setting | Action | Expected result | Pass criteria |
|---|---|---|---|---|
| 7 | Preferred spoken language | Select “Spanish (Spain)” | System TTS voice switches to es‑ES; subsequent announcements use that voice | TextToSpeech.getLanguage() returns Locale(“es”, “ES”) |
| 8 | Notification style | Choose “Banners” → “Pop‑up” → “None” | Notification appearance changes accordingly; no duplicate alerts | Observe status bar; verify NotificationListenerService receives correct priority |
| 9 | Zoom type | Pick “Full screen” → “Window” → “Magnifier window” | Magnification mode changes instantly; focus follows zoom | AccessibilityManager.isMagnificationEnabled() reflects selection; no lag >150 ms |
#### 2.4 Text fields and custom inputs
| # | Setting | Action | Expected result | Pass criteria |
|---|---|---|---|---|
| 10 | Custom vibration pattern | Enter “200,100,200” (ms) | Device vibrates with the pattern on test trigger | VibrationEffect.createWaveform() matches input; no crash |
| 11 | Accessibility shortcut | Type “power+volup” | Long‑press power + volume up launches TalkBack | KeyEvent sequence triggers accessibility service start |
| 12 | Label edit for custom action | Rename “Launch camera” to “Open cam” | New label appears in accessibility actions menu | AccessibilityNodeInfo.getActionLabel() returns updated string |
#### 2.5 Save/Apply and persistence
| # | Setting | Action | Expected result | Pass criteria |
|---|---|---|---|---|
| 13 | Apply button | Change font size, tap Apply, exit settings | New size persists after returning to home screen | Home screen launcher text reflects new size |
| 14 | Auto‑save | Toggle TalkBack ON, navigate away without pressing Save | Setting persists (implicit auto‑save) | Same as #13 |
| 15 | Reset to defaults | Press “Reset all accessibility settings” | All toggles revert to factory defaults; custom values cleared | Verify 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
| # | Setting | Invalid input | Expected feedback | Pass criteria |
|---|---|---|---|---|
| 16 | Font size | “0 %” (below minimum) | Inline error: “Value must be between 50 % and 300 %” | Toast or Snackbar appears; setting unchanged |
| 17 | Audio balance | “150” (beyond ±100) | Dialog: “Please enter a number between -100 and 100” | Input rejected; slider stays at previous value |
| 18 | Vibration 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
| # | Conflict | Trigger | Expected system response | Pass criteria |
|---|---|---|---|---|
| 19 | TalkBack + Switch Access | Enable both simultaneously | System shows warning: “Only one accessibility service can receive touch events at a time”; one service auto‑disables | Exactly one service remains enabled after warning dismissal |
| 20 | High contrast text + Color inversion | Enable both | System applies inversion first, then contrast; no visual glitch | Screenshot shows legible text; contrast ratio ≥7:1 |
| 21 | Reduce motion + Animator duration scale | Set reduce motion ON, then animator scale to 10× | System ignores animator scale for accessibility‑related animations | Animations 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
| # | Setting | Crash scenario | Expected recovery | Pass criteria |
|---|---|---|---|---|
| 22 | Font size | Kill settings process while slider mid‑drag | On relaunch, slider returns to last valid value (not the intermediate drag) | settings get accessibility font_scale matches pre‑crash value |
| 23 | TalkBack | Force‑stop TalkBack service via adb shell am force-stop com.google.android.marvin.talkback | TalkBack toggle stays ON; service restarts automatically within 2 s | dumpsys accessibility shows TalkBack bound again |
| 24 | Mono audio | SystemServer crash (simulated with kill -9 ) | On reboot, mono audio setting restored | settings 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
| # | Setting | Min value | Max value | Test | Pass criteria |
|---|---|---|---|---|---|
| 25 | Font size | 50 % | 300 % | Set to 50 % then 300 % | Text remains readable; no overflow or clipping |
| 26 | Gesture sensitivity | 1 (lowest) | 10 (highest) | Set to 1, perform a swipe; set to 10, perform a tap | Low sensitivity ignores short swipes; high sensitivity registers taps as gestures |
| 27 | Audio balance | -100 | +100 | Set to -100, play stereo test tone; set to +100 | Audio 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
| # | Setting | Action | Expected result | Pass criteria |
|---|---|---|---|---|
| 28 | TalkBack | Toggle ON/OFF 10 times in 2 s via UI Automator | Service starts/stops each time; no leaked bound connections | dumpsys accessibility shows service count fluctuating between 0 and 1; no “Service leaked” logs |
| 29 | Color inversion | Rapid toggle 20 times | UI updates each time; no screen flicker >2 frames | Frame capture via adb shell screencap -p shows consistent inversion state |
| 30 | Mono audio | Toggle 15 times while music plays | Audio switches mono/stereo instantly; no audible pop | Audio 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
| # | Setting | Locale change | Expected result | Pass criteria |
|---|---|---|---|---|
| 31 | Preferred spoken language | Switch device locale to ja_JP while TalkBack uses en_US | TalkBack continues to speak in en_US unless language setting changed | TextToSpeech.getLanguage() unchanged until user updates language |
| 32 | Date format (accessibility clock) | Change locale to ar_EG | Clock reads right‑to‑left; numbers use Arabic-Indic digits | UI 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
| # | Setting | Screen reader state | Expected result | Pass criteria |
|---|---|---|---|---|
| 33 | Reduce motion | TalkBack ON | Animations tied to accessibility events (e.g., menu open) are still suppressed | AnimatorSet.getDuration() returns 0 for accessibility‑triggered animations |
| 34 | Show accessibility button | TalkBack OFF | Accessibility button appears in navigation bar; long‑press launches TalkBack | Button visible; KeyEvent long press triggers service start |
| 35 | Touch exploration | TalkBack ON, touch exploration disabled | Single tap activates item; double tap required to perform action | AccessibilityEvent.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
| # | Setting | Action | Expected announcement | Pass criteria |
|---|---|---|---|---|
| 36 | Font size slider | Focus slider, change value | “Font size, adjustable, currently 120 percent” | AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED contains the spoken string |
| 37 | TalkBack toggle | Focus switch | “TalkBack, switch, off” (or on) | Announcement includes state and role |
| 38 | Color inversion | Focus 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
| # | Setting | Navigation pattern | Expected focus flow | Pass criteria |
|---|---|---|---|---|
| 39 | Settings list | Swipe down/up with TalkBack | Focus moves sequentially through each setting item; no skipped items | AccessibilityEvent.TYPE_VIEW_FOCUSED follows adapter order |
| 40 | Dialog with Apply/Cancel | Tab navigation (Switch Access) | Focus lands on Apply first, then Cancel, then closes dialog | Order matches logical grouping; escape closes dialog |
| 41 | Nested sub‑screen | Back gesture | Focus returns to parent screen’s last focused item | Focus 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
| # | Setting | Check | Method | Pass criteria |
|---|---|---|---|---|
| 42 | Toggle switch | Minimum contrast 4.5:1 (AA) | Use Android’s ContrastChecker on switch thumb vs track | Computed contrast ≥4.5 |
| 43 | Slider thumb | Touch target ≥48 dp | Measure thumb bounds via getBounds() | Width and height ≥48 dp |
| 44 | Dialog button | Touch target ≥48 dp, contrast ≥3:1 (large text) | Same as above | Both 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
| # | Setting | Voice command | Expected outcome | Pass criteria |
|---|---|---|---|---|
| 45 | TalkBack toggle | “Turn on TalkBack” | TalkBack service starts | dumpsys accessibility shows TalkBack enabled |
| 46 | Font size | “Set font size to 150 percent” | Slider moves to 150 % | settings get accessibility font_scale returns 150 |
| 47 | Color inversion | “Enable color inversion” | Toggle switches ON | settings 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
| # | Setting | Action | Expected result | Pass criteria |
|---|---|---|---|---|
| 48 | Font size | Set to 200 % | All system fonts scale; custom apps using sp units scale accordingly | Resources.getConfiguration().fontScale = 2.0 |
| 49 | Bold text | Enable | Text weight increases without changing size | Paint.getFakeBoldText() = true; visual weight heavier |
| 50 | High contrast text | Enable | Text color shifts to black/white; contrast ratio ≥7:1 | Contrast 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
| # | Setting | Action | Expected result | Pass criteria |
|---|---|---|---|---|
| 51 | Reduce motion | Enable | All property animations duration set to 0 ms; transitions use fade | AnimatorSet.getDuration() returns 0 for accessibility‑triggered anims |
| 52 | Animator duration scale | Set to 0.5× while reduce motion ON | No effect; animations still 0 ms | Same as above |
| 53 | Disable reduce motion | Disable | Animations restore to system scale | Duration 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
| # | Setting | Action | Expected result | Pass criteria |
|---|---|---|---|---|
| 54 | Caption preferences | Set font size to 24 dp, color yellow | Video player captions reflect changes | MediaPlayer’s TextView caption shows 24 dp, #FFFF00 |
| 55 | Audio description | Enable | Descriptive narration track plays during video gaps | AudioFocus request for DESCRIPTION channel; audible narration |
| 56 | Mono audio + caption | Enable both | Caption unaffected; audio mixed to mono | Verify 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
| # | Setting | Risk | Test | Pass criteria |
|---|---|---|---|---|
| 57 | Accessibility shortcut | Shortcut may reveal pattern to onlookers | Observe shoulder‑surfing while setting shortcut; ensure no visual feedback shows the key combo | No toast or popup displays the actual key sequence |
| 58 | Voice command history | Stored voice inputs could be persisted | Check /data/misc/voice for logs after issuing voice commands | No persistent audio files; only transient buffers |
| 59 | Debug bridge access | Enabling USB debugging via accessibility service | Attempt to toggle ADB via TalkBack gestures | System 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
| # | Setting | Attempted escalation | Expected block | Pass criteria |
|---|---|---|---|---|
| 60 | Toggle TalkBack via Settings | Use accessibility service to grant itself SYSTEM_ALERT_WINDOW | System denies; service cannot add overlay without explicit user grant | AppOpsManager.checkOp() returns MODE_ERRORED for overlay |
| 61 | Change font size via accessibility service | Try to read Settings.Secure values for other users | Access restricted to calling user’s own settings service only | SecurityException thrown when attempting to read another user’s settings |
| 62 | Enable mono audio via intent | Send broadcast to change setting without permission | Broadcast ignored unless holder of android.permission.WRITE_SETTINGS | Intent resolution fails with PermissionDenial |
*Implementation tip*: Use adb shell appops set then try to add a window via accessibility service; assert that WindowManager.addView() throws SecurityException.
#### 6.3 Backup and restore
| # | Setting | Backup scenario | Expected result | Pass criteria |
|---|---|---|---|---|
| 63 | Font size | Enable local backup, change size, trigger backup, wipe device, restore | Restored device applies same font size | settings get accessibility font_scale matches pre‑wipe value |
| 64 | TalkBack | Exclude TalkBack from backup (user choice) | After restore, TalkBack remains OFF even if it was ON before backup | dumpsys accessibility shows TalkBack disabled |
| 65 | Color inversion | Backup encrypted with PIN; restore without PIN | Restoration fails; user prompted for PIN | Backup 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
| # | Setting | Action | Measurement method | Pass criteria |
|---|---|---|---|---|
| 66 | Font size | Change 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 |
| 67 | TalkBack | Enable TalkBack | Measure time to first spoken feedback after toggle | <200 ms from toggle to first utterance |
| 68 | Color inversion | Toggle ON | Capture 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
| # | Setting | Action | Tracking method | Pass criteria |
|---|---|---|---|---|
| 69 | TalkBack | Enable, navigate 20 screens, disable | Use adb shell dumpsys meminfo before/after | Heap increase <5 MB; returns to baseline after disable |
| 70 | Font size | Set to 300 % | Measure memory usage of system UI (SystemUI) | No unbounded growth; GC runs within normal intervals |
| 71 | Color inversion | Keep ON for 30 min | Monitor meminfo for leaks in SurfaceFlinger | Heap 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
| # | Setting | Action | Measurement | Pass criteria |
|---|---|---|---|---|
| 72 | TalkBack | Enable, run script that navigates 100 screens | Use adb shell dumpsys batterystats --charged | Estimated mAh increase <2 % over baseline per hour |
| 73 | Color inversion | Keep ON while playing video 1 h | Same batterystats | No significant deviation; inversion is GPU‑shader based, cost <1 % |
| 74 | Reduce motion | Enable, run animation‑heavy app | Batterystats | Animation 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
| # | Setting | Action | Tool | Pass criteria |
|---|---|---|---|---|
| 75 | Font size | Rapidly scroll a list with 500 items | adb shell gfxinfo | 95th‑percentile frame time <16 ms (60 fps) |
| 76 | TalkBack | Navigate via swipe gestures | Same as above | No frames >50 ms; occasional spikes allowed only during speech start |
| 77 | Color inversion | Toggle while animating | Same | No 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 area | Manual steps | Automated (Espresso/UI Automator) | Autonomous (SUSA) | Frequency | |
|---|---|---|---|---|---|
| Happy‑path toggles | Tap each switch, verify state | onView(withId(...)).perform(click()); assert service state | SUSA explores all switches in one session, logs state changes | Every commit | |
| Slider bounds | Drag to min/max, verify value | UiObject2.setText() or dragTo(); read setting | SUSA tries min, mid, max values for each slider | Nightly | |
| Error handling | Enter invalid text, check toast | perform(replaceText("0, assert error | Same as manual, plus Espresso onView(withText(...)) | SUSA injects random strings, out‑of‑range numbers via accessibility service | Pre‑release |
| Conflict detection | Enable two mutually exclusive services, observe warning | Programmatically enable first, then second; assert dialog | SUSA attempts to enable TalkBack then Switch Access; validates warning | Weekly | |
| Persistence after crash | Kill settings, relaunch, verify value | adb shell am kill com.android.settings; settings get | SUSA kills settings mid‑change, restarts, checks value | Every build | |
| Performance | Measure frame time, batterystats | Use adb shell gfxinfo and batterystats scripts | SUSA runs a preset navigation script while toggling each setting, collects metrics | Release candidate | |
| Security/privacy | Attempt permission bypass via service | Use adb shell appops to test blocked ops | SUSA runs a malicious‑persona script that tries to read other users’ settings | Weekly | |
| Accessibility UI | Verify announcements, contrast, touch target | Custom AccessibilityService logs events; use AndroidX Test for contrast | SUSA’s explorer includes a persona with TalkBack enabled; validates announcements and contrast | Every 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:
- Toggles every switch it encounters, logging the resulting service state via
dumpsys accessibility. - Attempts to set sliders to their minimum, midpoint, and maximum values by sending
setTextor drag gestures where the UI exposes an editable field. - Enters random strings into text fields, checks for error Toasts, and verifies that the setting remains unchanged.
- Triggers known conflict combos (e.g., enabling TalkBack then Switch Access) and asserts that a warning dialog appears.
- Simulates a crash by issuing
adb shell am kill com.android.settingsmid‑operation and then checks that the setting reverts to the last valid value after the agent restarts the session. - Collects performance metrics (frame times, battery usage) via integrated
adb shell gfxinfoandbatterystatscalls.
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):
- [x] All happy‑path toggles, sliders, and pickers change the underlying setting and persist after a settings process kill.
- [x] Invalid inputs produce clear, localized error messages and leave the setting unchanged.
- [x] Mutually exclusive accessibility services cannot be active simultaneously; a warning dialog appears and one service is disabled.
- [x] After a forced crash or device reboot, each setting returns to the last valid, user‑selected value.
- [x] Screen reader announcements for every focusable element match the expected pattern (role, state, value).
- [x] Contrast ratios for all controls meet WCAG 2.2 AA (4.5:1 for normal text, 3:1 for large text).
- [x] Touch targets are ≥48 dp; measurable via UI Automator bounds extraction.
- [x] Voice commands (“Turn on TalkBack”, “Set font size to 150 %”) execute correctly and produce the expected system state.
- [x] No persistent logs or files are created that could expose personal data (voice history, shortcut patterns).
- [x] Attempted privilege escalations via accessibility services
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