You have spent six chapters building up every skill needed to automate a real mobile app. Now you bring them all together. This capstone project asks you to build a complete, production-quality Appium test suite for a banking mobile application — end to end, with proper structure, cross-platform coverage, and CI integration.
The app: FinanceApp
The capstone uses the FinanceApp demo, a fully functional banking app designed specifically for Appium practice. It is available on GitHub as a free open-source test target.
Android: Download FinanceApp-debug.apk from the course resources.
iOS: Download FinanceApp.app (Simulator) from the course resources.
FinanceApp has the features a real banking app would have:
- Login with email and password (and biometric toggle)
- Account dashboard with balance, recent transactions
- Transfer money between accounts
- Bill payment with payee management
- Account statements (WebView)
- Profile and settings
What you will build
A Maven project with the following structure:
financeapp-tests/
├── pom.xml
├── testng.xml
├── testng-parallel.xml
├── .github/workflows/android-tests.yml
└── src/test/java/com/qa/
├── base/
│ └── BaseTest.java
├── pages/
│ ├── LoginPage.java
│ ├── DashboardPage.java
│ ├── TransferPage.java
│ ├── BillPaymentPage.java
│ └── StatementsPage.java
├── tests/
│ ├── LoginTest.java
│ ├── DashboardTest.java
│ ├── TransferTest.java
│ ├── BillPaymentTest.java
│ └── StatementsTest.java
└── utils/
├── DriverFactory.java
└── WaitUtils.java
Test scope
Module 1: Authentication (LoginTest.java)
| Test | Scenario | Tags |
|---|---|---|
validLoginAndroid | Login with correct credentials on Android | smoke |
validLoginIOS | Login with correct credentials on iOS | smoke |
invalidPasswordShowsError | Wrong password shows error message | regression |
emptyEmailShowsValidation | Submit with empty email shows inline error | regression |
sessionPersistsAfterBackground | Background app for 10s, foreground, still logged in | regression |
logoutClearsSession | Logout, relaunch, lands on login screen | regression |
Module 2: Dashboard (DashboardTest.java)
| Test | Scenario | Tags |
|---|---|---|
balanceDisplayed | Account balance visible after login | smoke |
recentTransactionsLoaded | At least 3 recent transactions shown | smoke |
transactionTapShowsDetail | Tap transaction item opens detail screen | regression |
Module 3: Transfer (TransferTest.java)
| Test | Scenario | Tags |
|---|---|---|
successfulTransfer | Transfer $10 from Checking to Savings | smoke |
insufficientFundsError | Transfer more than balance shows error | regression |
decimalAmountAccepted | $10.50 transfer processes correctly | regression |
transferConfirmationRequired | Confirmation dialog appears before transfer | regression |
Module 4: Statements (StatementsTest.java)
| Test | Scenario | Tags |
|---|---|---|
statementsLoadInWebView | Statements page loads HTML table in WebView | smoke |
transactionRowsPresent | Statement table has at least one row | smoke |
returnToNativeAfterStatements | Back button returns to native dashboard | regression |
Acceptance criteria
Your submission must meet all of these:
- All 16 tests pass on an Android emulator running API 34
- Page Object Model — no
findElementcalls in test classes - Explicit waits — no
Thread.sleep()anywhere in the code - Cross-platform — at least the 2 smoke login tests run on both Android and iOS using the same test class
- CI workflow — the GitHub Actions file starts the emulator, runs smoke tests, and uploads surefire results
- Screenshot on failure —
@AfterMethodcaptures and saves screenshots for failed tests - Context switching — the StatementsTest correctly switches to WEBVIEW context
Technical requirements
- Java 11 or later
- Maven
- TestNG with
testng.xmlfor smoke andtestng-parallel.xmlfor regression (parallel="methods", thread-count=3) - Appium Java Client 9.x
Getting started
- Clone the FinanceApp repository from the course resources page
- Install the APK on your emulator:
adb install FinanceApp-debug.apk - Open FinanceApp in Appium Inspector and map all the locators you'll need
- Build your
DriverFactoryandBaseTestfirst — get a driver connecting before writing any page objects - Write
LoginPageandLoginTest— the simplest flow — before tackling the other modules
The walkthrough in the next lesson guides you through every module step by step.