Replay the agent-device flows in smoke/ on each selected device, then
check the app's own diagnostics agree that nothing broke.
mix mob.smoke # the one connected emulator/simulator
mix mob.smoke --device emulator-5554
mix mob.smoke --all-devices --junit _build/smoke.xmlNeeds the agent-device CLI (npm i -g agent-device) and the app installed
and running on the device. Flows are .ad scripts recorded by hand; see the
"Smoke flows on devices" section of the README for the recipe.
What is checked
- The device is free. A device another
agent-devicesession holds is skipped and reported with that session and workspace. The run fails. - The flows pass.
agent-device testruns the<flows>/*.adscripts. Its JSON says"success": trueeven when scripts fail, so the counts are what is judged: any failed or not-run flow, or none executed, fails. - The app held up (unless
--no-health).Mob.Diag.health/0is read over dist before the first flow and after each one, attaching without restarting the app. A store whoselostorresetsrose, or a rise in the listener's undeliverable events, fails the run. On mob 0.9.7 or later, which receipts native taps, no new receipts during a flow is a warning: its taps did not reach this app (on older mob it is a note). An unreachable node, or a mob too old for these functions, is a note, and those flows are reported as not checked: the summary's health column says so and a passing run does not claim the app held up. If the node is unreachable at the start, it is awaited once more after the first flow.
The counters belong to the app's BEAM, and a flow that opens with
--relaunch starts a new one. So with health on each flow is its own
agent-device test run, health is read between flows (waiting up to 15 s
for a relaunched app's node to come back), and a reading from a new BEAM is
compared against zero. Health that cannot be read after a flow is a warning
naming that flow. With --no-health the flows run as one suite.
Options
--device/--only(-d) — target a device by serial/udid. Repeatable--all-devices— every emulator and simulator--all-physical— every physical device (with--all-devices: everything)--ios-only/--android-only— restrict discovery to one platform--flows DIR— directory of.adflows (default:smoke)--retries N— retry each failed flow up to N times (default: 0). Always passed to agent-device, so it overrides a script's owncontext retries=--artifacts-dir DIR— agent-device artifacts underDIR/<device>/(per flow,DIR/<device>/<flow>/; default:_build/mob_smoke)--junit PATH— JUnit reports, the device id (and, per flow, the flow name) appended to the file name--no-health— skip theMob.Diagcomparison--fail-fast— stop a device's flows at the first one that fails the run: a failed replay, a non-zero exit, or a health failure--cookie C— dist cookie (default: the app's private cookie)
With no selection flags exactly one emulator/simulator is picked; a lone
phone needs --device or --all-physical, because the flows drive it.
Exit status
Non-zero when any device failed a flow, was blocked or could not be addressed, or had a health failure.
Android and mobile-mcp
Android allows one UiAutomation client. While mobile-mcp's
com.mobilenext.mobilecli.DeviceServer runs on the phone, agent-device
snapshots fail with "Android snapshot helper output could not be parsed".
The report then names the command that stops it; it is not stopped for you.