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.
appDistributionTestCasesdefines the test to be run. Delimiter is coma,.appDistributionTestDevicesselects 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 theidfrom 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 idMediumPhone.arm. Delimiter within individual parameters is a semicolon;.
Robo tests¶
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.