zeno-mobile-runner 0.1.3 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +192 -2
- package/FEATURES.md +50 -7
- package/README.md +168 -120
- package/build.zig.zon +3 -3
- package/clients/README.md +60 -3
- package/clients/go/README.md +12 -0
- package/clients/go/zmr/client.go +142 -0
- package/clients/kotlin/README.md +18 -1
- package/clients/kotlin/build.gradle.kts +1 -1
- package/clients/kotlin/src/main/kotlin/dev/zmr/ZmrClient.kt +76 -1
- package/clients/python/README.md +19 -0
- package/clients/python/pyproject.toml +1 -1
- package/clients/python/zmr_client.py +33 -0
- package/clients/rust/Cargo.lock +1 -1
- package/clients/rust/Cargo.toml +1 -1
- package/clients/rust/README.md +25 -1
- package/clients/rust/src/lib.rs +201 -0
- package/clients/swift/README.md +18 -0
- package/clients/swift/Sources/ZMRClient/ZMRClient.swift +82 -0
- package/clients/typescript/README.md +16 -0
- package/clients/typescript/index.d.ts +12 -0
- package/clients/typescript/index.mjs +16 -0
- package/clients/typescript/package.json +1 -1
- package/docs/agent-discovery.md +151 -22
- package/docs/ai-agents.md +99 -11
- package/docs/benchmarking.md +49 -3
- package/docs/benchmarks/2026-06-09-android-workflow.md +73 -0
- package/docs/benchmarks/2026-06-09-android-workflow.results.jsonl +20 -0
- package/docs/benchmarks/2026-06-09-framework-baseline-status.md +32 -0
- package/docs/benchmarks/2026-06-09-ios-appium-comparison.md +115 -0
- package/docs/benchmarks/2026-06-09-ios-appium-comparison.results.jsonl +40 -0
- package/docs/benchmarks/2026-06-09-ios-demo.md +90 -0
- package/docs/benchmarks/2026-06-09-ios-demo.results.jsonl +20 -0
- package/docs/benchmarks/2026-06-09-ios-maestro-comparison.md +128 -0
- package/docs/benchmarks/2026-06-09-ios-maestro-comparison.results.jsonl +40 -0
- package/docs/benchmarks/2026-06-09-ios-workflow-comparison.md +143 -0
- package/docs/benchmarks/2026-06-09-ios-workflow-comparison.results.jsonl +40 -0
- package/docs/benchmarks/2026-06-09-ios-xctest-floor.md +106 -0
- package/docs/benchmarks/2026-06-09-ios-xctest-floor.results.jsonl +40 -0
- package/docs/benchmarks/README.md +36 -0
- package/docs/benchmarks/benchmark-lab-v1.json +155 -0
- package/docs/benchmarks/benchmark-lab-v1.md +95 -0
- package/docs/clients.md +26 -6
- package/docs/demo.md +40 -1
- package/docs/expo-smoke.md +8 -8
- package/docs/frameworks.md +10 -0
- package/docs/install.md +3 -2
- package/docs/npm.md +100 -4
- package/docs/production-readiness.md +123 -0
- package/docs/protocol-fixtures/core-session.responses.jsonl +1 -1
- package/docs/protocol.md +215 -16
- package/docs/scenario-authoring.md +18 -0
- package/docs/trace-privacy.md +9 -0
- package/docs/troubleshooting.md +7 -1
- package/examples/android-workflow.json +79 -0
- package/examples/ios-shim-workflow.json +79 -0
- package/examples/react-native-expo-workflow.json +75 -0
- package/npm/agents.mjs +16 -0
- package/npm/commands.mjs +9 -5
- package/package.json +6 -1
- package/prebuilds/darwin-arm64/zmr +0 -0
- package/prebuilds/darwin-x64/zmr +0 -0
- package/prebuilds/linux-arm64/zmr +0 -0
- package/prebuilds/linux-x64/zmr +0 -0
- package/schemas/README.md +4 -0
- package/schemas/discover-output.schema.json +83 -0
- package/schemas/draft-output.schema.json +58 -0
- package/schemas/explore-output.schema.json +94 -0
- package/schemas/inspect-output.schema.json +88 -0
- package/schemas/run-output.schema.json +2 -0
- package/scripts/benchmark-lab.py +253 -0
- package/scripts/create-android-demo-app.sh +324 -29
- package/scripts/create-ios-demo-app.sh +174 -7
- package/scripts/create-react-native-expo-demo-app.sh +727 -0
- package/scripts/demo.sh +3 -0
- package/scripts/install-ios-shim.sh +2 -2
- package/scripts/release-readiness.py +43 -0
- package/scripts/run-android-pilot.sh +35 -9
- package/scripts/run-ios-pilot.sh +11 -4
- package/shims/ios/ZMRShim.swift +10 -0
- package/shims/ios/ZMRShimUITestCase.swift +42 -0
- package/shims/ios/protocol.md +1 -0
- package/skills/zmr-mobile-testing/SKILL.md +28 -3
- package/src/cli_discover.zig +239 -0
- package/src/cli_draft.zig +924 -0
- package/src/cli_explore.zig +136 -0
- package/src/cli_import.zig +31 -15
- package/src/cli_inspect.zig +310 -0
- package/src/cli_output.zig +26 -2
- package/src/cli_run.zig +28 -0
- package/src/cli_trace.zig +45 -15
- package/src/cli_validate.zig +12 -6
- package/src/errors.zig +9 -0
- package/src/ios.zig +49 -12
- package/src/ios_shim.zig +36 -2
- package/src/json_rpc_methods.zig +85 -11
- package/src/json_rpc_params.zig +8 -0
- package/src/json_rpc_protocol.zig +1 -1
- package/src/json_rpc_trace.zig +112 -0
- package/src/main.zig +27 -2
- package/src/mcp.zig +209 -6
- package/src/mcp_protocol.zig +29 -1
- package/src/mcp_trace.zig +126 -4
- package/src/report.zig +186 -0
- package/src/runner.zig +26 -4
- package/src/runner_actions.zig +10 -0
- package/src/runner_diagnostics.zig +31 -1
- package/src/runner_events.zig +70 -7
- package/src/runner_native.zig +17 -1
- package/src/runner_waits.zig +82 -19
- package/src/scaffold.zig +28 -12
- package/src/scenario.zig +32 -4
- package/src/schema_registry.zig +4 -0
- package/src/version.zig +1 -1
- package/viewer/app.js +23 -3
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
# 2026-06-09 iOS Simulator ZMR vs Appium Comparison
|
|
2
|
+
|
|
3
|
+
This evidence pack compares ZMR with Appium on the generated public iOS demo
|
|
4
|
+
app. It is a command-level benchmark: each row starts one local runner command,
|
|
5
|
+
executes the same smoke flow on the same booted simulator, and records command
|
|
6
|
+
duration.
|
|
7
|
+
|
|
8
|
+
This is not a universal claim about either project. Treat it as reproducible
|
|
9
|
+
evidence for this app, host, simulator, and flow shape.
|
|
10
|
+
|
|
11
|
+
## Result
|
|
12
|
+
|
|
13
|
+
| Tool | Runs | Pass rate | Failures | Mean duration | p95 duration |
|
|
14
|
+
| --- | ---: | ---: | ---: | ---: | ---: |
|
|
15
|
+
| ZMR | 20 | 100.00% | 0 | 2315 ms | 2339 ms |
|
|
16
|
+
| Appium | 20 | 100.00% | 0 | 3837 ms | 3883 ms |
|
|
17
|
+
|
|
18
|
+
For this run, ZMR was 1.66x faster on mean duration and 1.66x faster on p95
|
|
19
|
+
duration.
|
|
20
|
+
|
|
21
|
+
## Environment
|
|
22
|
+
|
|
23
|
+
| Field | Value |
|
|
24
|
+
| --- | --- |
|
|
25
|
+
| ZMR runner | `0.1.8` |
|
|
26
|
+
| ZMR protocol | `2026-04-28` |
|
|
27
|
+
| Appium | `3.5.0` |
|
|
28
|
+
| Appium XCUITest driver | `11.10.0` |
|
|
29
|
+
| Host OS | macOS 26.6, arm64 |
|
|
30
|
+
| Xcode | 26.5, build 17F42 |
|
|
31
|
+
| Simulator | Booted iOS 26.5 simulator, `zmr-iPhone` |
|
|
32
|
+
| App id | `com.example.mobiletest` |
|
|
33
|
+
| App build label | `generated-ios-demo-20260609` |
|
|
34
|
+
| Demo app source | Generated by `scripts/create-ios-demo-app.sh` |
|
|
35
|
+
|
|
36
|
+
## ZMR Command
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
ZMR_BIN="$PWD/zig-out/bin/zmr" scripts/benchmark.sh \
|
|
40
|
+
--zmr examples/ios-smoke.json \
|
|
41
|
+
--platform ios \
|
|
42
|
+
--ios-device-type simulator \
|
|
43
|
+
--device booted \
|
|
44
|
+
--app-id com.example.mobiletest \
|
|
45
|
+
--xcrun xcrun \
|
|
46
|
+
--app-build generated-ios-demo-20260609 \
|
|
47
|
+
--runs 20 \
|
|
48
|
+
--trace-root traces/public-benchmarks/20260609-ios-appium-comparison/zmr \
|
|
49
|
+
--results traces/public-benchmarks/20260609-ios-appium-comparison/results.jsonl \
|
|
50
|
+
--replace \
|
|
51
|
+
--min-pass-rate 100 \
|
|
52
|
+
--max-failures 0
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
The ZMR scenario launches the app, opens `exampleapp:///e2e-auth?probe=1`, and
|
|
56
|
+
captures a snapshot.
|
|
57
|
+
|
|
58
|
+
## Appium Command
|
|
59
|
+
|
|
60
|
+
The Appium server was started with a temp Appium home:
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
APPIUM_HOME=/tmp/zmr-appium-home-20260609 npx --yes appium@latest --port 4723 --log-level error
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
The XCUITest driver was installed in that temp home:
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
APPIUM_HOME=/tmp/zmr-appium-home-20260609 npx --yes appium@latest driver install xcuitest
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Each measured Appium row created a fresh XCUITest WebDriver session against the
|
|
73
|
+
same bundle id, opened the same deep link with `simctl openurl`, read page
|
|
74
|
+
source, asserted `Deep link opened`, and deleted the session.
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
scripts/benchmark-command.sh \
|
|
78
|
+
--tool appium \
|
|
79
|
+
--platform ios \
|
|
80
|
+
--device booted \
|
|
81
|
+
--app-id com.example.mobiletest \
|
|
82
|
+
--scenario examples/ios-smoke.json \
|
|
83
|
+
--app-build generated-ios-demo-20260609 \
|
|
84
|
+
--runs 20 \
|
|
85
|
+
--trace-root traces/public-benchmarks/20260609-ios-appium-comparison/appium \
|
|
86
|
+
--results traces/public-benchmarks/20260609-ios-appium-comparison/results.jsonl \
|
|
87
|
+
-- node -e '<create session, open deep link, assert page source, delete session>'
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Comparison Report
|
|
91
|
+
|
|
92
|
+
```text
|
|
93
|
+
# Benchmark Comparison
|
|
94
|
+
|
|
95
|
+
| Tool | Runs | Pass rate | Failures | Mean ms | P95 ms |
|
|
96
|
+
| --- | ---: | ---: | ---: | ---: | ---: |
|
|
97
|
+
| zmr | 20 | 100.00% | 0 | 2315 | 2339 |
|
|
98
|
+
| appium | 20 | 100.00% | 0 | 3837 | 3883 |
|
|
99
|
+
|
|
100
|
+
- Mean speedup: 1.66x (-39.7% candidate vs baseline)
|
|
101
|
+
- P95 speedup: 1.66x (-39.8% candidate vs baseline)
|
|
102
|
+
- Same benchmark context: yes
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
The sanitized result rows are committed in
|
|
106
|
+
[2026-06-09-ios-appium-comparison.results.jsonl](2026-06-09-ios-appium-comparison.results.jsonl).
|
|
107
|
+
|
|
108
|
+
Raw local trace and runner logs are not committed because they can include local
|
|
109
|
+
absolute paths.
|
|
110
|
+
|
|
111
|
+
## Scope
|
|
112
|
+
|
|
113
|
+
This benchmark compares local command surfaces under repeated execution. It
|
|
114
|
+
does not compare cloud execution, long multi-screen flows, Detox, Flutter,
|
|
115
|
+
Espresso, XCTest-only app tests, or app-specific selectors.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{"tool":"zmr","run":1,"status":"ok","durationMs":2327,"traceDir":"traces/public-benchmarks/20260609-ios-appium-comparison/zmr/zmr-1","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609","traceStatus":"passed"}
|
|
2
|
+
{"tool":"zmr","run":2,"status":"ok","durationMs":2326,"traceDir":"traces/public-benchmarks/20260609-ios-appium-comparison/zmr/zmr-2","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609","traceStatus":"passed"}
|
|
3
|
+
{"tool":"zmr","run":3,"status":"ok","durationMs":2312,"traceDir":"traces/public-benchmarks/20260609-ios-appium-comparison/zmr/zmr-3","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609","traceStatus":"passed"}
|
|
4
|
+
{"tool":"zmr","run":4,"status":"ok","durationMs":2305,"traceDir":"traces/public-benchmarks/20260609-ios-appium-comparison/zmr/zmr-4","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609","traceStatus":"passed"}
|
|
5
|
+
{"tool":"zmr","run":5,"status":"ok","durationMs":2305,"traceDir":"traces/public-benchmarks/20260609-ios-appium-comparison/zmr/zmr-5","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609","traceStatus":"passed"}
|
|
6
|
+
{"tool":"zmr","run":6,"status":"ok","durationMs":2295,"traceDir":"traces/public-benchmarks/20260609-ios-appium-comparison/zmr/zmr-6","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609","traceStatus":"passed"}
|
|
7
|
+
{"tool":"zmr","run":7,"status":"ok","durationMs":2339,"traceDir":"traces/public-benchmarks/20260609-ios-appium-comparison/zmr/zmr-7","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609","traceStatus":"passed"}
|
|
8
|
+
{"tool":"zmr","run":8,"status":"ok","durationMs":2289,"traceDir":"traces/public-benchmarks/20260609-ios-appium-comparison/zmr/zmr-8","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609","traceStatus":"passed"}
|
|
9
|
+
{"tool":"zmr","run":9,"status":"ok","durationMs":2292,"traceDir":"traces/public-benchmarks/20260609-ios-appium-comparison/zmr/zmr-9","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609","traceStatus":"passed"}
|
|
10
|
+
{"tool":"zmr","run":10,"status":"ok","durationMs":2320,"traceDir":"traces/public-benchmarks/20260609-ios-appium-comparison/zmr/zmr-10","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609","traceStatus":"passed"}
|
|
11
|
+
{"tool":"zmr","run":11,"status":"ok","durationMs":2332,"traceDir":"traces/public-benchmarks/20260609-ios-appium-comparison/zmr/zmr-11","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609","traceStatus":"passed"}
|
|
12
|
+
{"tool":"zmr","run":12,"status":"ok","durationMs":2333,"traceDir":"traces/public-benchmarks/20260609-ios-appium-comparison/zmr/zmr-12","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609","traceStatus":"passed"}
|
|
13
|
+
{"tool":"zmr","run":13,"status":"ok","durationMs":2316,"traceDir":"traces/public-benchmarks/20260609-ios-appium-comparison/zmr/zmr-13","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609","traceStatus":"passed"}
|
|
14
|
+
{"tool":"zmr","run":14,"status":"ok","durationMs":2291,"traceDir":"traces/public-benchmarks/20260609-ios-appium-comparison/zmr/zmr-14","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609","traceStatus":"passed"}
|
|
15
|
+
{"tool":"zmr","run":15,"status":"ok","durationMs":2342,"traceDir":"traces/public-benchmarks/20260609-ios-appium-comparison/zmr/zmr-15","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609","traceStatus":"passed"}
|
|
16
|
+
{"tool":"zmr","run":16,"status":"ok","durationMs":2308,"traceDir":"traces/public-benchmarks/20260609-ios-appium-comparison/zmr/zmr-16","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609","traceStatus":"passed"}
|
|
17
|
+
{"tool":"zmr","run":17,"status":"ok","durationMs":2298,"traceDir":"traces/public-benchmarks/20260609-ios-appium-comparison/zmr/zmr-17","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609","traceStatus":"passed"}
|
|
18
|
+
{"tool":"zmr","run":18,"status":"ok","durationMs":2297,"traceDir":"traces/public-benchmarks/20260609-ios-appium-comparison/zmr/zmr-18","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609","traceStatus":"passed"}
|
|
19
|
+
{"tool":"zmr","run":19,"status":"ok","durationMs":2339,"traceDir":"traces/public-benchmarks/20260609-ios-appium-comparison/zmr/zmr-19","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609","traceStatus":"passed"}
|
|
20
|
+
{"tool":"zmr","run":20,"status":"ok","durationMs":2329,"traceDir":"traces/public-benchmarks/20260609-ios-appium-comparison/zmr/zmr-20","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609","traceStatus":"passed"}
|
|
21
|
+
{"tool":"appium","run":1,"status":"ok","durationMs":3825,"traceDir":"traces/public-benchmarks/20260609-ios-appium-comparison/appium/appium-1","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609"}
|
|
22
|
+
{"tool":"appium","run":2,"status":"ok","durationMs":3779,"traceDir":"traces/public-benchmarks/20260609-ios-appium-comparison/appium/appium-2","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609"}
|
|
23
|
+
{"tool":"appium","run":3,"status":"ok","durationMs":3773,"traceDir":"traces/public-benchmarks/20260609-ios-appium-comparison/appium/appium-3","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609"}
|
|
24
|
+
{"tool":"appium","run":4,"status":"ok","durationMs":3776,"traceDir":"traces/public-benchmarks/20260609-ios-appium-comparison/appium/appium-4","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609"}
|
|
25
|
+
{"tool":"appium","run":5,"status":"ok","durationMs":3790,"traceDir":"traces/public-benchmarks/20260609-ios-appium-comparison/appium/appium-5","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609"}
|
|
26
|
+
{"tool":"appium","run":6,"status":"ok","durationMs":3797,"traceDir":"traces/public-benchmarks/20260609-ios-appium-comparison/appium/appium-6","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609"}
|
|
27
|
+
{"tool":"appium","run":7,"status":"ok","durationMs":3747,"traceDir":"traces/public-benchmarks/20260609-ios-appium-comparison/appium/appium-7","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609"}
|
|
28
|
+
{"tool":"appium","run":8,"status":"ok","durationMs":3799,"traceDir":"traces/public-benchmarks/20260609-ios-appium-comparison/appium/appium-8","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609"}
|
|
29
|
+
{"tool":"appium","run":9,"status":"ok","durationMs":4022,"traceDir":"traces/public-benchmarks/20260609-ios-appium-comparison/appium/appium-9","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609"}
|
|
30
|
+
{"tool":"appium","run":10,"status":"ok","durationMs":3871,"traceDir":"traces/public-benchmarks/20260609-ios-appium-comparison/appium/appium-10","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609"}
|
|
31
|
+
{"tool":"appium","run":11,"status":"ok","durationMs":3864,"traceDir":"traces/public-benchmarks/20260609-ios-appium-comparison/appium/appium-11","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609"}
|
|
32
|
+
{"tool":"appium","run":12,"status":"ok","durationMs":3882,"traceDir":"traces/public-benchmarks/20260609-ios-appium-comparison/appium/appium-12","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609"}
|
|
33
|
+
{"tool":"appium","run":13,"status":"ok","durationMs":3858,"traceDir":"traces/public-benchmarks/20260609-ios-appium-comparison/appium/appium-13","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609"}
|
|
34
|
+
{"tool":"appium","run":14,"status":"ok","durationMs":3883,"traceDir":"traces/public-benchmarks/20260609-ios-appium-comparison/appium/appium-14","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609"}
|
|
35
|
+
{"tool":"appium","run":15,"status":"ok","durationMs":3852,"traceDir":"traces/public-benchmarks/20260609-ios-appium-comparison/appium/appium-15","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609"}
|
|
36
|
+
{"tool":"appium","run":16,"status":"ok","durationMs":3879,"traceDir":"traces/public-benchmarks/20260609-ios-appium-comparison/appium/appium-16","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609"}
|
|
37
|
+
{"tool":"appium","run":17,"status":"ok","durationMs":3871,"traceDir":"traces/public-benchmarks/20260609-ios-appium-comparison/appium/appium-17","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609"}
|
|
38
|
+
{"tool":"appium","run":18,"status":"ok","durationMs":3825,"traceDir":"traces/public-benchmarks/20260609-ios-appium-comparison/appium/appium-18","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609"}
|
|
39
|
+
{"tool":"appium","run":19,"status":"ok","durationMs":3825,"traceDir":"traces/public-benchmarks/20260609-ios-appium-comparison/appium/appium-19","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609"}
|
|
40
|
+
{"tool":"appium","run":20,"status":"ok","durationMs":3818,"traceDir":"traces/public-benchmarks/20260609-ios-appium-comparison/appium/appium-20","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# 2026-06-09 iOS Simulator Demo Benchmark
|
|
2
|
+
|
|
3
|
+
This evidence pack records a repeat-run reliability benchmark for the public
|
|
4
|
+
ZMR iOS demo app. It is a single-tool benchmark, not a comparison against
|
|
5
|
+
Maestro, Appium, Detox, XCTest, or another runner.
|
|
6
|
+
|
|
7
|
+
## Result
|
|
8
|
+
|
|
9
|
+
| Metric | Value |
|
|
10
|
+
| --- | --- |
|
|
11
|
+
| Scenario | `examples/ios-smoke.json` |
|
|
12
|
+
| Platform | iOS simulator |
|
|
13
|
+
| Runs | 20 |
|
|
14
|
+
| Passed | 20 |
|
|
15
|
+
| Failed | 0 |
|
|
16
|
+
| Pass rate | 100.00% |
|
|
17
|
+
| Mean duration | 4192 ms |
|
|
18
|
+
| p95 duration | 5409 ms |
|
|
19
|
+
| Min duration | 3065 ms |
|
|
20
|
+
| Max duration | 6395 ms |
|
|
21
|
+
|
|
22
|
+
## Environment
|
|
23
|
+
|
|
24
|
+
| Field | Value |
|
|
25
|
+
| --- | --- |
|
|
26
|
+
| ZMR runner | `0.1.8` |
|
|
27
|
+
| Protocol | `2026-04-28` |
|
|
28
|
+
| Host OS | macOS 26.6, arm64 |
|
|
29
|
+
| Xcode | 26.5, build 17F42 |
|
|
30
|
+
| Simulator | Booted iOS 26.5 simulator, `zmr-iPhone` |
|
|
31
|
+
| App id | `com.example.mobiletest` |
|
|
32
|
+
| Demo app source | Generated by `scripts/create-ios-demo-app.sh` |
|
|
33
|
+
|
|
34
|
+
## Command
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
rm -rf traces/public-benchmarks/20260609-ios-demo /tmp/zmr-public-benchmark-ios-demo-20260609-plain
|
|
38
|
+
|
|
39
|
+
scripts/create-ios-demo-app.sh \
|
|
40
|
+
--out /tmp/zmr-public-benchmark-ios-demo-20260609-plain \
|
|
41
|
+
--name ZMRDemo \
|
|
42
|
+
--bundle-id com.example.mobiletest \
|
|
43
|
+
--deployment-target 16.0
|
|
44
|
+
|
|
45
|
+
xcodebuild \
|
|
46
|
+
-project /tmp/zmr-public-benchmark-ios-demo-20260609-plain/ios/ZMRDemo.xcodeproj \
|
|
47
|
+
-scheme ZMRDemo \
|
|
48
|
+
-destination 'generic/platform=iOS Simulator' \
|
|
49
|
+
-configuration Debug \
|
|
50
|
+
-derivedDataPath /tmp/zmr-public-benchmark-ios-demo-20260609-plain/DerivedData \
|
|
51
|
+
build
|
|
52
|
+
|
|
53
|
+
ZMR_BIN="$PWD/zig-out/bin/zmr" scripts/run-ios-pilot.sh \
|
|
54
|
+
--app-root /tmp/zmr-public-benchmark-ios-demo-20260609-plain \
|
|
55
|
+
--app-path /tmp/zmr-public-benchmark-ios-demo-20260609-plain/DerivedData/Build/Products/Debug-iphonesimulator/ZMRDemo.app \
|
|
56
|
+
--device booted \
|
|
57
|
+
--app-id com.example.mobiletest \
|
|
58
|
+
--xcrun xcrun \
|
|
59
|
+
--runs 20 \
|
|
60
|
+
--trace-root traces/public-benchmarks/20260609-ios-demo \
|
|
61
|
+
--min-pass-rate 100 \
|
|
62
|
+
--max-failures 0
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
The local run wrote:
|
|
66
|
+
|
|
67
|
+
- `traces/public-benchmarks/20260609-ios-demo/ios-smoke-benchmark/results.jsonl`
|
|
68
|
+
- `traces/public-benchmarks/20260609-ios-demo/ios-smoke-benchmark/report.html`
|
|
69
|
+
- `traces/public-benchmarks/20260609-ios-demo/ios-smoke-benchmark/junit.xml`
|
|
70
|
+
|
|
71
|
+
Those raw artifacts are intentionally not committed because generated reports
|
|
72
|
+
and JUnit properties include absolute local paths. The sanitized result rows are
|
|
73
|
+
committed in
|
|
74
|
+
[2026-06-09-ios-demo.results.jsonl](2026-06-09-ios-demo.results.jsonl).
|
|
75
|
+
|
|
76
|
+
## Scope
|
|
77
|
+
|
|
78
|
+
This run validates the public iOS simulator smoke path: install, launch, deep
|
|
79
|
+
link, snapshot, trace collection, benchmark gate, HTML report generation, and
|
|
80
|
+
JUnit report generation.
|
|
81
|
+
|
|
82
|
+
This run does not measure the app-local XCTest shim path. During collection, a
|
|
83
|
+
shim compatibility check found a generated wrapper portability issue in
|
|
84
|
+
one-shot mode: the wrapper used a `mktemp` template with `XXXXXX` before a
|
|
85
|
+
`.log` suffix, which is not portable on macOS. That generator bug was fixed
|
|
86
|
+
before this evidence pack was committed.
|
|
87
|
+
|
|
88
|
+
Do not use this evidence as a speed comparison against another mobile testing
|
|
89
|
+
framework. Baseline comparisons require equivalent candidate and baseline rows
|
|
90
|
+
from the same app build, device state, and scenario.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{"tool":"zmr","run":1,"status":"ok","durationMs":5409,"traceDir":"traces/public-benchmarks/20260609-ios-demo/ios-smoke-benchmark/zmr-1","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","traceStatus":"passed"}
|
|
2
|
+
{"tool":"zmr","run":2,"status":"ok","durationMs":3289,"traceDir":"traces/public-benchmarks/20260609-ios-demo/ios-smoke-benchmark/zmr-2","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","traceStatus":"passed"}
|
|
3
|
+
{"tool":"zmr","run":3,"status":"ok","durationMs":3319,"traceDir":"traces/public-benchmarks/20260609-ios-demo/ios-smoke-benchmark/zmr-3","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","traceStatus":"passed"}
|
|
4
|
+
{"tool":"zmr","run":4,"status":"ok","durationMs":3323,"traceDir":"traces/public-benchmarks/20260609-ios-demo/ios-smoke-benchmark/zmr-4","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","traceStatus":"passed"}
|
|
5
|
+
{"tool":"zmr","run":5,"status":"ok","durationMs":3562,"traceDir":"traces/public-benchmarks/20260609-ios-demo/ios-smoke-benchmark/zmr-5","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","traceStatus":"passed"}
|
|
6
|
+
{"tool":"zmr","run":6,"status":"ok","durationMs":4048,"traceDir":"traces/public-benchmarks/20260609-ios-demo/ios-smoke-benchmark/zmr-6","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","traceStatus":"passed"}
|
|
7
|
+
{"tool":"zmr","run":7,"status":"ok","durationMs":3606,"traceDir":"traces/public-benchmarks/20260609-ios-demo/ios-smoke-benchmark/zmr-7","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","traceStatus":"passed"}
|
|
8
|
+
{"tool":"zmr","run":8,"status":"ok","durationMs":3065,"traceDir":"traces/public-benchmarks/20260609-ios-demo/ios-smoke-benchmark/zmr-8","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","traceStatus":"passed"}
|
|
9
|
+
{"tool":"zmr","run":9,"status":"ok","durationMs":3692,"traceDir":"traces/public-benchmarks/20260609-ios-demo/ios-smoke-benchmark/zmr-9","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","traceStatus":"passed"}
|
|
10
|
+
{"tool":"zmr","run":10,"status":"ok","durationMs":3514,"traceDir":"traces/public-benchmarks/20260609-ios-demo/ios-smoke-benchmark/zmr-10","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","traceStatus":"passed"}
|
|
11
|
+
{"tool":"zmr","run":11,"status":"ok","durationMs":3702,"traceDir":"traces/public-benchmarks/20260609-ios-demo/ios-smoke-benchmark/zmr-11","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","traceStatus":"passed"}
|
|
12
|
+
{"tool":"zmr","run":12,"status":"ok","durationMs":5092,"traceDir":"traces/public-benchmarks/20260609-ios-demo/ios-smoke-benchmark/zmr-12","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","traceStatus":"passed"}
|
|
13
|
+
{"tool":"zmr","run":13,"status":"ok","durationMs":4929,"traceDir":"traces/public-benchmarks/20260609-ios-demo/ios-smoke-benchmark/zmr-13","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","traceStatus":"passed"}
|
|
14
|
+
{"tool":"zmr","run":14,"status":"ok","durationMs":4340,"traceDir":"traces/public-benchmarks/20260609-ios-demo/ios-smoke-benchmark/zmr-14","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","traceStatus":"passed"}
|
|
15
|
+
{"tool":"zmr","run":15,"status":"ok","durationMs":6395,"traceDir":"traces/public-benchmarks/20260609-ios-demo/ios-smoke-benchmark/zmr-15","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","traceStatus":"passed"}
|
|
16
|
+
{"tool":"zmr","run":16,"status":"ok","durationMs":5128,"traceDir":"traces/public-benchmarks/20260609-ios-demo/ios-smoke-benchmark/zmr-16","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","traceStatus":"passed"}
|
|
17
|
+
{"tool":"zmr","run":17,"status":"ok","durationMs":3955,"traceDir":"traces/public-benchmarks/20260609-ios-demo/ios-smoke-benchmark/zmr-17","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","traceStatus":"passed"}
|
|
18
|
+
{"tool":"zmr","run":18,"status":"ok","durationMs":4410,"traceDir":"traces/public-benchmarks/20260609-ios-demo/ios-smoke-benchmark/zmr-18","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","traceStatus":"passed"}
|
|
19
|
+
{"tool":"zmr","run":19,"status":"ok","durationMs":4634,"traceDir":"traces/public-benchmarks/20260609-ios-demo/ios-smoke-benchmark/zmr-19","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","traceStatus":"passed"}
|
|
20
|
+
{"tool":"zmr","run":20,"status":"ok","durationMs":4425,"traceDir":"traces/public-benchmarks/20260609-ios-demo/ios-smoke-benchmark/zmr-20","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","traceStatus":"passed"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
# 2026-06-09 iOS Simulator ZMR vs Maestro Comparison
|
|
2
|
+
|
|
3
|
+
This evidence pack compares ZMR with Maestro on the generated public iOS demo
|
|
4
|
+
app. It is a command-level benchmark: each row starts the runner command,
|
|
5
|
+
executes one smoke flow on the same booted simulator, and records the command
|
|
6
|
+
duration.
|
|
7
|
+
|
|
8
|
+
This is not a universal claim about either project. Treat it as reproducible
|
|
9
|
+
evidence for this app, host, simulator, and flow shape.
|
|
10
|
+
|
|
11
|
+
## Result
|
|
12
|
+
|
|
13
|
+
| Tool | Runs | Pass rate | Failures | Mean duration | p95 duration |
|
|
14
|
+
| --- | ---: | ---: | ---: | ---: | ---: |
|
|
15
|
+
| ZMR | 20 | 100.00% | 0 | 2236 ms | 2282 ms |
|
|
16
|
+
| Maestro | 20 | 95.00% | 1 | 7578 ms | 7918 ms |
|
|
17
|
+
|
|
18
|
+
For this run, ZMR was 3.39x faster on mean duration and 3.47x faster on p95
|
|
19
|
+
duration. Maestro run 8 failed while launching the app with a driver connection
|
|
20
|
+
error: `Failed to connect to /127.0.0.1:7001`.
|
|
21
|
+
|
|
22
|
+
## Environment
|
|
23
|
+
|
|
24
|
+
| Field | Value |
|
|
25
|
+
| --- | --- |
|
|
26
|
+
| ZMR runner | `0.1.8` |
|
|
27
|
+
| ZMR protocol | `2026-04-28` |
|
|
28
|
+
| Maestro | `1.40.3` |
|
|
29
|
+
| Java | OpenJDK 21.0.6 |
|
|
30
|
+
| Host OS | macOS 26.6, arm64 |
|
|
31
|
+
| Xcode | 26.5, build 17F42 |
|
|
32
|
+
| Simulator | Booted iOS 26.5 simulator, `zmr-iPhone` |
|
|
33
|
+
| App id | `com.example.mobiletest` |
|
|
34
|
+
| App build label | `generated-ios-demo-20260609` |
|
|
35
|
+
| Demo app source | Generated by `scripts/create-ios-demo-app.sh` |
|
|
36
|
+
|
|
37
|
+
## ZMR Command
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
ZMR_BIN="$PWD/zig-out/bin/zmr" scripts/benchmark.sh \
|
|
41
|
+
--zmr examples/ios-smoke.json \
|
|
42
|
+
--platform ios \
|
|
43
|
+
--ios-device-type simulator \
|
|
44
|
+
--device booted \
|
|
45
|
+
--app-id com.example.mobiletest \
|
|
46
|
+
--xcrun xcrun \
|
|
47
|
+
--app-build generated-ios-demo-20260609 \
|
|
48
|
+
--runs 20 \
|
|
49
|
+
--trace-root traces/public-benchmarks/20260609-ios-maestro-comparison/zmr \
|
|
50
|
+
--results traces/public-benchmarks/20260609-ios-maestro-comparison/results.jsonl \
|
|
51
|
+
--replace \
|
|
52
|
+
--min-pass-rate 100 \
|
|
53
|
+
--max-failures 0
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
The ZMR scenario launches the app, opens `exampleapp:///e2e-auth?probe=1`, and
|
|
57
|
+
captures a snapshot:
|
|
58
|
+
|
|
59
|
+
```json
|
|
60
|
+
{
|
|
61
|
+
"name": "ZMR iOS simulator smoke demo",
|
|
62
|
+
"appId": "com.example.mobiletest",
|
|
63
|
+
"steps": [
|
|
64
|
+
{ "action": "launch" },
|
|
65
|
+
{ "action": "openLink", "url": "exampleapp:///e2e-auth?probe=1" },
|
|
66
|
+
{ "action": "snapshot" }
|
|
67
|
+
]
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Maestro Command
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
scripts/benchmark-command.sh \
|
|
75
|
+
--tool maestro \
|
|
76
|
+
--platform ios \
|
|
77
|
+
--device booted \
|
|
78
|
+
--app-id com.example.mobiletest \
|
|
79
|
+
--scenario examples/ios-smoke.json \
|
|
80
|
+
--app-build generated-ios-demo-20260609 \
|
|
81
|
+
--runs 20 \
|
|
82
|
+
--trace-root traces/public-benchmarks/20260609-ios-maestro-comparison/maestro \
|
|
83
|
+
--results traces/public-benchmarks/20260609-ios-maestro-comparison/results.jsonl \
|
|
84
|
+
--min-pass-rate 100 \
|
|
85
|
+
--max-failures 0 \
|
|
86
|
+
-- maestro --platform ios --device F839B002-5388-4814-B64F-DBE5A113EBED test --no-ansi /tmp/zmr-maestro-benchmark-20260609/ios-smoke.yaml
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
The Maestro flow launches the same app, opens the same deep link, and asserts
|
|
90
|
+
the resulting status text:
|
|
91
|
+
|
|
92
|
+
```yaml
|
|
93
|
+
appId: com.example.mobiletest
|
|
94
|
+
---
|
|
95
|
+
- launchApp
|
|
96
|
+
- openLink: exampleapp:///e2e-auth?probe=1
|
|
97
|
+
- assertVisible: Deep link opened
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## Comparison Report
|
|
101
|
+
|
|
102
|
+
```text
|
|
103
|
+
# Benchmark Comparison
|
|
104
|
+
|
|
105
|
+
| Tool | Runs | Pass rate | Failures | Mean ms | P95 ms |
|
|
106
|
+
| --- | ---: | ---: | ---: | ---: | ---: |
|
|
107
|
+
| zmr | 20 | 100.00% | 0 | 2236 | 2282 |
|
|
108
|
+
| maestro | 20 | 95.00% | 1 | 7578 | 7918 |
|
|
109
|
+
|
|
110
|
+
- Mean speedup: 3.39x (-70.5% candidate vs baseline)
|
|
111
|
+
- P95 speedup: 3.47x (-71.2% candidate vs baseline)
|
|
112
|
+
- Same benchmark context: yes
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
The sanitized result rows are committed in
|
|
116
|
+
[2026-06-09-ios-maestro-comparison.results.jsonl](2026-06-09-ios-maestro-comparison.results.jsonl).
|
|
117
|
+
|
|
118
|
+
Raw local trace and runner logs are not committed because they can include local
|
|
119
|
+
absolute paths. The failure detail above was taken from the failed Maestro
|
|
120
|
+
run's local stdout log.
|
|
121
|
+
|
|
122
|
+
## Scope
|
|
123
|
+
|
|
124
|
+
This benchmark compares the local command surfaces under repeated execution. It
|
|
125
|
+
does not compare cloud execution, long multi-screen flows, Detox, XCTest-only
|
|
126
|
+
flows, or app-specific selectors. Detox requires a project-specific native test
|
|
127
|
+
harness, so it should get its own evidence pack rather than being forced into
|
|
128
|
+
this demo comparison.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{"tool":"zmr","run":1,"status":"ok","durationMs":2347,"traceDir":"traces/public-benchmarks/20260609-ios-maestro-comparison/zmr/zmr-1","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609","traceStatus":"passed"}
|
|
2
|
+
{"tool":"zmr","run":2,"status":"ok","durationMs":2233,"traceDir":"traces/public-benchmarks/20260609-ios-maestro-comparison/zmr/zmr-2","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609","traceStatus":"passed"}
|
|
3
|
+
{"tool":"zmr","run":3,"status":"ok","durationMs":2282,"traceDir":"traces/public-benchmarks/20260609-ios-maestro-comparison/zmr/zmr-3","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609","traceStatus":"passed"}
|
|
4
|
+
{"tool":"zmr","run":4,"status":"ok","durationMs":2204,"traceDir":"traces/public-benchmarks/20260609-ios-maestro-comparison/zmr/zmr-4","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609","traceStatus":"passed"}
|
|
5
|
+
{"tool":"zmr","run":5,"status":"ok","durationMs":2231,"traceDir":"traces/public-benchmarks/20260609-ios-maestro-comparison/zmr/zmr-5","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609","traceStatus":"passed"}
|
|
6
|
+
{"tool":"zmr","run":6,"status":"ok","durationMs":2185,"traceDir":"traces/public-benchmarks/20260609-ios-maestro-comparison/zmr/zmr-6","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609","traceStatus":"passed"}
|
|
7
|
+
{"tool":"zmr","run":7,"status":"ok","durationMs":2208,"traceDir":"traces/public-benchmarks/20260609-ios-maestro-comparison/zmr/zmr-7","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609","traceStatus":"passed"}
|
|
8
|
+
{"tool":"zmr","run":8,"status":"ok","durationMs":2196,"traceDir":"traces/public-benchmarks/20260609-ios-maestro-comparison/zmr/zmr-8","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609","traceStatus":"passed"}
|
|
9
|
+
{"tool":"zmr","run":9,"status":"ok","durationMs":2189,"traceDir":"traces/public-benchmarks/20260609-ios-maestro-comparison/zmr/zmr-9","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609","traceStatus":"passed"}
|
|
10
|
+
{"tool":"zmr","run":10,"status":"ok","durationMs":2211,"traceDir":"traces/public-benchmarks/20260609-ios-maestro-comparison/zmr/zmr-10","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609","traceStatus":"passed"}
|
|
11
|
+
{"tool":"zmr","run":11,"status":"ok","durationMs":2268,"traceDir":"traces/public-benchmarks/20260609-ios-maestro-comparison/zmr/zmr-11","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609","traceStatus":"passed"}
|
|
12
|
+
{"tool":"zmr","run":12,"status":"ok","durationMs":2245,"traceDir":"traces/public-benchmarks/20260609-ios-maestro-comparison/zmr/zmr-12","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609","traceStatus":"passed"}
|
|
13
|
+
{"tool":"zmr","run":13,"status":"ok","durationMs":2244,"traceDir":"traces/public-benchmarks/20260609-ios-maestro-comparison/zmr/zmr-13","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609","traceStatus":"passed"}
|
|
14
|
+
{"tool":"zmr","run":14,"status":"ok","durationMs":2249,"traceDir":"traces/public-benchmarks/20260609-ios-maestro-comparison/zmr/zmr-14","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609","traceStatus":"passed"}
|
|
15
|
+
{"tool":"zmr","run":15,"status":"ok","durationMs":2224,"traceDir":"traces/public-benchmarks/20260609-ios-maestro-comparison/zmr/zmr-15","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609","traceStatus":"passed"}
|
|
16
|
+
{"tool":"zmr","run":16,"status":"ok","durationMs":2236,"traceDir":"traces/public-benchmarks/20260609-ios-maestro-comparison/zmr/zmr-16","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609","traceStatus":"passed"}
|
|
17
|
+
{"tool":"zmr","run":17,"status":"ok","durationMs":2236,"traceDir":"traces/public-benchmarks/20260609-ios-maestro-comparison/zmr/zmr-17","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609","traceStatus":"passed"}
|
|
18
|
+
{"tool":"zmr","run":18,"status":"ok","durationMs":2226,"traceDir":"traces/public-benchmarks/20260609-ios-maestro-comparison/zmr/zmr-18","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609","traceStatus":"passed"}
|
|
19
|
+
{"tool":"zmr","run":19,"status":"ok","durationMs":2262,"traceDir":"traces/public-benchmarks/20260609-ios-maestro-comparison/zmr/zmr-19","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609","traceStatus":"passed"}
|
|
20
|
+
{"tool":"zmr","run":20,"status":"ok","durationMs":2248,"traceDir":"traces/public-benchmarks/20260609-ios-maestro-comparison/zmr/zmr-20","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609","traceStatus":"passed"}
|
|
21
|
+
{"tool":"maestro","run":1,"status":"ok","durationMs":7762,"traceDir":"traces/public-benchmarks/20260609-ios-maestro-comparison/maestro/maestro-1","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609"}
|
|
22
|
+
{"tool":"maestro","run":2,"status":"ok","durationMs":7793,"traceDir":"traces/public-benchmarks/20260609-ios-maestro-comparison/maestro/maestro-2","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609"}
|
|
23
|
+
{"tool":"maestro","run":3,"status":"ok","durationMs":7771,"traceDir":"traces/public-benchmarks/20260609-ios-maestro-comparison/maestro/maestro-3","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609"}
|
|
24
|
+
{"tool":"maestro","run":4,"status":"ok","durationMs":7762,"traceDir":"traces/public-benchmarks/20260609-ios-maestro-comparison/maestro/maestro-4","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609"}
|
|
25
|
+
{"tool":"maestro","run":5,"status":"ok","durationMs":7838,"traceDir":"traces/public-benchmarks/20260609-ios-maestro-comparison/maestro/maestro-5","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609"}
|
|
26
|
+
{"tool":"maestro","run":6,"status":"ok","durationMs":7918,"traceDir":"traces/public-benchmarks/20260609-ios-maestro-comparison/maestro/maestro-6","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609"}
|
|
27
|
+
{"tool":"maestro","run":7,"status":"ok","durationMs":7975,"traceDir":"traces/public-benchmarks/20260609-ios-maestro-comparison/maestro/maestro-7","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609"}
|
|
28
|
+
{"tool":"maestro","run":8,"status":"failed","durationMs":5091,"traceDir":"traces/public-benchmarks/20260609-ios-maestro-comparison/maestro/maestro-8","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609"}
|
|
29
|
+
{"tool":"maestro","run":9,"status":"ok","durationMs":6764,"traceDir":"traces/public-benchmarks/20260609-ios-maestro-comparison/maestro/maestro-9","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609"}
|
|
30
|
+
{"tool":"maestro","run":10,"status":"ok","durationMs":7716,"traceDir":"traces/public-benchmarks/20260609-ios-maestro-comparison/maestro/maestro-10","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609"}
|
|
31
|
+
{"tool":"maestro","run":11,"status":"ok","durationMs":7738,"traceDir":"traces/public-benchmarks/20260609-ios-maestro-comparison/maestro/maestro-11","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609"}
|
|
32
|
+
{"tool":"maestro","run":12,"status":"ok","durationMs":7738,"traceDir":"traces/public-benchmarks/20260609-ios-maestro-comparison/maestro/maestro-12","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609"}
|
|
33
|
+
{"tool":"maestro","run":13,"status":"ok","durationMs":7808,"traceDir":"traces/public-benchmarks/20260609-ios-maestro-comparison/maestro/maestro-13","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609"}
|
|
34
|
+
{"tool":"maestro","run":14,"status":"ok","durationMs":7772,"traceDir":"traces/public-benchmarks/20260609-ios-maestro-comparison/maestro/maestro-14","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609"}
|
|
35
|
+
{"tool":"maestro","run":15,"status":"ok","durationMs":7681,"traceDir":"traces/public-benchmarks/20260609-ios-maestro-comparison/maestro/maestro-15","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609"}
|
|
36
|
+
{"tool":"maestro","run":16,"status":"ok","durationMs":7629,"traceDir":"traces/public-benchmarks/20260609-ios-maestro-comparison/maestro/maestro-16","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609"}
|
|
37
|
+
{"tool":"maestro","run":17,"status":"ok","durationMs":7702,"traceDir":"traces/public-benchmarks/20260609-ios-maestro-comparison/maestro/maestro-17","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609"}
|
|
38
|
+
{"tool":"maestro","run":18,"status":"ok","durationMs":7661,"traceDir":"traces/public-benchmarks/20260609-ios-maestro-comparison/maestro/maestro-18","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609"}
|
|
39
|
+
{"tool":"maestro","run":19,"status":"ok","durationMs":7787,"traceDir":"traces/public-benchmarks/20260609-ios-maestro-comparison/maestro/maestro-19","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609"}
|
|
40
|
+
{"tool":"maestro","run":20,"status":"ok","durationMs":7658,"traceDir":"traces/public-benchmarks/20260609-ios-maestro-comparison/maestro/maestro-20","platform":"ios","device":"booted","appId":"com.example.mobiletest","scenario":"examples/ios-smoke.json","appBuild":"generated-ios-demo-20260609"}
|