Mobile App Test Scenarios

Most mobile defects do not appear when a tester follows the happy path on a fully charged phone on office Wi-Fi. They appear when a call arrives during payment, when the train enters a tunnel, when the user denies the camera permission, when the OS kills the app in the background, or when an update meets data written by the previous version. This guide is a catalogue of those conditions, with what to observe and how to force each one on an emulator, simulator or device.

Use it as a checklist when you design tests for a mobile feature. The overview of the whole domain — app types, device strategy, security and automation — is in the mobile testing pillar; this page goes deep on scenarios.

How to use this catalogue

Each scenario is a condition plus an observation: put the app in a state, apply a mobile-specific disturbance, and check what the user sees and what the data looks like afterwards. Turn the ones that apply into test cases with preconditions, steps and expected results (the guide on writing test cases covers the format). Choose by risk: screens that hold unsaved input, features that need the network, flows that use permissions or leave the app (payment, sign-in with another app), and anything that stores data locally.

The app lifecycle can be modelled as a state machine, and many mobile defects are wrong transitions. For testing, a simplified cross-platform model with five states works well: not running, foreground, background, suspended and killed. Neither platform defines exactly this set: "suspended" is an iOS term, and "killed" stands for process death — the OS ends the process of an app in the background, and the user later returns to it from Recents expecting their state back. Modelling the critical screens as states and events (call arrives, app sent to background, process killed, app reopened from Recents) gives you a transition table and a clear list of which transitions you have and have not tested.

Many mobile defects are wrong lifecycle transitions; the most dangerous is invisible: the OS kills the process in the background, and a reopen from Recents must restore the state. Conceptual model
Transitions
#FromToEvent → what to check
1Not runningStartForegroundApp launched
2ForegroundForegroundConfiguration change (Android): rotation, language, dark mode or font size recreates the screen by default → typed text, selections, scroll position and open dialogs survive
3ForegroundBackgroundSent to the background: the user switches apps, locks the screen, or leaves for a bank app or browser
4BackgroundForegroundThe user returns after seconds, minutes or hours → session expiry handled; the right screen with the right state
5BackgroundSuspended (iOS)The system suspends the app
6Suspended (iOS)ForegroundThe user returns → the same checks as a return from the background
7BackgroundKilledThe OS ends the process to reclaim memory; force it with adb shell am kill
8Suspended (iOS)KilledThe OS ends the process to reclaim memory
9KilledForegroundReopened from Recents → the screen is rebuilt and what the user typed is restored

A simplified cross-platform model for testing: neither platform defines exactly these five states, and “suspended” is an iOS term. On Android, “Don’t keep activities” is a cheap way to find missing state restoration.

ID:        MOB-NET-04
Area:      Network — connection lost mid-request
Screen:    Checkout › Place order
Setup:     Signed-in customer, 2 items in cart, Wi-Fi on, mobile data off
Trigger:   Tap "Place order", then disable Wi-Fi within one second
Observe:   - A clear "no connection" state; no endless spinner
           - After reconnecting: exactly one order exists (order list and API)
           - Retrying does not charge the card twice
Devices:   Tier 1 Android and iOS

Try it: State Transition Generator Try it: Test Case Generator

Install, update, uninstall and reinstall

Updates are where data migration defects hide: a local database schema changed, a preference key was renamed, the stored token format changed, a cached file moved. Test the update from every older version you still support — keep old builds as artefacts so you can install them — and do it with realistic data on the device, not a fresh install.

  • Clean install on the oldest and newest supported OS versions; first launch with no network connection.
  • Install and first launch on a device with almost no free storage.
  • Update from the previous version and from the oldest supported version with a signed-in session, drafts, queued offline actions, settings and downloaded files — everything survives and the user stays signed in.
  • Update while a download or background sync is in progress.
  • Forced update: a version below the minimum supported version shows a clear update prompt instead of failing API calls.
  • Uninstall and reinstall: local data is gone, server data returns, backup and restore behaves as designed. On iOS some Keychain data can outlive the app, so decide and test whether a reinstall is treated as a new user.
  • Clear app data (Android) or offload the app (iOS, which keeps documents and data) and relaunch.
# Android (adb) — examples
adb install shop-3.8.0.apk                # old version; now sign in, create drafts, change settings
adb install -r shop-4.0.0.apk             # update, keeping app data
adb shell pm clear com.example.shop       # clear app data
adb uninstall com.example.shop

# iOS Simulator (xcrun simctl) — examples
xcrun simctl install booted Shop-3.8.app
xcrun simctl install booted Shop-4.0.app  # install the new build, then check what data survived
xcrun simctl uninstall booted com.example.shop

Runtime permissions: grant, deny, revoke

Android asks for dangerous permissions at run time, and iOS asks the first time an app uses a protected resource, showing the app’s purpose text. On both platforms the user can change the answer later in Settings, and recent versions add choices such as allowing access only once or sharing approximate rather than precise location; Android also made notifications a runtime permission. The app must work — or degrade clearly — for every answer.

  • Grant on first request: the feature works immediately, without restarting the app.
  • Deny: the app explains what is unavailable and offers another path (type the address instead of using location).
  • Deny again or "Don’t ask again": the app does not loop the prompt; it explains how to enable the permission in Settings.
  • Allow once / only this time: the next session asks again, and the feature handles it.
  • Approximate location or limited photo access: features that need more say so instead of failing silently.
  • Revoke in Settings while the app is in the background. On Android the app’s process is killed when a permission is revoked; on return the app must restart cleanly on a sensible screen.
  • The permission is requested in context, when the feature is used — not all at once on first launch — and the purpose text is accurate.
# Android
adb shell pm grant  com.example.shop android.permission.CAMERA
adb shell pm revoke com.example.shop android.permission.CAMERA

# iOS Simulator
xcrun simctl privacy booted grant  photos com.example.shop
xcrun simctl privacy booted revoke photos com.example.shop
xcrun simctl privacy booted reset  all    com.example.shop

Interruptions and the app lifecycle

An interruption is anything that moves the app out of the foreground or covers it. The dangerous one is invisible: while the app is in the background, the OS may kill its process to reclaim memory, and when the user returns the app must rebuild the screen and restore what they had typed. On Android the developer option "Don’t keep activities" destroys each screen as soon as the user leaves it — a cheap way to find missing state restoration. Configuration changes such as rotation, language, dark mode or font size also recreate the screen by default on Android.

  • Incoming call, answered and declined, during form entry, video playback, recording and payment.
  • Notifications from other apps; pulling down the notification shade or Control Center mid-flow.
  • Switch to another app and come back after a few seconds, a few minutes and several hours (session expiry).
  • Lock and unlock the screen while waiting for an OTP or while a timer runs.
  • An alarm fires, or a low-battery warning appears; battery saver or Low Power Mode turns on.
  • Bluetooth headphones disconnect during audio playback — playback should pause.
  • Process death: send the app to the background, kill the process, reopen it from Recents.
  • Round-trips to other apps — a bank app, a browser for sign-in or 3-D Secure — return to the right screen with the right state.
  • Split screen, picture-in-picture, and folding or unfolding a foldable mid-flow.
# Android — force the conditions
adb shell am kill com.example.shop          # kill the background process, then reopen from Recents
adb shell dumpsys battery unplug
adb shell dumpsys battery set level 5       # simulate a low battery
adb shell dumpsys battery reset
adb shell dumpsys deviceidle force-idle     # put the device into Doze
adb shell dumpsys deviceidle unforce

# Android emulator — incoming call and SMS
adb emu gsm call 5551234
adb emu sms send 5551234 "Your code is 482913"

Try it: State Transition Generator

Network changes, offline mode and sync

On mobile the network is a variable, not a constant. Test the transitions and the quality of the connection, not only "online" and "offline". For apps that work offline, synchronisation is the main risk: queued changes sent twice or in the wrong order, conflicts between devices resolved silently, and actions queued under a session that expired in the meantime.

  • Wi-Fi to cellular and back during an upload, a download and streaming.
  • Airplane mode on and off in the middle of a request.
  • Launch while offline: cached content with a visible offline indicator; actions queued or disabled with an explanation.
  • Slow network (high latency, low bandwidth): loading states, sensible timeouts, and no duplicate submission from impatient taps.
  • Flaky network (drops and packet loss): retries with back-off, no duplicate records; order and payment requests are idempotent.
  • Captive portal (hotel or airport Wi-Fi): connected but no internet — the app receives an HTML login page instead of JSON and must show a network message, not a parsing error.
  • Offline conflict: edit a record offline on device A, edit the same record online on device B, reconnect A — the agreed conflict rule is applied and visible.
  • Queued actions sent after the session expired offline; device clock or timezone changed while offline.
  • Data saver or restricted background data enabled.
# Android
adb shell svc wifi disable     # and: enable
adb shell svc data disable     # and: enable

# Android emulator — start with a throttled network
emulator -avd Pixel_Test -netspeed edge -netdelay gprs

# iOS — Network Link Conditioner (device Developer settings, or Xcode additional tools for the Mac)

# Server side — point the app at an endpoint that answers slowly or with an error code

Try it: API Status Code Simulator Try it: Mock Error Response Generator

Screens, orientation, gestures and input

  • Rotate on every screen with input: typed text, selections, scroll position and open dialogs survive.
  • Switch dark mode while the app is open; check contrast and images in both modes.
  • Largest font size or Dynamic Type size: no clipped or overlapping text, and long screens scroll.
  • Change the Android display size; test the smallest and largest screens in your matrix.
  • Keyboard: the right type for each field (numeric for OTP and phone, email for email), the focused field and the submit button stay visible, "Next" moves focus, and OTP autofill works where the platform supports it.
  • Gestures: tap, double tap, long press, swipe, pinch, drag and pull-to-refresh; custom edge swipes do not fight the system back gesture.
  • Rapid repeated taps on submit buttons do not create duplicates.
  • Right-to-left: in Arabic the layout mirrors, swipe directions and back arrows make sense, mixed Arabic and Latin text displays correctly, and inputs accept Arabic-Indic digits where the app allows them.
# Android
adb shell settings put system font_scale 2.0     # large text (reset with 1.0)
adb shell wm size 1080x2400                      # emulate another screen (reset: wm size reset)
adb shell wm density 480                         # (reset: wm density reset)
adb shell cmd uimode night yes                   # dark mode on (no = off)

# iOS Simulator
xcrun simctl ui booted appearance dark
# larger text: raise the text size in the simulator’s Settings app

Try it: Arabic Test Data Generator Try it: Multilingual Test Data Generator Try it: Fake Phone Number Generator

Battery, CPU, memory, storage and data

Resource defects rarely fail a functional test. They show up later as battery complaints, "App not responding" dialogs, sluggish scrolling and the OS killing the app. Measure on real devices with the platform profilers (Android Studio’s profilers, Xcode Instruments) and compare each release with the previous one rather than against an absolute number.

  • Battery: a typical 30-minute session on a real device, compared with the previous release; location updates, sensors and wake locks stop when the user leaves the screen; background work respects Doze and Low Power Mode.
  • CPU and rendering: long lists scroll smoothly on the lowest-end supported device; nothing keeps working in the background without reason.
  • Memory: repeat the main flow twenty times and check that memory returns to its baseline; open large images; test on low-RAM devices.
  • Storage: with a nearly full device, writes fail gracefully; caches have a limit and are cleared; the app’s size after a week of use is reasonable.
  • Data: cellular data used by a typical session; images sized for the screen; large downloads on cellular only with the user’s consent.
  • Start-up: cold and warm start times on the lowest-end device; heat during long camera, video or map sessions.
# Android — quick measurements
adb shell dumpsys meminfo com.example.shop
adb shell dumpsys gfxinfo com.example.shop       # frame rendering stats
adb shell dumpsys batterystats --reset
# ...run the session on battery...
adb shell dumpsys batterystats com.example.shop

Try it: Response Size Analyzer

Push notifications

A push notification crosses several systems: the app registers with the platform service (Firebase Cloud Messaging on Android, APNs on iOS), receives a device token, sends it to your back end, and the back end sends messages through the platform service. A failure anywhere looks the same to the user — nothing arrives, or the wrong thing opens — so test the chain and the app states separately.

  • Notification permission denied: the app still works and offers in-app alternatives; the app’s own notification settings are respected.
  • Delivery with the app in the foreground (in-app banner or silent update, as designed), in the background and killed.
  • Tapping opens the right screen with the right record — also when the user was signed out, in which case the target opens after sign-in.
  • Sign out, then sign in as another user: notifications for the first user no longer arrive (the token is unregistered or reassigned).
  • Reinstall or restore: the back end receives the new token and stops using the old one.
  • Content: localized text, Arabic right-to-left, long text, emoji and images; no sensitive data visible on the lock screen.
  • Badges are cleared, notifications are grouped, and Android notification channels have the intended importance.
  • Scheduled notifications arrive at the correct local time across timezones.
# iOS Simulator — deliver a test notification without a server
xcrun simctl push booted com.example.shop order-shipped.apns

# order-shipped.apns
{
  "Simulator Target Bundle": "com.example.shop",
  "aps": { "alert": { "title": "تم شحن طلبك", "body": "Order A-1042 is on its way" }, "badge": 1 },
  "orderId": "A-1042"
}

Try it: Arabic Test Data Generator

Defect examples and what to put in a mobile bug report

A mobile bug report needs more environment than a web one: device model, OS version, app version and build, network type, orientation, language, font size, permission state, and how the app reached that state (fresh install or update from which version). Attach a screen recording and the device log — logcat on Android, the device console on iOS. The bug report guide covers the rest of the format. The titles below are illustrative examples of the defects this catalogue finds.

[Android, Pixel] Checkout crashes on resume after process death on the payment step
[iOS] Draft message lost when a phone call arrives while typing
Offline queue sends "Add to cart" twice after switching from Wi-Fi to 4G
Update 4.1 → 4.2: saved addresses missing (local database migration skipped)
"Order shipped" notification opens Home instead of order A-1042 when the app was killed
Location permanently denied: map screen shows an endless spinner and no link to Settings
Font size 200%: "Confirm" button off-screen on the OTP screen and not scrollable
Captive-portal Wi-Fi: app shows "Unexpected token <" instead of a network message

Frequently asked questions

What are the most important mobile test scenarios?

Beyond the features themselves: update with data migration, permission denial and revocation, interruptions and process death, network loss and transitions, offline sync, large text and rotation, and push notifications in foreground, background and killed states.

How do I test an app update?

Install an older supported build, create realistic data (session, drafts, settings, offline queue), install the new build over it and check that everything survives and the user stays signed in. Repeat from the oldest version you still support.

How do I simulate a poor network?

Throttle the Android emulator’s speed and latency, use Network Link Conditioner on iOS, toggle Wi-Fi and mobile data during requests, and point the app at an endpoint that responds slowly or with error codes.

How do I test what happens when the OS kills the app?

Put the app in the background mid-task, kill its process (adb shell am kill on Android; "Don’t keep activities" is a lighter check that destroys each screen but leaves the process running), then reopen it from Recents. The screen and the user’s input should be restored.

What should I check in push notifications?

Delivery in each app state, the screen opened on tap, behaviour when notifications are denied, token changes after sign-out and reinstall, localized and right-to-left content, and that no sensitive data appears on the lock screen.

How do I test runtime permissions?

For each permission, test grant, deny, permanent deny, one-time grant and revocation in Settings while the app runs. The app must keep working or explain clearly what is unavailable and how to enable it.

References

  • Certified Tester Mobile Application Testing (CT-MAT)ISTQB · 2019ISTQB's specialist syllabus on mobile testing: app types, device and platform challenges, test types and tools.
  • Core app quality guidelinesAndroid Developers (Google)Google'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 Developers (Google)Android's official testing guidance: test types and scopes, local vs instrumented tests, and testing best practices.
  • XCTestAppleApple's framework for unit, performance and UI tests of Xcode projects on iOS and other Apple platforms.
  • OWASP Mobile Application Security Verification Standard (MASVS)OWASP FoundationOWASP's security requirements for mobile apps, grouped into control areas such as storage, cryptography, authentication, network and platform interaction.
  • Test your app's accessibilityAndroid Developers (Google)How to test an Android app's accessibility manually with TalkBack and other services, and automatically with the platform's testing tools.
  • Accessibility — Human Interface GuidelinesAppleApple's accessibility design guidance for iOS and other platforms: VoiceOver, Dynamic Type, contrast, touch targets and motion.

Practice exercise

Design mobile test scenarios for proof of delivery

Your task

You are the tester for the courier app of a delivery company (fictional), on Android and iOS. Release 5.0 adds proof of delivery (POD): at the door the courier takes a photo of the parcel, the customer types a delivery code, and the app uploads both, later if there is no signal. The material below is what the product owner, the courier team lead and the developers have told you.

Design the mobile-specific tests for the POD flow on paper, using the guide’s catalogue: every scenario is a condition you can force plus an observation you can check on screen and in the data. The Risk-Based Test Generator can help you score the catalogue areas by likelihood and impact. Allow 25–30 minutes.

Material
Courier app "Wasel Driver" (fictional) - Android and iOS, Arabic and English UI
Package / bundle id: com.example.courier
Version in the stores today: 4.9. Oldest supported version: 4.6
(older versions get a forced-update prompt).
Release 5.0 adds "Proof of delivery" (POD).

POD flow on the delivery screen of an order, for example D-5531
  1. The courier taps "Delivered"; the app reads the GPS position
     (location permission).
  2. The courier photographs the parcel at the door with the new in-app
     camera (camera permission).
  3. The customer types the 4-digit delivery code from their SMS on the
     courier’s phone.
  4. The courier taps "Confirm delivery": the app sends photo, code and position
     in POST /api/orders/D-5531/pod, and the order becomes "Delivered".

Rules
  R1  Without network, the POD is saved on the phone and uploaded later, oldest
      first. The server never records the same order as delivered twice.
  R2  If no location is available, the courier can still confirm; the POD is
      flagged "no location" for the dispatcher.
  R3  A courier session lasts 12 hours; then the courier must sign in again.
  R4  When the dispatcher reassigns an order, the courier gets the push
      notification "Order D-5531 was reassigned"; tapping it opens the order list.

What changes in 5.0
  - Offline queue: 4.x keeps confirmations (status only) in the local table
    pending_uploads. On its first launch, 5.0 moves them to the new table
    pod_queue (status, photo, code, position).
  - Camera: an in-app camera screen replaces opening the system camera app.

From the courier team lead
  Couriers use their own phones, work shifts of up to 12 hours, often deliver in
  basements and lift lobbies with no signal, and install updates during a shift.

From the developers
  "The whole flow passes on office Wi-Fi with a fresh install of 5.0."

Devices: Tier 1 Android and iOS phones; Android emulator and iOS Simulator.
Steps
  1. Choose by risk: say which of the guide’s selection signals the POD flow has (unsaved input, network, permissions or leaving the app, local data), then rank the catalogue areas and name the three you test first, with a reason for each.
  2. Write ten scenarios, one line each, as a condition plus an observation. Cover at least five areas of the catalogue, and tie each scenario to a rule (R1–R4) or a 5.0 change where one applies.
  3. Write two of them in full in the catalogue’s format (ID, Area, Screen, Setup, Trigger, Observe, Devices): the update from 4.x with unsent confirmations, and process death on the POD screen. Include the commands that force each condition on the Android emulator.
  4. List the questions the material leaves open, for the product owner.
  5. Your process death scenario fails. Write the bug report title and the environment details the report needs, filled in as far as the material allows.
Show the model answer
Model answer

Choosing by risk. The POD flow has every signal the guide uses to choose scenarios: unsaved input (the photo and the typed code exist only on the phone until "Confirm delivery"), a feature that needs the network (the upload), permissions (location and camera) and data stored locally (the offline queue, which moves to a new table in 5.0). Only "leaving the app" shrinks, because the in-app camera replaces the round-trip to the system camera app; in exchange, the new camera screen must survive rotation, interruptions and a denied permission. Test first: (1) network, offline mode and sync, because R1 is the promise the feature rests on and couriers deliver without signal every day — the risks are a POD sent twice, sent out of order, or stranded when the session expires before the upload; (2) the update from 4.x, because the queue is migrated on first launch and couriers update during a shift, so real phones will hold unsent confirmations at the moment of the update; (3) interruptions and process death on the POD screen, because calls and app switches are normal at a door, and losing the photo and the code means repeating the steps while the customer waits. Next come runtime permissions (R2 and the camera), push notifications (R4), and screens and input (the code field, Arabic, rotation, large text). Battery, data and storage remain release checks — a full shift with photo uploads on cellular, a nearly full phone — rather than the first priority. Note that the developers’ evidence, a fresh install on office Wi-Fi, exercises none of the top three.

Ten scenarios, part 1. POD-01 (network, R1): tap "Confirm delivery" and cut the connection within one second. Expected: a clear "waiting to upload" state and no endless spinner; after reconnecting, exactly one POD exists for D-5531 and the order is "Delivered" once (order list and API). POD-02 (sync, R1): confirm three orders in airplane mode, then reconnect. Expected: they upload oldest first, each exactly once, with photo and code intact, and the waiting count shown to the courier drops to zero. POD-03 (sync and session, R1 and R3): confirm a delivery offline and let the session expire before reconnecting; ask for a test environment with a short session instead of waiting 12 hours. Expected: the courier is asked to sign in, and the queued POD is kept — not dropped when the server refuses the expired session — and uploads after sign-in. POD-04 (update, 5.0 change): queue two confirmations offline in 4.9, then update to 5.0. Expected: the courier stays signed in, and both move to pod_queue and upload exactly once; repeat from 4.6. POD-05 (lifecycle, process death): take the photo, type two digits, send the app to the background, kill the process and reopen the app from Recents. Expected: the POD screen of D-5531 returns with the photo and the digits.

Ten scenarios, part 2. POD-06 (interruption): an incoming call, answered and declined, while the customer types the code; also lock and unlock the screen. Expected: back on the POD screen with the input intact, and nothing is sent on its own. POD-07 (permissions, R2): deny location, then deny it again so the system stops asking (on iOS the first denial already does this). Expected: confirming still works, the POD is flagged "no location", the prompt does not loop, and the app explains how to allow location in Settings. POD-08 (permissions, in-app camera): deny the camera on first use; separately, allow it, then revoke it in Settings while the app waits in the background on the POD screen. Expected: on denial, the app explains what is unavailable and how to allow the camera in Settings, without looping the prompt, and confirming follows the product owner’s answer on deliveries without a photo; after the revoke, which on Android kills the process, the app restarts cleanly on a sensible screen, such as order D-5531, without a crash. POD-09 (push, R4): the reassignment notification with the app in the foreground, in the background and killed, and once after the session has expired. Expected: a tap opens the order list, after sign-in where needed; D-5531 is no longer in it, and no POD can be confirmed for it. POD-10 (screens and input): the code field, the Arabic UI with Arabic-Indic digits, rotation of the camera and POD screens, and the largest font size. Expected: a numeric keyboard; the digits accepted, or refused with a clear message, as decided; photo and digits survive rotation; "Confirm delivery" stays visible or reachable by scrolling. Also good: a rapid double tap on "Confirm delivery" (one POD), a slow network with a large photo (progress, a sensible timeout, no duplicate), a nearly full phone when the photo is saved, captive-portal Wi-Fi in a building lobby, uploads under Doze or Low Power Mode, and version 4.5 showing the forced-update prompt.

Full scenario 1 (POD-04 in full). ID: POD-UPD-01. Area: Install and update — migration of the offline queue. Screen: Orders › Waiting to upload. Setup: Android emulator with 4.9 installed (adb install courier-4.9.0.apk), courier signed in, network off (adb shell svc wifi disable and adb shell svc data disable), D-5531 and then D-5532 marked "Delivered", so both wait in pending_uploads. Trigger: update with adb install -r courier-5.0.0.apk, which keeps the app data, launch 5.0 and look at the queue, then switch the network back on (adb shell svc wifi enable and adb shell svc data enable). Observe: the courier is still signed in; both confirmations are shown as waiting after the update; after reconnecting each is sent exactly once, D-5531 first, and both orders are "Delivered" (order list and API); after a relaunch nothing is sent again, so the content of the old table is not sent a second time. Devices: Android emulator and a Tier 1 Android phone, then the Tier 1 iPhone with the kept 4.9 build and airplane mode. Repeat from 4.6 on a clean emulator: uninstall first, because 4.6 cannot simply be installed over 4.9.

Full scenario 2 (POD-05 in full). ID: POD-LIFE-01. Area: Interruptions — process death. Screen: Order D-5531 › Proof of delivery. Setup: courier signed in, network on, location and camera allowed, photo taken, the customer has typed two digits of the code. Trigger: press Home, kill the process with adb shell am kill com.example.courier, then reopen the app from Recents. Observe: the POD screen of D-5531 opens, not the home screen or another order; the photo and the two digits are restored; nothing has been uploaded; no crash. Devices: Android emulator and a Tier 1 Android phone; the command is Android-only, so agree with the iOS developers how to force the same condition on the iPhone. In the guide’s lifecycle model this covers the path from foreground to background, to killed and back to foreground, which the developers’ check never took. The developer option "Don’t keep activities" is a cheaper first check of the same restoration, but only killing the process tests process death. In ISTQB terms, each one-line scenario names a test condition, and writing it in full turns it into a test case: Setup holds the preconditions, Trigger the steps, and Observe the expected results.

Open questions for the product owner. Camera denied: can the courier confirm without a photo, as R2 allows without a location, or is the delivery blocked, and what does the dispatcher see? Approximate location (precise location switched off): does it count as a location or as "no location"? Confirmations migrated from 4.x have no photo or code: does the server accept them, and are they marked for the dispatcher? Where is the code checked? If the server checks it, an offline POD cannot be checked at the door: what happens when a queued POD arrives with a wrong code, and how many attempts are allowed? Reassignment during offline work: if the courier confirms an order offline and the dispatcher reassigns it before the upload, which wins, and what does each of them see? Which time does the POD record, the confirmation on the phone or the upload, and what if the phone’s clock or timezone changed while offline? Are Arabic-Indic digits accepted in the code field?

Bug report for a failed POD-LIFE-01. Title: "[Android] POD screen reopens empty after process death: photo and typed code lost (order D-5531)". Environment: device model and OS version; app version and build (5.0 and its build number); how the app reached that state (fresh install of 5.0 or update from 4.9, which matters here because the update migrates local data); network type; orientation; UI language; font size; permission state (location and camera allowed); the test courier account and the order. In the steps, give the exact command and say that the app was reopened from Recents. Attach a screen recording and the logcat output from the kill to the reopen.

Checking your work. Every scenario must name a condition you can force and an observation you can check on screen and in the data: "test offline mode" has no observation, and "POD should work" has no condition. Your ranking may differ when your reasons come from the material, but a plan without a network, an update and a process death scenario has missed the three biggest risks of this release. IDs, wording and the order of the ten do not matter; the coverage of the catalogue areas, the link to R1–R4 and the open questions do.

Your progress on this topic

Part of the QA Roadmap

Tools mentioned in this guide

Define states and events, then generate a transition table, valid/invalid transition tests and 0-switch/1-switch coverage.

Test Design

Get a public endpoint that returns any HTTP status code, with optional delay and custom JSON body, to test client error handling.

API Testing

Generate structured error responses (validation, auth, not found, rate limit, server error) in popular formats.

Mocking

Generate Arabic names, addresses, sentences, numbers (Arabic-Indic digits) and RTL edge cases for localisation testing.

Test Data

Generate the same records in multiple languages (English, Arabic, Hindi, and more) to test i18n and RTL/LTR mixing.

Test Data

Generate correctly formatted test phone numbers for Saudi Arabia, Jordan, UAE, India, US, UK and more.

Test Data

Analyze response size: raw vs compressed bytes, headers size, JSON structure weight and largest fields.

Performance

Generate structured test cases (id, title, preconditions, steps, expected result, priority) from a feature description and field list.

Test Design

How Mutqan Soft can help

More guides

More guides