Mobile Testing: A Practical Guide
Mobile testing is the testing of applications that run on phones and tablets — native apps, cross-platform and hybrid apps, mobile websites and progressive web apps. The functional questions are the same as anywhere else; what changes is everything around them: thousands of device and OS combinations, a network that comes and goes, a user who is interrupted every few minutes, an operating system that may kill the app in the background, and permissions the user can withdraw at any time.
This pillar maps the whole domain: what makes mobile different, how to choose devices, which risks deserve a test, how the back end, accessibility and security apply to apps, which platform guidelines to hold an app against, and where automation and release gates fit. Two deeper guides hang from it — a catalogue of mobile app test scenarios (lifecycle, permissions, interruptions, networks, resources, push notifications) and an explainer on mobile test automation with Appium, Espresso and XCUITest.
What makes mobile testing different
A web application runs in browsers the team can list, over a network the team can mostly assume. A mobile app runs on hardware the team does not control, under an operating system that manages its life: the OS decides when the app is paused, when it is killed to free memory, when it may use the network in the background and which data it may read. The ISTQB Mobile Application Testing syllabus (CT-MAT) treats these as the specific challenges of mobile: device and platform diversity, connectivity, limited resources, and the ways people use a device they carry everywhere.
In ISO/IEC 25010 terms, mobile raises the weight of compatibility (co-existing with other apps and the OS), reliability under interruption, performance efficiency (battery, memory, data), interaction capability (small screens, touch, one-handed use) and security (a device that can be lost, shared or rooted). A mobile test strategy should say how each of these is covered, not only whether the features work.
- Context changes constantly — network, location, orientation, battery level, foreground or background.
- The OS owns the lifecycle — the app must restore the user’s state after being killed, not only after being paused.
- Users run old versions — unlike a website, you cannot force everyone onto the latest build, so the back end serves several app versions at once.
- Distribution is gated — releases go through store review and staged rollouts, so a production defect takes longer to fix than on the web.
- Input is different — touch, gestures, on-screen keyboards, voice input, and assistive technologies such as TalkBack and VoiceOver.
Native, cross-platform, hybrid, mobile web and PWA
The type of app decides which risks exist and which tools can reach the UI. Know which one you are testing — and, for a hybrid app, which screens are native and which are web — before you plan anything.
- Native apps — written for one platform with its own SDK (Kotlin or Java on Android, Swift or Objective-C on iOS). They have full access to device features, and the platform test frameworks (Espresso, XCUITest) work directly. Treat each platform as a separate product that shares requirements.
- Cross-platform apps — one codebase built for both platforms (for example with React Native or Flutter). Business logic is shared, but rendering, permissions, keyboards and platform integrations still differ, so each platform needs its own UI pass.
- Hybrid apps — a native shell that hosts web content in a WebView. Test the seam: navigation between native and web screens, session and cookie sharing, the back button, file upload and camera access from web content, and what the user sees when the web content fails to load.
- Mobile web — a website used in a mobile browser. Check responsive layout, touch targets, viewport and zoom, the on-screen keyboard covering fields, and differences between mobile browser engines. The user-agent strings in your analytics show which browsers real users bring; many browsers now reduce or freeze the OS version and device model in that string (Chrome on Android, for example), so take OS versions and device models from User-Agent Client Hints or your app analytics SDK.
- Progressive web apps (PWAs) — web apps with a web app manifest and a service worker, installable to the home screen and able to work offline. Test installability, offline behaviour, cache updates (does a new release replace the cached one?) and push notifications where the platform supports web push for installed web apps.
Device fragmentation, OS versions and screens
Fragmentation is the number of distinct environments your app must work in. On Android it comes from many manufacturers, each with its own customised system layer, many OS versions in use at the same time, and a wide range of screen sizes, densities and hardware. On iOS the device range is narrower, but several iOS versions and screen sizes are live at once, plus iPads with split-screen multitasking. Foldables and tablets add screens that change size while the app is running.
OS version differences matter because platforms change behaviour between releases: the permission model, background execution limits, notification rules and privacy features. An app that was correct on last year’s OS can fail on this year’s without a single line of its own code changing. Read each new OS version’s behaviour-change notes and turn every item that touches your app into a test — and run your regression suite on the OS beta before it reaches users.
- Screen size and aspect ratio — small phones, tall phones, tablets, foldables folded and unfolded, split-screen and multi-window.
- Density — layouts use density-independent units (dp on Android, points on iOS); check images for blurriness and text for clipping at low and high densities.
- Cut-outs and system bars — content hidden under the status bar, a camera cut-out or the home indicator.
- Orientation — portrait, landscape and the rotation itself: does the screen keep its state and the user’s input? WCAG 2.2 success criterion 1.3.4 Orientation requires that content is not restricted to one orientation unless that orientation is essential.
- Responsive behaviour — for mobile web and PWAs, check breakpoints, the viewport, horizontal scrolling and zoom; for apps, check that layouts adapt rather than stretch.
- Manufacturer layers — aggressive battery optimisation, custom permission screens and modified system dialogs on some Android devices.
Device strategy: emulators, real devices and device farms
No team can test on every device, so the device strategy is a risk decision. It answers three questions: which environments matter (from data, not opinion), which kind of device each test needs, and how often each combination is exercised.
Android emulators and iOS simulators are fast, free and scriptable — ideal for development and CI. They do not reproduce everything: real performance and thermal behaviour, battery drain, camera and sensors, biometric hardware, cellular networks, manufacturer customisations and parts of the push-notification path. An iOS simulator is not an emulator at all: it runs an app built for the host computer, so it is even further from real device hardware. Real devices are needed before release for performance, battery, camera, Bluetooth, NFC, payments, biometrics and anything that touches the manufacturer layer. Cloud device farms rent real devices (and emulators) remotely for automated suites or manual sessions — breadth without buying and maintaining a lab.
Build the device matrix from your own analytics: list OS versions, device models, screen classes and, for mobile web, browsers by share of active users. Cover the devices that carry most of your traffic, the oldest OS version you still support, the newest OS version (and its beta), one small and one large screen, and any device family that has produced incidents. Then combine the remaining parameters — language, orientation, network, font size — with pairwise selection instead of the full cross-product.
Example device matrix (illustrative; build yours from your analytics)
Tier 1 — every release, real devices
Android latest · Samsung mid-range · 6.4" · ar-SA · 4G (largest share of sessions)
iOS latest · iPhone standard · 6.1" · ar-SA · Wi-Fi
Android oldest supported · budget device, 3 GB RAM · en-IN · slow 3G
Tier 2 — every release, emulators/simulators or device farm
Android latest · Pixel · font scale 200% · RTL
iOS latest − 1 · small-screen iPhone · largest Dynamic Type size
iPadOS latest · Split View · landscape
Tier 3 — before major releases, device farm
long tail: remaining models above 1% of sessions, one foldable, one tablet
Combination rule
language × orientation × network × font size → pairwise set, not the full productTry it: Pairwise Testing Generator Try it: User-Agent Parser
What to test on mobile: the map of risks
Functional testing of features uses the same techniques as anywhere else; the guide on writing test cases covers them. What is specific to mobile is a set of risk areas every app should cover. Each has detailed scenarios in the companion guide on mobile app test scenarios; this is the map.
- Installation, update and uninstall — clean install, update from each supported older version with data migration, reinstall after uninstall, cleared app data, backup and restore.
- Permissions — the first request, denial, permanent denial, revocation in system settings while the app is running, and one-time grants.
- Interruptions — incoming calls, notifications, alarms, switching apps, locking the screen, low-battery warnings, and the OS killing the app in the background.
- Network — Wi-Fi to cellular and back, offline, airplane mode, slow and flaky connections, captive portals, and offline changes that must sync when the connection returns.
- Device and display — screen sizes, orientation, dark mode, font scaling, the on-screen keyboard, gestures, foldables and multi-window.
- Resources — battery drain, CPU, memory (leaks, low-memory kills), storage (full disk, growing caches) and data usage on cellular.
- Push notifications — delivery in foreground, background and killed states, tap-through to the right screen, and behaviour when notifications are disabled.
- Accessibility, localization, security and store compliance — covered below and in their own guides.
Typical mobile defects (illustrative bug titles)
- Address form loses entered data after rotating the device (Android)
- App crashes on resume after camera permission is revoked in Settings (iOS)
- Order submitted twice when the network drops during "Place order" and the user retries
- Update from 3.8 to 4.0 signs every user out (stored session not migrated)
- Tapping an order notification opens the home screen instead of the order
- "Pay" button hidden behind the keyboard on small screens
- Checkout total truncated at the largest system font size
- Offline edits silently overwritten after reconnectingTry it: Test Scenario Generator Try it: State Transition Generator
The mobile back end: APIs, versions and error handling
Many mobile defects that reach users are not in the UI but in how the app talks to its back end. The API is the part you can test fastest and most precisely: the same requests the app sends can be sent from an API client, and conditions that are hard to create on a device — a 503, a timeout, an expired token, a malformed body — can be produced on purpose.
Two mobile-specific concerns deserve their own tests. The first is version skew: users update late, so the back end must keep serving every app version you still support, and each API change needs a check against the oldest supported client. The second is the hostile network: requests are retried, duplicated and cut off halfway. Order and payment endpoints should be idempotent, and the app must show a clear state when the outcome of a request is unknown.
- Call each endpoint the app uses with valid, invalid and missing fields, and validate responses against the schema.
- Make the app face 401, 403, 404, 409, 429, 500 and 503 responses and slow responses; check the message and the recovery on screen.
- Let an access token expire while the app is in the background, then resume it: the app should refresh silently or ask the user to sign in, never crash or loop.
- Check payload sizes: large responses cost time and data on cellular networks.
- Before every back-end release, run the oldest supported app version against it.
Try it: REST API Tester Try it: API Status Code Simulator Try it: Mock Error Response Generator Try it: Response Size Analyzer
Mobile accessibility
Mobile platforms have their own assistive technologies, and an app has to be tested with them: TalkBack on Android and VoiceOver on iOS (screen readers driven by gestures), switch access, magnification, and system text scaling (font size on Android, Dynamic Type on iOS). WCAG 2.2 applies to mobile content as well as to the web — success criteria such as 1.3.4 Orientation, 2.5.1 Pointer Gestures and 2.5.8 Target Size (Minimum) are especially relevant to touch interfaces — and Android’s and Apple’s own accessibility guidance adds concrete expectations.
The accessibility testing guide covers the method in depth, including screen reader testing and visual accessibility. On mobile, start with these checks:
- Every interactive element has a meaningful spoken label, role and state; icon-only buttons are the usual failure.
- The TalkBack or VoiceOver swipe order follows the visual and logical order, including in right-to-left layouts.
- Text scales with the system setting without clipping, overlapping or truncated buttons; test at the largest sizes.
- Touch targets are large enough and spaced apart: Apple’s Human Interface Guidelines give 44×44 points as the default control size on iOS (28×28 points as the minimum), and Android recommends at least 48×48 dp.
- Custom gestures have a simple alternative such as a button, and no function depends only on shaking or tilting the device.
- Contrast holds in both light and dark mode.
Mobile security: MASVS and MASTG at a glance
The OWASP Mobile Application Security Verification Standard (MASVS) defines what a secure mobile app must do, and the Mobile Application Security Testing Guide (MASTG) describes how to verify it. MASVS groups its controls into areas: storage, cryptography, authentication, network communication, platform interaction, code quality, resilience against reverse engineering, and privacy. A functional QA team does not replace a mobile security assessment, but it can check the basics on every release and recognise when to bring in a specialist.
- Storage — no passwords, tokens or personal data in plain text in app files, preferences, logs or cached screenshots; secrets belong in the platform Keystore or Keychain. Check what stays on the device after logout.
- Network — all traffic over TLS, no fallback to plain HTTP, and certificate errors rejected rather than ignored.
- Authentication and session — tokens expire, and logout ends the session on the server, not only on the device; biometric unlock is tied to a valid server session.
- Platform interaction — deep links and components exposed to other apps validate their input; sensitive screens are hidden in the app-switcher preview where the risk requires it.
- Privacy — permissions requested only when needed and explained in context; the data collected matches the store privacy disclosures.
Platform quality guidelines and store readiness
Both platforms publish what they consider a quality app, and those documents make good checklists. Google’s Core app quality guidelines for Android set baseline criteria for visual experience, functionality, performance and stability, and privacy and security, together with the tests used to check them. Apple’s Human Interface Guidelines describe the expected behaviour of iOS interfaces — navigation, controls, layout, accessibility — and the App Store Review Guidelines describe what an app must meet to be accepted.
Use them as oracles for questions a requirement rarely answers: should the back gesture close this sheet? What should the user see when they return after hours? Is the permission requested in context? A deviation is not automatically a defect, but it should be a decision, not an accident.
- Back navigation — the Android back button or gesture and the iOS swipe-back gesture behave predictably on every screen.
- State restoration — the app returns to where the user was after being backgrounded or killed.
- Stability — no crashes and no "App not responding" (ANR) dialogs in the core flows.
- Start-up — cold start to a usable screen is acceptable on the lowest-end device you support.
- Store listing — screenshots, privacy disclosures and permission purpose texts match the app.
Automation, CI and release gates
Mobile automation follows the same pyramid as any product (see manual vs automated testing): many fast unit tests, a solid layer of API tests against the back end, and a smaller set of UI tests for the critical journeys. The UI layer uses the platform frameworks — Espresso for Android, XCUITest for iOS — or Appium, which drives both platforms through the WebDriver protocol. Stable UI tests depend on accessibility identifiers as locators, on the framework’s synchronisation instead of fixed sleeps, and on a controlled device state. The companion guide on mobile test automation compares the frameworks and lists the sources of flakiness.
In CI, run unit tests and emulator or simulator smoke tests on every change, and a wider suite on real devices in a device farm nightly or before release; keep the video, screenshots and device logs of every failure. Because a mobile release cannot be rolled back instantly, the last line of testing happens around the store: internal and beta distribution first (TestFlight on iOS, testing tracks on Google Play), then a staged or phased rollout that reaches a small share of users before everyone, with crash, ANR and API error rates watched at each step. A remote switch that can disable a broken feature is often the fastest fix available.
- Gate — no new crash cluster in the beta build during the agreed soak period.
- Gate — the oldest supported app version still passes its API smoke checks against the new back end.
- Rollout — pause if the crash-free rate or the success rate of a key flow drops below the agreed threshold.
- 1CI on every changeUnit tests and emulator or simulator smoke tests
- 2Real devicesA wider suite in a device farm, nightly or before release; video, screenshots and device logs of every failure
- 3Internal and betaTestFlight on iOS, testing tracks on Google Play
Gate: No new crash cluster in the beta build during the agreed soak period
- 4Staged rolloutA small share of users first; crash, ANR and API error rates watched at each step
Branch: Pause if the crash-free rate or a key flow’s success rate drops below the agreed threshold
- 5Everyone
- Remote switchDisables a broken feature; often the fastest fix available
- Back-end releases: a separate gateThe oldest supported app version still passes its API smoke checks against the new back end
The soak period and the thresholds are whatever your team has agreed; the figure implies no values.
Frequently asked questions
What is the difference between mobile app testing and mobile web testing?
Mobile web testing checks a website in mobile browsers: responsive layout, touch, viewport and browser differences. Mobile app testing adds everything the OS controls — installation and updates, permissions, background and killed states, push notifications and device hardware.
Should I test on emulators or real devices?
Both. Emulators and simulators are fast and scriptable, so use them for development and CI. Use real devices before release for performance, battery, camera, sensors, biometrics, cellular networks and manufacturer-specific behaviour.
How many devices do I need to test on?
As many as your risk requires, chosen from your analytics: the devices carrying most of your traffic, the oldest and newest supported OS versions, a small and a large screen, and known problem devices. Combine other parameters with pairwise selection.
What is device fragmentation?
The variety of environments an app must run in — manufacturers, OS versions, screen sizes, densities and hardware. It is largest on Android, but iOS also has several OS versions and screen sizes in use at once.
Can I use the same automated tests for Android and iOS?
Partly. Appium lets one test codebase drive both platforms if the apps share flows and accessibility identifiers, but screens and platform behaviour still differ. Platform frameworks (Espresso, XCUITest) need a suite per platform but are usually faster and more stable.
What is OWASP MASVS?
The OWASP Mobile Application Security Verification Standard: a set of security requirements for mobile apps grouped into areas such as storage, cryptography, authentication, network, platform interaction, code, resilience and privacy. The MASTG describes how to test them.
Does WCAG apply to mobile apps?
WCAG was written for web content, but its principles and most success criteria are applied to native mobile apps as well, and some — orientation, pointer gestures, target size — matter most on touch screens. Android and Apple publish their own accessibility guidance too.
References
- Certified Tester Mobile Application Testing (CT-MAT)ISTQB's specialist syllabus on mobile testing: app types, device and platform challenges, test types and tools.
- Core app quality guidelinesGoogle's baseline quality criteria for Android apps — visual experience, functionality, performance, privacy and security — with the tests used to check them.
- Test apps on AndroidAndroid's official testing guidance: test types and scopes, local vs instrumented tests, and testing best practices.
- OWASP Mobile Application Security Verification Standard (MASVS)OWASP's security requirements for mobile apps, grouped into control areas such as storage, cryptography, authentication, network and platform interaction.
- OWASP Mobile Application Security Testing Guide (MASTG)The testing manual that goes with MASVS: techniques and test cases for verifying mobile app security.
- Accessibility — Human Interface GuidelinesApple's accessibility design guidance for iOS and other platforms: VoiceOver, Dynamic Type, contrast, touch targets and motion.
- Appium DocumentationOfficial documentation for automating native, hybrid and mobile-web apps on iOS and Android.
- Web Content Accessibility Guidelines (WCAG) 2.2The W3C Recommendation that defines the testable success criteria for accessible web content, organised under four principles and three conformance levels (A, AA, AAA).
Practice exercise
Plan the mobile testing of an app release
You test a clinic booking app (fictional) for Android and iOS. Release 5.2 brings three changes: a prescription photo attached to an appointment, appointment reminders by push notification, and a booking deposit paid on the payment provider’s web page inside the app. The material below gives the changes, 30 days of the app’s analytics, two past incidents, the team’s devices and the release process.
On paper, write a one-page mobile test approach for 5.2 with the guide at hand: the app type, a device matrix, the risk map, the back-end checks and the release gates. Give a reason for every decision so that the team can challenge it. The Pairwise Testing Generator from the guide’s tools and the Edge Case Generator (its file and concurrency cases) help with two of the steps. Allow 40–45 minutes.
Clinic booking app (fictional) - release 5.2 for Android and iOS
One Flutter codebase for both platforms. The deposit is paid on the payment
provider’s hosted web page, shown in a WebView inside the app.
What 5.2 changes
C1 Attach a prescription photo to an appointment, from the camera or the
gallery. Upload: POST /v2/appointments/{id}/attachments
C2 A reminder push notification 2 hours before the appointment; tapping it
opens that appointment.
C3 Pay a booking deposit of 50.00 SAR on the hosted payment page.
POST /v2/appointments/{id}/deposit (header Idempotency-Key) returns the
address of the payment page.
Back end 5.2 goes live on 18 Oct 2026; the apps follow one week later with a
staged rollout. Supported app versions: 4.9 to 5.2.
Analytics, last 30 days (share of active users)
Android: 64%
Samsung mid-range, 6.5-inch screen: 19%
Samsung budget, 3 GB RAM: 11%
Xiaomi budget: 9%
Pixel: 4%
other models, each under 1%: 21%
OS versions: latest (N): 12%, N-1: 27%, N-2: 16%, older: 8%,
Android 10 (oldest supported): 1%
iOS: 36%
iPhone standard, 6.1-inch screen: 17%
iPhone large, 6.7-inch screen: 8%
iPhone small, 4.7-inch screen: 6%
iPad: 2%
other models, each under 1%: 3%
OS versions: latest (N): 27%, N-1: 7%, N-2 (oldest supported): 2%
Language: Arabic 71%, English 29%. Largest system font size: 3% of users.
Incidents
INC-41 (release 5.0) Booking confirmations (push) were not delivered on
Xiaomi devices after the app was swiped away; cause:
the manufacturer’s battery saver.
INC-44 (release 5.1) Samsung budget devices: after taking a profile photo,
the app reopened on the home screen and the photo was lost.
Other parameters to combine
language: ar, en | orientation: portrait, landscape
network: Wi-Fi, 4G, slow 3G | font size: default, largest
Team setup
Lab (real devices): Samsung mid-range (Android N-1), iPhone standard (iOS N)
Device farm: real devices and emulators of the models above, booked per session
CI: Android emulator and iOS simulator smoke tests on every merge
Beta: TestFlight and a Google Play closed testing track (clinic staff)
Remote switches: C1 yes, C2 no, C3 yes- Name the app type and write what it means for the plan: what the shared Flutter codebase saves, what it does not, and what the WebView payment page adds.
- Build the device matrix in three tiers — real devices every release; emulators, simulators or the device farm every release; the device farm before major releases — with a reason from the material for each entry. Mark the tests that need a real device. Then combine the other parameters pairwise: how many runs instead of the full product?
- Walk the guide’s risk map for C1, C2 and C3: for each change, name the risk areas that apply and write at least three test ideas, the most important first.
- List the checks to run with an API client before the back end goes live on 18 Oct 2026: version skew, the deposit, the new upload, and the error responses the app must handle.
- Write the release gates and the rollout: what must pass before each step, what you watch during the staged rollout, when you pause it, and what the missing remote switch for C2 means.
Show the model answer
App type. Flutter makes it a cross-platform app: the business logic is shared, but rendering, permission dialogs, keyboards, back navigation and the push integration still differ per platform, so C1, C2 and C3 each need a UI pass on Android and another on iOS — a pass on one platform says nothing about the other. What the shared code saves is the business logic: its unit tests are written once. The payment page makes the app hybrid at one point, so test the seam: the page opens with the payment session that the deposit call returned — this appointment, 50.00 SAR; the Android back button and the iOS swipe-back in the middle of a payment; what the user sees when the page fails to load (offline, a 503); and what the app shows when the user comes back from the page (paid, not paid, cancelled). Before you promise automated coverage of the payment step, check that your UI automation can reach content inside the WebView.
Device matrix, tier 1 — real devices, every release. (1) Samsung mid-range, Android N-1, Arabic, 4G: the most used model (19%) on the most used Android version (27%); it is in the lab. (2) iPhone standard, iOS N, Arabic, Wi-Fi: the most used iOS model (17%) on the most used iOS version (27%); also in the lab. (3) Samsung budget with 3 GB RAM on Android N-2, from the device farm: 11% of users on the second most used Android version (16%), and INC-44 is the typical sign that the OS killed the app while the camera was open and the app did not restore its state — the path C1 takes. (4) Xiaomi budget on one of the versions older than N-2 (8% together), from the device farm: 9% of users, and INC-41 shows that the manufacturer’s battery saver stops push notifications — the path C2 takes. Devices 3 and 4 are in tier 1 because of their incidents, which the guide names as a reason of its own, not only because of their share.
Tier 2 — every release, on emulators, simulators or the device farm: Android 10, the oldest supported version (1%), because its permission model differs — notifications need a runtime permission only from Android 13, and the one-time “Only this time” camera grant exists only from Android 11, so C1 and C2 take other paths there; Android N (12%) on a Pixel emulator, plus the next Android beta when there is one; the 4.7-inch iPhone (6%) on iOS N-2, the oldest supported iOS (2%), at the largest text size (3% of users) — the small screen where the keyboard can hide the payment page’s “Pay” button and amounts can be truncated; and the 6.7-inch iPhone (8%) on iOS N-1 (7%) as the large screen. Tier 3 — before major releases, in the device farm: the iPad (2%) in Split View and in landscape, and a sample of the long tail, since no other model reaches 1% of users. Real devices are required for taking the photo in C1 (camera), and for push delivery in the background and killed states and behind the Xiaomi battery saver in C2. Emulators and simulators are enough for layout, right-to-left, font size, the permission dialogs on Android 10, and the loading and error states of the WebView.
Pairwise. Language (2) × orientation (2) × network (3) × font size (2) gives 24 runs as a full product. Pairwise needs at least 6, because network × language alone has 3 × 2 = 6 pairs and each run covers only one of them. One valid set: Wi-Fi · ar · portrait · default; Wi-Fi · en · landscape · largest; 4G · ar · landscape · largest; 4G · en · portrait · default; slow 3G · ar · portrait · largest; slow 3G · en · landscape · default. A generator may return 6 or 7 rows; check that every pair appears. Spread the rows over the tier 1 and tier 2 devices instead of running all six on every device.
C1, prescription photo — permissions, interruptions and resources, network, security and privacy, accessibility. (1) Camera permission: first request, denial, permanent denial (the gallery still works and the app explains how to allow the camera in Settings), the one-time grant, and revocation in the system settings while the app is in the background, then resume: no crash. (2) On the 3 GB Samsung: open the camera from an appointment, take the photo and come back; the appointment and the photo must still be there even if the OS killed the app in the meantime (INC-44). The Android developer option “Don’t keep activities” helps to reproduce this on other devices. (3) Upload on slow 3G and with the connection lost halfway: visible progress and a clear message when the upload fails, retry without a duplicate attachment, and a photo size that is reasonable on cellular data. (4) A prescription is health data: check what stays in the app’s files and cache after the upload and after logout, and that the store privacy disclosures mention the photos. (5) The camera button, often icon-only, has a meaningful spoken label in TalkBack and VoiceOver.
C2, reminders — push notifications, permissions, the back end, privacy. (1) Delivery with the app in the foreground, in the background and killed (swiped away), on the Xiaomi behind its battery saver (INC-41) and on an iPhone. (2) Tapping the reminder opens that appointment, not the home screen — also when the access token expired while the app was in the background: the app refreshes the token silently or asks the user to sign in, then opens the appointment; it never crashes or loops. (3) Notifications refused: on iOS and on Android 13 and later the user can refuse at the prompt; on Android 10 to 12 they are on by default but can be switched off in Settings. Either way the app says that reminders are off instead of failing silently. (4) A cancelled or moved appointment gets no reminder for the old time. (5) Ask the product owner what a reminder may show on a locked screen: a clinic or specialty name can reveal health information.
C3, deposit — the hybrid seam, network, interruptions, display, security. (1) The seam, as described under the app type. (2) The connection drops right after the user confirms the payment, and the user tries again: the deposit is charged once — a repeated deposit call carries the same Idempotency-Key — and the app shows that the payment status is being checked instead of offering to pay again. (3) Interruptions: if the payment page asks for a one-time code, the user switches to the messages app to read it and comes back — the page and what was typed are still there; the same after an incoming call. (4) On the 4.7-inch iPhone the keyboard does not hide “Pay”, and the amount is not truncated at the largest font size. (5) The page loads only over HTTPS, and certificate errors are rejected, not ignored; checking the second needs an intercepting proxy, so plan it with a security specialist (the network area of MASVS).
Back-end checks before 18 Oct, against staging, with an API client and the old app builds. (1) Version skew: the back end goes live a week before the apps, so during that week every user runs 4.9 to 5.1 against back end 5.2. Run app 4.9, the oldest supported, and 5.1 against it: sign in, list, book and cancel appointments, booking confirmation push — also with an appointment that has a photo and a paid deposit, which an old app meets when the same account uses 5.2 on another device. Passing this is the gate for the back-end release. (2) Deposit: send POST /v2/appointments/{id}/deposit twice with the same Idempotency-Key; the second call returns the same payment session, not a new one. A new key for an appointment that is already paid is refused as the API contract defines, for example with 409 Conflict. (3) Upload: a valid photo, a wrong or spoofed file type, an empty file, missing fields and a file over the size limit, with every response validated against the schema; the Edge Case Generator lists the file and double-submission cases. (4) Make the app face 401, 403, 404, 409, 429, 500, 503 and a slow response on the two new endpoints and on loading the appointment that a reminder opens (API Status Code Simulator, Mock Error Response Generator), and check the message and the recovery on screen. (5) Response and upload sizes (Response Size Analyzer), which cost time and data on cellular networks.
Release. In CI, unit tests and emulator and simulator smoke tests run on every merge; the wider suite runs on real devices in the device farm nightly and before the release, keeping the video, screenshots and device logs of every failure. Gate 1, before 18 Oct: app 4.9 passes its API smoke checks against back end 5.2. Gate 2, beta: updating to 5.2 from 4.9 and from 5.1 keeps the user signed in with their appointments, clinic staff use 5.2 from TestFlight and the closed testing track, and no new crash cluster appears during the agreed soak period. Then the staged rollout on Google Play and the phased release on the App Store: at each step watch the crash-free rate, ANRs on Android, API error rates and the success rates of the three new flows (photo upload, opening an appointment from a reminder, deposit payment), and pause when one drops below the agreed threshold. C1 and C3 can be switched off remotely if they fail. C2 cannot: a defect in how the app handles reminders reaches every user who has updated and can only be fixed by a new release that goes through store review. Ask for a switch, or at least a way to stop sending reminders from the server, before 5.2 ships; if the team declines, record it as a release risk and give C2 the most real-device time in beta.
If your plan differs, compare the reasons rather than the lists. Every device needs a reason from the material: share of users, the oldest or newest supported version, a screen size or an incident. A camera or push test planned only on emulators, a matrix without the oldest supported versions, or a back end released before the old app versions were run against it are the gaps to fix.
Your progress on this topic
Not started
Mark the topic complete when you have studied it and done the exercise.
Sign in to track your progress
Mark topics complete, continue where you left off and unlock specialisation exams.
Part of the QA Roadmap
Before this topic
Next topics
Tools mentioned in this guide
Generate a minimal pairwise (all-pairs) test set from parameters and their values.
Parse User-Agent strings into browser, version, engine, OS, device type and bot detection.
Test REST endpoints with full control over method, headers and JSON body, then assert on status, headers and JSON paths.
Get a public endpoint that returns any HTTP status code, with optional delay and custom JSON body, to test client error handling.
Generate structured error responses (validation, auth, not found, rate limit, server error) in popular formats.
Analyze response size: raw vs compressed bytes, headers size, JSON structure weight and largest fields.
Define states and events, then generate a transition table, valid/invalid transition tests and 0-switch/1-switch coverage.
Generate high-level test scenarios covering functional, negative, security, usability and compatibility angles for a feature.
Generate the same records in multiple languages (English, Arabic, Hindi, and more) to test i18n and RTL/LTR mixing.