Skip to content

Testing

Manual testing

Some types of tests:

  • smoke test: to verify the build is stable. Quick, basic test. Takes several minutes, just to see whether the app's basic functionality is there and the app doesn't crash.
  • regression test: to verify no new bugs were added in the last build. Sometimes after adding a new feature or fixing a bug, another feature or an unrelated part of the app might get broken. This test is more thorough and should cover all or most use cases.
  • functional test: to verify a new feature. Makes sure the new feature or any new changes work as they should, regardless of whether other parts of the app have any issues.
  • UX & localisation tests: to make sure that all strings fit in their allocated spaces, design elements are constricted to where they should be and don't overflow, app is easy to use from a visual point of view, and to check that translations are displayed correctly and do not hinder smooth user experience.

Smoke tests

Use them if there were:

  • minor changes in the code
  • minor design changes or any other minor changes (new copy in strings etc.)

Scenario 1: go through onboarding, log in, create group, add second member, add an expense, settle debt. Open Premium screen and check the prices, check that the purchase dialogs appear after clicking on each purchase option.

Scenario 2: + change group colour, edit group name, edit member name. Share link button opens share dialog. Add expense from bill, Android: change app language.

Scenario 3: + delete user account, sign back in with the same account as a new user.

Regression tests

Use them if there were:

  • major changes in the code (whole new features and flows, buttons, menus changed, refactoring, etc.)
  • major changes in design or UX (new screens, buttons, behaviour, swiping etc.)

Transactions

For each type of transaction (expense, expense from bill, income, transfer), check that these changes work as expected:

  • add new from FAB, from circles
  • multiple people paid
  • selecting currency
  • edit who paid, edit for whom, select all/none. Notice whether the amounts make sense based on member weights.
  • split by amounts, split by shares, split by percentages
  • add category, add receipt photo; edit category, delete or select another photo
  • filter by purpose, date, category, member; check paid/spent/show all
  • date and time; future tx, recurring tx: change start date, change period
  • exchange rate
  • longclick on expense: edit/duplicate/delete

Debts

  • mark as settled
  • generate QR code, pay via bank app
  • remind debtor

Members

  • different weights
  • unselected for future txs
  • this is me – affects who is selected as default payer when adding tx via circles
  • photo upload, change, delete
  • QR code with bank account
  • balances seem correct
  • filter "Transactions with this member" works
  • transfer ownership

User & Purchases

  • create account, delete account
  • profile picture: take photo, choose from gallery, delete
  • join group via link sent in Fb messenger, via QR code
  • join group as existing member, new member, without creating a member
  • change login email
  • Premium screen from left menu: buttons work, GP slider works and calculated per member prices correctly, selecting group from GP works; purchase dialogs appear after clicking on each purchase option
  • purchasing products works from Premium screen from left menu, from bottom sheet (collapsed and expanded), from before ad, from Edit group screen

Group

  • change name, colour, currency
  • debt minimization
  • archive/close/leave
  • start a similar group
  • exchange rates: reset to fixed/automatic
  • buy GP from Edit group screen

Connectivity

What happens when the device is offline. Transactions can be added and they are synced when devices goes online (check along web app, both directions). Premium screen has placeholders showing no prices, products cannot be purchased.

Automated testing

AI tests

Firebase opened AI-powered automatic tests in its App Distribution menu as a Preview feature.

Test scenarios are written in natural language in Firebase console or in a yaml file and imported. The test includes goals, hints and assertion of success. The AI then tries to understand the goals and hints and actually click in the app to reach the goals. Testing can be done on physical or virtual devices provided by Google. The app is readily installed on the device and tested as a fresh install. Tests can be chained together via a prerequisite test id. Only the end test should be run at once, because it will also run all its prerequisite tests. As of March 2026, there is a timeout of 5 minutes since it's still a Preview feature, so only simple tests can be run successfully.

The yaml file might look like this. Notice the prerequisite test case id.

tests:
  - displayName: 01 Onboarding and login
    id: onboarding-and-login
    steps:
      - goal: Go through onboarding
        hint: Click Next to see all onboarding pages and go to login.
        finalScreenAssertion: Sign in page displays.
      - goal: Sign in
        hint: >-
          Use email/password auth provider. Enter email 'testcase@stepuplabs.io'
          and enter password 'testcase'.
        finalScreenAssertion: You are logged in and see the main screen.
  - displayName: 02 Create group, add member
    id: new-group
    prerequisiteTestCaseId: onboarding-and-login
    steps:
      - goal: Create group
        hint: Click Create a new group, name it 'Friends', click Create group.
        finalScreenAssertion: A group is created and its name Friends is visible in a tab.
      - goal: Add group member
        hint: >-
          Click on three dots in the upper right-hand corner, select Members,
          click on New member, name them 'Johnny', save, go back to main group
          screen.
        finalScreenAssertion: >-
          The Recent activity card shows that Test User added a member called
          Johnny.

The tests can be run manually within Firebase console. Note again that if the test cases are chained via prerequisites, only the last test case needs to be run – the run will include all the prerequisite tests as well.

The CI is set up that it runs a specific test after each release. Its config lives in RTDB.

It is allowed to run tests in parallel; use the belowmentioned delimiters.

  • appDistributionTestCases defines the test to be run. Delimiter is coma ,.
  • appDistributionTestDevices selects the device and its specification. Version is the API version, locale can be changed and the app will be tested in that language, orientation can be forced to landscape if needed (for tablets). Model is the id from a long list of devices that Google offers. The list can be exported at test environment catalogue. We are using a virtual "medium phone" with id MediumPhone.arm. Delimiter within individual parameters is a semicolon ;.

Robo tests

Robo test on Android apk

Robo test on iOS ipa

Tried a few times, cannot pass through login, so far it's useless.

How to find Android .apk to download and test

Read about many options in the chapter on builds.

How to get iOS .ipa

Ask Radovan.