A Complete Guide to AI Testing Agents for Software Testing
Frank Moyer
Mobile compatibility testing checks that your app works and looks right on the phones, tablets, OS versions, browsers and networks your users actually have. The hard part is fragmentation. The same Android version behaves differently on a Samsung, a Pixel and a budget handset, and a layout that fits one screen can hide a button on another.
This guide shows you how to choose the real iOS and Android devices that matter, what to check on each one, and how to prove a failure really follows a device. It includes a real bug from my own app that looked fine on one Android phone and sent another straight to its home screen.
Jump to: How to choose devices · What to check · How to perform it
A compatibility bug you miss in testing becomes a support ticket or a one-star review from a device you never tested: an older OS version, a budget handset, a foldable. The cost isn’t the bug. It’s shipping it to a whole group of your users and hearing about it from them first.
Mobile compatibility testing catches those bugs before release. It keeps the experience consistent on the devices your users actually carry, and it cuts the support load that follows a launch.
For the wider picture, see Kobiton’s ultimate guide to mobile app testing.
Compatibility testing breaks down by what changes between one user and the next. Most types cover the environment your app runs in. The last two cover time: older versions you still support and newer ones on the way.
Cross-device testing, sometimes called multi-device testing, checks that one experience holds across the phones, tablets and foldables your users carry. It also checks continuity. A user who starts on a phone and picks up on a tablet should find the same account state, cart or draft. Test that handoff, not just each screen on its own.
Hardware testing checks your app against the physical parts of each phone: screen size and density, chipset, memory, cameras, sensors, biometrics and NFC. An emulator can model a screen size. It can’t model a budget chipset under memory pressure. Here’s more on when emulators, simulators and real devices each fit.
OS compatibility testing checks your app across the iOS and Android versions your users run. iOS users update fast because Apple ships each release to most supported iPhones at once, so the current and previous major versions cover most of them. Android spreads out further. Each manufacturer ships its own build and its own update schedule, so the same Android version can behave differently from one brand to the next. Always include your minimum supported version, the latest release and the versions most of your users are on.
Software compatibility testing checks that your app works alongside the other software on the device: third-party keyboards, password managers, accessibility services, and the apps it hands off to for sharing, payments or sign-in. For platform specifics, see understanding iOS and Android app testing and our iOS and Android app testing guides.
Network testing checks how your app behaves on different connection types and speeds: Wi-Fi, 5G, LTE and slow or lossy links. Real-World Network Conditions below covers what users actually hit.
For mobile web content and hybrid apps, test the browsers and in-app WebViews your users rely on: Chrome and Samsung Internet on Android, Safari on iOS, and the WebView embedded in your own app. A pass in Safari does not prove another browser or WebView works. Android’s WebView also updates separately from the OS, which is a common source of “works on my phone” bugs.
Backward compatibility testing checks that a new release still works on the older devices and OS versions you support. It catches features that call APIs older versions don’t have, libraries that quietly drop old OS support, and redesigned screens that need more memory than older phones have.
A large credit union learned this after launching a new app that combined its mobile and online banking. Complaints came in from members on older Android versions. The team added the older Android phones it had on hand to its private device pool, reproduced the problem, and validated the hotfix on those same devices before it shipped.
Test the oldest devices and OS versions you support. Fix what fails, or change the support policy on purpose and tell users before release.
Forward compatibility testing checks your current app against OS versions and devices that aren’t out yet.
Run your critical flows on OS betas before the public release. The mobile team at a retail bank upgrades its test iPads to each new iPadOS beta every week. That habit has caught iPadOS changes that would have broken their apps before those changes reached a single customer.
These are the places compatibility bugs come from, and what to do about each.
Mobile device fragmentation changes what your app can do and how it behaves. Test these five sources of failure:
I build a React Native app and test it on Kobiton. Its form screens have a Next button pinned to the bottom. On my own Galaxy S21+, the button slid behind Android’s gesture navigation bar, even though the app measured the bottom inset correctly. Screens without a keyboard wrapper (the component that moves the form up when the keyboard opens) were fine. The ones with it were not.
My first fix added a small bottom margin. It looked right on the Samsung. Then the automated test ran on a Pixel 10 with Android 16, set to three-button navigation, which reported a bottom inset of zero. The margin wasn’t enough, the test’s tap on Next landed on the navigation bar, and the phone went straight to its home screen.

Same app, same build, two handsets, two navigation modes, two different answers. The fix added a minimum bottom margin on Android, so the button clears the navigation bar even when the device reports no inset. Later runs on the Pixel 10 show the button where it belongs.

The bug lived in the gap between devices, and in a device setting most teams never put in their matrix. It took two different handsets to see it.
An app can pass every functional test and still drain the battery, heat up the phone or get closed by the OS for using too much memory. These problems depend on the chipset, the battery and the manufacturer’s power management, so they show up on specific devices. Watch CPU, memory and battery use during your critical flows on real devices, especially your lowest-tier supported phone.
Switching a test between Wi-Fi and a throttled profile is easy. What users hit is harder: signal dropping mid-upload, a switch from Wi-Fi to cellular, high latency on a crowded network. Test critical flows while conditions change, including going offline and coming back. The app should show a clear state, retry sensibly and keep what the user typed.
Every fix can break something on a device you didn’t retest. Rerun your compatibility flows after each change, not just the one that failed. Here are 5 things to know about regression tests.
Test your supported languages on the smallest screens in your matrix. Check longer labels, right-to-left layouts, dates and currency formats. Here’s more on localization testing.
The device list is where mobile app compatibility testing is won or lost. You can’t test every device, and you don’t need to. You need a device list that looks like your users. Build it from four inputs:
No analytics yet? Start from your support policy and US market data, then replace them with your own numbers. In US mobile web traffic, iOS 18 and newer is 94.9% of iPhone traffic, and Android 11 and newer is 89.7% of Android traffic (StatCounter, June to August 2026).
Plan your support floor
Pick the oldest iOS and Android versions you support. See how much US mobile web traffic that reaches and which real devices to test.
94.9%of US iPhone web traffic on your floor or newer
89.7%of US Android web traffic on your floor or newer
One version older: Android 10 adds 2.9 percentage points of Android web traffic. iOS 17 adds 1.6 percentage points of iPhone web traffic.
Then sort every device into a tier by how many users depend on it and how likely it is to fail:
A budget Android phone or a tablet belongs in Tier 1 if your customers rely on it. Here is an illustrative matrix for a banking app:
Tier 1: busiest or highest-risk
Tier 2: the rest of your supported mix
Tier 3: uncommon form factors
Four Tier 1 devices cover the top iPhone, the top Android, the oldest supported iOS and the budget Android most older customers carry. The foldable earned its place from crash reports, not market share.
The fallback detail matters. Some devices run your app but lack a feature it uses, like NFC, a particular camera or biometrics. Test that the app hides the feature or explains it clearly. That code path gets far less testing than the happy path.
What this looks like at real teams:
Review the matrix every quarter, and after every major OS release or shift in usage.
Emulators and simulators are good for:
You need a real device for:
An emulator can fake a battery level or a GPS fix. It can't run Samsung's build of Android, and that's where my Next button first broke. Use emulators early, then validate critical flows on real devices before every release.
Where those real devices live is a separate choice: public cloud, private devices, or on-premises when test data must stay inside your network. Our guide to cloud mobile app testing covers how to pick.
Run these ten checks on every device in your matrix.
Step 5 matters because the test itself can be the device-specific part. Android's default alert style shows button text in capitals, so a test in my app that looked for "Delete everything" never found "DELETE EVERYTHING" on Android and failed there only. Nothing was wrong with the app.
Trigger these from your CI/CD (continuous integration and delivery) pipeline so nobody has to remember:
Here is the Next button bug from earlier, run through that procedure on Kobiton.
Pick the devices. My private pool covers Galaxy S21, S22 and S25 models, Pixel 6 and 6 Pro, and iPhones from the SE to the 15 Pro. Newer models like the Pixel 10 come from Kobiton's public device cloud when the pool doesn't have them.

Run the flow. The automated test filled in the form and tapped Next on a Pixel 10 from the public cloud. Session Explorer keeps a screenshot for each command on a timeline, so the moment the tap landed on the navigation bar is right there, and so is the retest after the fix.
Add coverage. After the fix, I also ran the app's forms on a Pixel 6, a different screen size and density, to confirm the buttons stayed visible with the keyboard up and down.

Keep the evidence. This Appium session keeps the device, OS version, video, device logs and Appium logs (the command log from Appium, the widely used open-source framework for automating mobile apps) together, so the defect report carries its own proof.

Reuse it. Capture a manual flow on each platform and convert each session into a test case. Then generate an Appium script from the test case and run it on the matching devices in your matrix.
Four habits keep compatibility testing from sliding back into guesswork.
Test the fallback path, not just the feature. Every device that lacks NFC, a camera or biometrics is running code most of your tests never touch.
Put the device, OS and navigation mode in every bug title. A defect that says "Pixel 10, Android 16, three-button nav" gets reproduced in minutes. One that says "button broken" doesn't.
Retest on the same device that failed. A pass on a different phone proves nothing about the fix.
Add one device from crash reports every quarter. Your users tell you which devices matter. Automate the flows on it once it's in the matrix.
Can I do mobile compatibility testing on emulators? For early checks, yes. For release, no. Emulators can't reproduce manufacturer builds, real memory limits or real hardware, so validate critical flows on real devices before every release.
How many devices do I need? Enough to cover your busiest devices from analytics, your oldest supported OS on each platform, and any device with recurring failures in crash reports. Your matrix grows from those three sources, not from a fixed number.
What's the difference between backward and forward compatibility testing? Backward compatibility checks a new release on older devices and OS versions you still support. Forward compatibility checks your current app on upcoming OS versions, usually by testing on betas.
Compatibility bugs live in the gaps between devices. Finding them takes a device list that looks like your users, a clear list of what to check on each one, and the discipline to prove a failure follows the device before you file it. Kobiton is built for that:
Want to see where your own app breaks? Request a demo and run it on real devices with our team.