Spur | Blog

Testing Mobile Apps the Way Your Users Actually Use Them

Mobile is where most QA strategies quietly fall apart.

Teams that have solid, automated coverage on the web often have a spreadsheet, a contractor, and a prayer on mobile. The reasons are structural: mobile operating systems, iOS especially, are built around a curated, locked‑down trust model. That model is great for users and terrible for testers. The same walls that keep attackers out keep your automation out.

The industry's usual answer has been to break into the app, inject a library, swizzle the runtime, re‑sign the binary, and fork low‑level agents to wrestle control from the OS. It works, but it comes with a cost that rarely makes it into the sales deck:

You’re no longer testing the app you ship.

Spur takes a different path. Instead of modifying your app, Spur drives it like a person would, an AI agent that looks at the screen, understands it, and acts. Here’s why that matters, and what it unlocks.

Why mobile testing is hard

There are three problems every mobile automation effort runs into:

  1. The OS won’t cooperate. iOS provides no supported way for an external tool to reach into a running app. Android is a little friendlier, but real‑device fragmentation and flaky tooling erode any head start.
  2. Selectors are a moving target. Traditional frameworks bind tests to element IDs, XPaths, and accessibility identifiers. The moment a designer renames a button or reflows a screen, your suite turns red, not because the app broke, but because the test did.
  3. Maintenance eats the ROI. Teams don’t abandon mobile automation because they can’t get it working once. They abandon it because keeping it green costs more than the bugs it catches.

Every approach to mobile testing is really an answer to problem #1, how do you get control? The answer you choose determines whether you also inherit problems #2 and #3.

Two philosophies: instrument the app, or drive the app

Most tools get control by going inside the binary.

The instrumentation approach injects a dynamic library at install time, re‑signs the app with custom certificates, and uses runtime hooks to expose test controls. It’s clever engineering, but it means:

Spur gets control the way a human tester does: by looking at the screen and interacting with it.

There’s no library in your binary, no re‑signing requirement, no swizzling. Spur runs your real app on real iOS simulators and Android emulators, and an AI agent perceives the UI visually and performs actions, taps, types, scrolls, swipes, gestures, based on plain‑English instructions.

The difference in one line:

Instrumentation changes the app so the test can see it. Spur teaches the test to see the app.

How Spur tests mobile

1) You write tests in plain English

No selectors. No coordinates. No code.

"Open the app, continue as guest, search for ‘white jackets’, and confirm results appear."

That’s a Spur test. You describe the goal the way you’d hand it to a teammate holding the phone, and the agent figures out the interactions. Anyone on the team, QA, PM, support, can author coverage, not just SDETs.

2) An AI agent sees the screen and acts

Under the hood, Spur’s agent uses a vision‑language model to understand what’s actually on screen and decide the next action. Because it reasons about the UI the way a person does, it:

3) It runs unmodified, on real simulators and devices

Your app runs exactly as built. Spur orchestrates the device, launches the app, drives native gestures, and observes results. Native actions, relaunch, foreground, deep links, back navigation, device rotation, shake, keyboard input, toast assertions, are all first‑class, expressed in the same natural-language flow.

4) Environments and builds are handled

Point a test at a build (iOS or Android) and an environment, and Spur manages install, configuration, credentials, and deep links per environment. Promote the same test across dev, staging, and production without rewriting a thing.

What you can automate first on mobile

If you’re not sure where to start, the highest‑leverage journeys are the ones that break most often, and hurt most when they do:

Start with your highest‑traffic, highest‑revenue path, describe it in a sentence, and let the AI draft it. You’ll have real coverage running in minutes, not sprints.

A quick mental checklist for “good” mobile tests

Watch it happen: live streaming

Automation you can’t see is automation you can’t trust. Spur lets you stream a live, interactive session of the device right in your browser, tap through the app yourself, reproduce an issue, or watch a test drive the flow in real time.

Every run is recorded, with network and console logs captured, so a failure comes with the evidence attached instead of a stack trace and a shrug.

Beyond the screen: network + console observability

A passing tap isn’t proof that everything worked. The most damaging mobile bugs are the ones the screen doesn’t show, a checkout that looks successful but fires a 500 to the payments API, an analytics event that silently stops sending, a token that leaks in a request header, a retry storm quietly draining battery.

Spur runs two dedicated observability agents alongside every mobile test so those failures can’t hide.

The network agent

The network agent captures the requests your app makes, to your own backend and to third‑party SDKs, and turns invisible behavior into something you can assert on:

The console log agent

The console log agent captures the app’s own logs, warnings, errors, and stack traces that rarely surface in the UI. When a test fails, you don’t get “element not found”; you get the underlying exception, correlated to the step that triggered it.

Together, these shift mobile QA from “did the screen look right?” to “did the app actually behave correctly end‑to‑end?”

Why this wins

AI Insights