Guide · updated 4 October 2026
Test case examples: the format, test scenarios and 31 sample test cases
The fields every test case needs, shown on one annotated example, the difference between a test scenario and a test case, and 31 sample test cases you can copy.
This page is a set of examples. For the method behind them, read the guide to writing test cases. For sign-in and payment, there are separate sets of login test cases and checkout test cases. The samples here cover the features those leave out: search, sign-up form validation, profile and settings, uploads, notifications and a contact form.
Test case format
A test case has the same fields wherever it is written. Here they are on one example, UPL-03, with what each field is for:
- ID:
UPL-03. A section reference and a number. It never changes once written, so people can quote it in messages and bug reports. - Title (journey): A file over the size limit is refused clearly. What is checked, in a customer’s words. It should make sense without opening the case.
- Preconditions: Signed in. An image larger than the app's upload limit. Everything that must be true before step one.
- Steps: one action per step, with buttons named as they appear on screen.
- Open Profile.
- Tap Change photo.
- Choose the large image.
- Test data: the oversized image. Many templates give test data its own column. In the format below it sits in the preconditions, which keeps the table to five fixed columns.
- Expected result: A message gives the size limit. No progress bar runs forever. The old photo stays in place. Concrete enough to judge pass or fail without asking anyone, including what must not happen.
- Platform columns: one each for web, Android and iOS. Leave the cell empty where the case needs running, and write
N/Awhere the feature does not exist on that platform. - Status: not written into the plan. It is recorded when the case is run, once per platform, and it changes with every build. That is why the platform cells start empty.
As a table row, the same case reads: UPL-03 | A file over the size limit is refused clearly | preconditions | steps | expected result | WEB | AND | IOS. The template at the end of this page uses exactly that layout.
Test scenario vs test case
A test scenario is one thing a user is trying to do, in a sentence. It says what to test, not how. A test case is one specific way that scenario can go, with preconditions, steps and an expected result. One scenario usually becomes several cases: the path that works, and each way it can be refused or go wrong.
Three scenarios from the samples below, broken into their cases:
- A customer finds a product by searching. Found by name (
SRCH-01), nothing found (SRCH-02), typed in capitals (SRCH-03), filtered (SRCH-04), back from a result (SRCH-05), symbols in the search (SRCH-06). - A user changes their profile photo. From the library (
UPL-01), from the camera (UPL-02), too large (UPL-03), the wrong type (UPL-04), interrupted by the network (UPL-05). - A customer asks support for help. A normal message (
CONT-01), an empty one (CONT-02), a long one (CONT-03), with a screenshot (CONT-04), written offline (CONT-05).
More test scenario examples, each of which would break into its own cases:
- A user deletes their account.
- A customer saves a product to a wishlist and finds it later on another device.
- A user switches the app’s language.
- A customer shares a product link with a friend who does not have the app.
- A user opens the app after an update.
- A user turns on dark mode.
Write the scenarios first, as a list. They show what the plan covers at a glance, and any journey with no scenario is a gap. Then write the cases under each one.
Sample test cases
31 cases for a typical shop app on web, Android and iOS, in 6 sections:
- Search (6 cases)
- Sign-up form validation (5 cases)
- Profile and settings (5 cases)
- File and photo upload (5 cases)
- Notifications (5 cases)
- Contact and feedback form (5 cases)
Change the names of buttons and screens to match your app, and delete the cases for features you do not have.
Search (SRCH)
Search is easy to demo and easy to get wrong at the edges: no results, odd characters, and losing your place when you go back.
SRCH-01 Search finds a product by its name
- Preconditions: A product called Blue canvas tote is in the catalogue
- Steps:
- Tap the search bar.
- Type canvas tote.
- Tap Search.
- Expected result: Blue canvas tote is in the first few results. Each result shows a name, a picture and a price.
- Platforms: Web, Android, iOS
SRCH-02 A search with no results says so
- Preconditions: Any product catalogue
- Steps:
- Tap the search bar.
- Type zzqx.
- Tap Search.
- Expected result: A message says nothing matched zzqx and suggests checking the spelling or browsing categories. No blank screen, no spinner left running.
- Platforms: Web, Android, iOS
SRCH-03 Capital letters and extra spaces make no difference
- Preconditions: A product called Blue canvas tote is in the catalogue
- Steps:
- Type CANVAS Tote with a space before and after.
- Tap Search.
- Expected result: The same results as SRCH-01, in the same order.
- Platforms: Web, Android, iOS
SRCH-04 A filter narrows the results and can be cleared
- Preconditions: Products under and over 20 match the word tote
- Steps:
- Search for tote.
- Apply the filter Price under
- Clear the filter.
- Expected result: With the filter on, only products under 20 are shown and the result count drops. Once cleared, all the results return and tote is still in the search bar.
- Platforms: Web, Android, iOS
SRCH-05 Going back from a result keeps the search
- Preconditions: At least ten products match the word tote
- Steps:
- Search for tote.
- Scroll down and open the fifth result.
- Go back.
- Expected result: The same results are shown, with tote in the search bar and the list near where you left it. The search does not start again from empty.
- Platforms: Web, Android, iOS
SRCH-06 Symbols in a search do not break it
- Preconditions: Any product catalogue
- Steps:
- Type 50% & "tote" into the search bar.
- Tap Search.
- Expected result: Results or the no-results message appear. No error page, no crash, and the text in the search bar is unchanged.
- Platforms: Web, Android, iOS
Sign-up form validation (REG)
These check the form itself, not the account behind it. An existing email and a short password are covered in the guide to writing test cases.
REG-01 An empty form is not sent
- Preconditions: Signed out
- Steps:
- Tap Create account.
- Leave every field empty.
- Tap Create account again.
- Expected result: Each required field shows its own message saying it is needed. The first one is visible without scrolling. Nothing is sent.
- Platforms: Web, Android, iOS
REG-02 An email address without an @ is refused
- Preconditions: Signed out
- Steps:
- Tap Create account.
- Enter a name, anna.example.com as the email and a valid password.
- Tap Create account.
- Expected result: A message beside the email field asks for a valid email address. The name and password are still filled in. No account is created.
- Platforms: Web, Android, iOS
REG-03 Spaces around the email address are ignored
- Preconditions: Signed out. No account exists for anna@example.com
- Steps:
- Tap Create account.
- Enter a name, anna@example.com with a space before and after, and a valid password.
- Tap Create account.
- Sign out and sign in with anna@example.com, no spaces.
- Expected result: The account is created and signing in without the spaces works.
- Platforms: Web, Android, iOS
REG-04 A name with an accent or an apostrophe is accepted
- Preconditions: Signed out. No account exists for the email you will use
- Steps:
- Tap Create account.
- Enter the name Siobhán O'Neill, a new email and a valid password.
- Tap Create account.
- Open Profile.
- Expected result: The account is created. Profile shows Siobhán O'Neill exactly as typed, with no odd symbols in place of the accent.
- Platforms: Web, Android, iOS
REG-05 The terms box must be ticked
- Preconditions: Signed out. The form has a box to accept the terms
- Steps:
- Fill in every field correctly.
- Leave the terms box unticked.
- Tap Create account.
- Expected result: A message says the terms must be accepted. Everything typed is kept. No account is created.
- Platforms: Web, Android, iOS
Profile and settings (PROF)
Edits that look saved but are not, and settings that change on one device and not another, are the usual bugs here.
PROF-01 Change your display name
- Preconditions: Signed in
- Steps:
- Open Profile.
- Tap Edit.
- Change the name.
- Tap Save.
- Sign out and sign in again.
- Expected result: The new name shows on Profile and everywhere else the name appears, and is still there after signing in again.
- Platforms: Web, Android, iOS
PROF-02 Leaving without saving keeps the old value
- Preconditions: Signed in
- Steps:
- Open Profile.
- Tap Edit.
- Change the name.
- Go back without tapping Save.
- Expected result: The old name is still shown. If the app asks whether to discard the change, choosing Discard keeps the old name.
- Platforms: Web, Android, iOS
PROF-03 A new email address must be confirmed
- Preconditions: Signed in. An inbox for the new address that you can open
- Steps:
- Open Settings.
- Change the email address.
- Tap Save.
- Open the link in the confirmation email.
- Expected result: Until the link is opened, the account still uses the old address. After it is opened, sign-in works with the new address and not the old one.
- Platforms: Web, Android, iOS
PROF-04 A setting follows you to another device
- Preconditions: Signed in on two devices
- Steps:
- On the first device, open Settings and turn off Marketing emails.
- Open Settings on the second device.
- Expected result: Marketing emails shows as off on both devices, including after the app is closed and reopened.
- Platforms: Web, Android, iOS
PROF-05 Saving with no connection keeps your changes
- Preconditions: Signed in. Aeroplane mode on
- Steps:
- Open Profile.
- Tap Edit.
- Change the name.
- Tap Save.
- Turn aeroplane mode off and tap Save again.
- Expected result: The first save says the change was not saved, and the new name stays in the field. The second save works.
- Platforms: Web, Android, iOS
File and photo upload (UPL)
Uploads fail in quiet ways: a photo on its side, a progress bar that never ends, an old photo replaced by a broken one.
UPL-01 Upload a profile photo from the library
- Preconditions: Signed in. A JPEG photo under 5 MB on the device
- Steps:
- Open Profile.
- Tap Change photo.
- Choose a photo from the library, or a file on the web.
- Confirm.
- Expected result: The new photo shows on Profile within a few seconds and is still there after the app is closed and reopened.
- Platforms: Web, Android, iOS
UPL-02 A photo taken with the camera is the right way up
- Preconditions: Signed in. Camera access allowed
- Steps:
- Open Profile.
- Tap Change photo.
- Choose Take photo.
- Take a photo holding the phone upright.
- Confirm.
- Expected result: The photo appears upright, not on its side, on Profile and wherever else it is shown.
- Platforms: Android, iOS (Web marked N/A: it does not apply there)
UPL-03 A file over the size limit is refused clearly
- Preconditions: Signed in. An image larger than the app's upload limit
- Steps:
- Open Profile.
- Tap Change photo.
- Choose the large image.
- Expected result: A message gives the size limit. No progress bar runs forever. The old photo stays in place.
- Platforms: Web, Android, iOS
UPL-04 A file of the wrong type is refused
- Preconditions: Signed in. A PDF or text file on the device
- Steps:
- Open Profile.
- Tap Change photo.
- Try to choose the PDF or text file.
- Expected result: The picker does not offer it, or a message says which file types are accepted. Nothing is uploaded and the old photo stays.
- Platforms: Web, Android, iOS
UPL-05 An upload interrupted by the network can be retried
- Preconditions: Signed in. A large photo on the device
- Steps:
- Start uploading the photo.
- Turn on aeroplane mode before it finishes.
- Turn aeroplane mode off.
- Tap Retry.
- Expected result: A message says the upload failed, with a Retry button. No half-loaded image is shown as the profile photo. The retry succeeds.
- Platforms: Web, Android, iOS
Notifications (NOTIF)
Push needs a real phone, because a simulator cannot receive one from the push service. Email cases need an inbox you can open.
NOTIF-01 A push notification opens the right screen
- Preconditions: Signed in on a real phone, not a simulator. Notifications allowed. A test order
- Steps:
- Put the app in the background.
- Mark the test order as shipped.
- Tap the notification.
- Expected result: A notification naming the order arrives within a minute. Tapping it opens that order, not the home screen.
- Platforms: Android, iOS (Web marked N/A: it does not apply there)
NOTIF-02 A notification opens the app from closed
- Preconditions: Signed in on a real phone. Notifications allowed. A test order
- Steps:
- Swipe the app away.
- Mark the test order as shipped.
- Tap the notification.
- Expected result: The app starts, stays signed in, and opens straight to the order.
- Platforms: Android, iOS (Web marked N/A: it does not apply there)
NOTIF-03 Turning a notification type off is respected
- Preconditions: Signed in on a real phone. Notifications allowed. A test order
- Steps:
- Open Settings, then Notifications.
- Turn off Order updates.
- Mark the test order as shipped.
- Expected result: No push notification arrives for the order. Other notification types still arrive.
- Platforms: Android, iOS (Web marked N/A: it does not apply there)
NOTIF-04 An email notification arrives and its link works
- Preconditions: Signed in. A test order. An inbox for the account that you can open
- Steps:
- Mark the test order as shipped.
- Open the email.
- Tap View order.
- Expected result: The email arrives within a few minutes, with a sender and subject that say what it is. The link opens that order, after sign-in if needed.
- Platforms: Web, Android, iOS
NOTIF-05 Unsubscribe from marketing emails
- Preconditions: A marketing email in the account's inbox
- Steps:
- Open the email.
- Tap Unsubscribe.
- Expected result: A page confirms it without asking you to sign in. No more marketing emails arrive, order emails still do, and Settings shows Marketing emails as off.
- Platforms: Web (Android, iOS marked N/A: it does not apply there)
Contact and feedback form (CONT)
The form people use when something else has gone wrong. Check that what they write reaches the support inbox, whole and once.
CONT-01 Send a message to support
- Preconditions: Signed in. Access to the support inbox
- Steps:
- Open Help, then Contact us.
- Enter a subject and a message.
- Tap Send.
- Expected result: A confirmation says the message was sent and when to expect a reply. The message arrives in the support inbox once, with the sender's email address.
- Platforms: Web, Android, iOS
CONT-02 An empty message is not sent
- Preconditions: Signed in
- Steps:
- Open Contact us.
- Leave the message empty.
- Tap Send.
- Expected result: A message says the message field is needed. Nothing arrives in the support inbox.
- Platforms: Web, Android, iOS
CONT-03 A long message is not cut short
- Preconditions: Signed in. Access to the support inbox. About 2,000 characters of text
- Steps:
- Open Contact us.
- Paste the text into the message.
- Tap Send.
- Expected result: Either the whole text arrives in the support inbox, or the form shows the limit before you send. Nothing is cut off without warning.
- Platforms: Web, Android, iOS
CONT-04 A screenshot can be attached
- Preconditions: Signed in. Access to the support inbox. A screenshot on the device
- Steps:
- Open Contact us.
- Write a message.
- Attach the screenshot.
- Tap Send.
- Expected result: The message arrives with the screenshot attached, and the screenshot opens.
- Platforms: Web, Android, iOS
CONT-05 A message written offline is not lost
- Preconditions: Signed in. Aeroplane mode on
- Steps:
- Open Contact us.
- Write a message.
- Tap Send.
- Turn aeroplane mode off and tap Send again.
- Expected result: The first send says the message was not sent and keeps the text. The second send works, and the message arrives once.
- Platforms: Web, Android, iOS
The template
All 31 sample test cases in the format qarunbook imports: a heading per section with its reference in brackets, one table per section, one row per case, and a column each for web, Android and iOS, with N/A where a case does not apply.
# Shop app — sample test cases ## Search (SRCH) | ID | Journey | Preconditions | Steps | Expected result | WEB | AND | IOS | |---|---|---|---|---|---|---|---| | SRCH-01 | Search finds a product by its name | A product called Blue canvas tote is in the catalogue | 1. Tap the search bar. 2. Type canvas tote. 3. Tap Search. | Blue canvas tote is in the first few results. Each result shows a name, a picture and a price. | | | | | SRCH-02 | A search with no results says so | Any product catalogue | 1. Tap the search bar. 2. Type zzqx. 3. Tap Search. | A message says nothing matched zzqx and suggests checking the spelling or browsing categories. No blank screen, no spinner left running. | | | | | SRCH-03 | Capital letters and extra spaces make no difference | A product called Blue canvas tote is in the catalogue | 1. Type CANVAS Tote with a space before and after. 2. Tap Search. | The same results as SRCH-01, in the same order. | | | | | SRCH-04 | A filter narrows the results and can be cleared | Products under and over 20 match the word tote | 1. Search for tote. 2. Apply the filter Price under 20. 3. Clear the filter. | With the filter on, only products under 20 are shown and the result count drops. Once cleared, all the results return and tote is still in the search bar. | | | | | SRCH-05 | Going back from a result keeps the search | At least ten products match the word tote | 1. Search for tote. 2. Scroll down and open the fifth result. 3. Go back. | The same results are shown, with tote in the search bar and the list near where you left it. The search does not start again from empty. | | | | | SRCH-06 | Symbols in a search do not break it | Any product catalogue | 1. Type 50% & "tote" into the search bar. 2. Tap Search. | Results or the no-results message appear. No error page, no crash, and the text in the search bar is unchanged. | | | | ## Sign-up form validation (REG) | ID | Journey | Preconditions | Steps | Expected result | WEB | AND | IOS | |---|---|---|---|---|---|---|---| | REG-01 | An empty form is not sent | Signed out | 1. Tap Create account. 2. Leave every field empty. 3. Tap Create account again. | Each required field shows its own message saying it is needed. The first one is visible without scrolling. Nothing is sent. | | | | | REG-02 | An email address without an @ is refused | Signed out | 1. Tap Create account. 2. Enter a name, anna.example.com as the email and a valid password. 3. Tap Create account. | A message beside the email field asks for a valid email address. The name and password are still filled in. No account is created. | | | | | REG-03 | Spaces around the email address are ignored | Signed out. No account exists for anna@example.com | 1. Tap Create account. 2. Enter a name, anna@example.com with a space before and after, and a valid password. 3. Tap Create account. 4. Sign out and sign in with anna@example.com, no spaces. | The account is created and signing in without the spaces works. | | | | | REG-04 | A name with an accent or an apostrophe is accepted | Signed out. No account exists for the email you will use | 1. Tap Create account. 2. Enter the name Siobhán O'Neill, a new email and a valid password. 3. Tap Create account. 4. Open Profile. | The account is created. Profile shows Siobhán O'Neill exactly as typed, with no odd symbols in place of the accent. | | | | | REG-05 | The terms box must be ticked | Signed out. The form has a box to accept the terms | 1. Fill in every field correctly. 2. Leave the terms box unticked. 3. Tap Create account. | A message says the terms must be accepted. Everything typed is kept. No account is created. | | | | ## Profile and settings (PROF) | ID | Journey | Preconditions | Steps | Expected result | WEB | AND | IOS | |---|---|---|---|---|---|---|---| | PROF-01 | Change your display name | Signed in | 1. Open Profile. 2. Tap Edit. 3. Change the name. 4. Tap Save. 5. Sign out and sign in again. | The new name shows on Profile and everywhere else the name appears, and is still there after signing in again. | | | | | PROF-02 | Leaving without saving keeps the old value | Signed in | 1. Open Profile. 2. Tap Edit. 3. Change the name. 4. Go back without tapping Save. | The old name is still shown. If the app asks whether to discard the change, choosing Discard keeps the old name. | | | | | PROF-03 | A new email address must be confirmed | Signed in. An inbox for the new address that you can open | 1. Open Settings. 2. Change the email address. 3. Tap Save. 4. Open the link in the confirmation email. | Until the link is opened, the account still uses the old address. After it is opened, sign-in works with the new address and not the old one. | | | | | PROF-04 | A setting follows you to another device | Signed in on two devices | 1. On the first device, open Settings and turn off Marketing emails. 2. Open Settings on the second device. | Marketing emails shows as off on both devices, including after the app is closed and reopened. | | | | | PROF-05 | Saving with no connection keeps your changes | Signed in. Aeroplane mode on | 1. Open Profile. 2. Tap Edit. 3. Change the name. 4. Tap Save. 5. Turn aeroplane mode off and tap Save again. | The first save says the change was not saved, and the new name stays in the field. The second save works. | | | | ## File and photo upload (UPL) | ID | Journey | Preconditions | Steps | Expected result | WEB | AND | IOS | |---|---|---|---|---|---|---|---| | UPL-01 | Upload a profile photo from the library | Signed in. A JPEG photo under 5 MB on the device | 1. Open Profile. 2. Tap Change photo. 3. Choose a photo from the library, or a file on the web. 4. Confirm. | The new photo shows on Profile within a few seconds and is still there after the app is closed and reopened. | | | | | UPL-02 | A photo taken with the camera is the right way up | Signed in. Camera access allowed | 1. Open Profile. 2. Tap Change photo. 3. Choose Take photo. 4. Take a photo holding the phone upright. 5. Confirm. | The photo appears upright, not on its side, on Profile and wherever else it is shown. | N/A | | | | UPL-03 | A file over the size limit is refused clearly | Signed in. An image larger than the app's upload limit | 1. Open Profile. 2. Tap Change photo. 3. Choose the large image. | A message gives the size limit. No progress bar runs forever. The old photo stays in place. | | | | | UPL-04 | A file of the wrong type is refused | Signed in. A PDF or text file on the device | 1. Open Profile. 2. Tap Change photo. 3. Try to choose the PDF or text file. | The picker does not offer it, or a message says which file types are accepted. Nothing is uploaded and the old photo stays. | | | | | UPL-05 | An upload interrupted by the network can be retried | Signed in. A large photo on the device | 1. Start uploading the photo. 2. Turn on aeroplane mode before it finishes. 3. Turn aeroplane mode off. 4. Tap Retry. | A message says the upload failed, with a Retry button. No half-loaded image is shown as the profile photo. The retry succeeds. | | | | ## Notifications (NOTIF) | ID | Journey | Preconditions | Steps | Expected result | WEB | AND | IOS | |---|---|---|---|---|---|---|---| | NOTIF-01 | A push notification opens the right screen | Signed in on a real phone, not a simulator. Notifications allowed. A test order | 1. Put the app in the background. 2. Mark the test order as shipped. 3. Tap the notification. | A notification naming the order arrives within a minute. Tapping it opens that order, not the home screen. | N/A | | | | NOTIF-02 | A notification opens the app from closed | Signed in on a real phone. Notifications allowed. A test order | 1. Swipe the app away. 2. Mark the test order as shipped. 3. Tap the notification. | The app starts, stays signed in, and opens straight to the order. | N/A | | | | NOTIF-03 | Turning a notification type off is respected | Signed in on a real phone. Notifications allowed. A test order | 1. Open Settings, then Notifications. 2. Turn off Order updates. 3. Mark the test order as shipped. | No push notification arrives for the order. Other notification types still arrive. | N/A | | | | NOTIF-04 | An email notification arrives and its link works | Signed in. A test order. An inbox for the account that you can open | 1. Mark the test order as shipped. 2. Open the email. 3. Tap View order. | The email arrives within a few minutes, with a sender and subject that say what it is. The link opens that order, after sign-in if needed. | | | | | NOTIF-05 | Unsubscribe from marketing emails | A marketing email in the account's inbox | 1. Open the email. 2. Tap Unsubscribe. | A page confirms it without asking you to sign in. No more marketing emails arrive, order emails still do, and Settings shows Marketing emails as off. | | N/A | N/A | ## Contact and feedback form (CONT) | ID | Journey | Preconditions | Steps | Expected result | WEB | AND | IOS | |---|---|---|---|---|---|---|---| | CONT-01 | Send a message to support | Signed in. Access to the support inbox | 1. Open Help, then Contact us. 2. Enter a subject and a message. 3. Tap Send. | A confirmation says the message was sent and when to expect a reply. The message arrives in the support inbox once, with the sender's email address. | | | | | CONT-02 | An empty message is not sent | Signed in | 1. Open Contact us. 2. Leave the message empty. 3. Tap Send. | A message says the message field is needed. Nothing arrives in the support inbox. | | | | | CONT-03 | A long message is not cut short | Signed in. Access to the support inbox. About 2,000 characters of text | 1. Open Contact us. 2. Paste the text into the message. 3. Tap Send. | Either the whole text arrives in the support inbox, or the form shows the limit before you send. Nothing is cut off without warning. | | | | | CONT-04 | A screenshot can be attached | Signed in. Access to the support inbox. A screenshot on the device | 1. Open Contact us. 2. Write a message. 3. Attach the screenshot. 4. Tap Send. | The message arrives with the screenshot attached, and the screenshot opens. | | | | | CONT-05 | A message written offline is not lost | Signed in. Aeroplane mode on | 1. Open Contact us. 2. Write a message. 3. Tap Send. 4. Turn aeroplane mode off and tap Send again. | The first send says the message was not sent and keeps the text. The second send works, and the message arrives once. | | | |
There are more on the templates page, including a blank plan to fill in, and the example test cases for sign-up, password reset, checkout, offline and permissions.
Running the cases in qarunbook
Once the cases are written, upload them when you choose Add app and qarunbook turns the plan into a board. Each check has a pass or fail per platform. A bug raised on a check goes to the developers, and when it is fixed, the check is tested again before it counts as passed.