Skip to main content
Momentic tests the native build of an Expo app, not the JS bundle. The pipeline is: produce an APK (Android) or simulator .app (iOS), upload it to a channel/tag, and run momentic-mobile against it. Both EAS Build and expo prebuild with local toolchains work.

Produce a testable build

Option A: EAS (recommended if you already use it)
A preview profile with "buildType": "apk" (or "distribution": "internal") in eas.json produces an installable .apk. Without --local, the build runs in EAS cloud and you download the artifact URL.Option B: prebuild + Gradle (no EAS account)

Upload and run

Remote emulators and simulators install the app from an uploaded asset. Add the CLI as a dev dependency so the lockfile pins the version in CI:
Then upload and run:
Then run a test against it:
smoke.test.yaml
defaultChannel/defaultTag on the test pick the uploaded asset. In the editor, the same selection appears as the Channel/Tag pickers next to the Region dropdown; choose any Momentic region for a remote instance.

Expo-specific pitfalls

  • Expo Go is not testable. Momentic installs your standalone build, not Expo Go. You need a prebuild or EAS artifact, and over-the-air JS updates do not reach the installed binary: rebuild when the JS surface changes (new screens, new native modules).
  • Dev-client builds work. An expo-dev-client build is a normal APK; test it the same way. Point it at a reachable Metro/dev server or a published update channel.
  • Deep links and app links resolve through the installed app id; use an appium step (mobile: deepLink) to open them.
  • expo-router headers and safe areas appear as native elements to Momentic: describe them as the user sees them (“the back chevron”, “the Settings tab”) rather than by testID.
  • WebView content on Android needs WebView.setWebContentsDebuggingEnabled(true); add it in MainApplication or a small config plugin if your app renders web content.

In CI

Run an EAS build, upload the artifact to a channel, then run your suite against that same upload. A complete GitHub Actions workflow:
.github/workflows/mobile.yml
--channel dev --tag ${{ github.sha }} selects the asset this job just uploaded; without it, tests fall back to their defaultChannel/defaultTag and can pick up a stale build.