TesterArmy
  • Customers
  • Pricing
Sign inGet started
HomePlatformExpo app testing

Expo E2E testing
on every EAS build

EAS already builds your app. The same workflow uploads the build and agents run your saved tests on cloud simulators.

Start testing for free

tester.army

❯
ta ci --group $GROUP_ID --platform ios --app-id $APP_ID
Resolving build from upload_ios_app
Found
· iOS Simulator build · uploaded 0m 41s ago
Installing build on iOS Simulator
Installed
· app id from .testerarmy/upload.json
Running group: Mobile smoke (4 tests)
Sign in and reach the dashboard
· Passed · 1m 42s
Checkout with saved card
· Passed · 2m 38s
Reset a password by email
· Passed · 0m 48s
Create a new account
· Passed · 1m 12s
Collecting run artifacts
run_ios_tests
· 4 recordings · Staging
Writing .testerarmy/ci-result.json
4 passed · 0 failed
· 2m 38s · exit 0
❯
ta ci --group $GROUP_ID --platform android --app-id $APP_ID
Resendbolt.newNando'sViktorNovuRead case studiesNovu cut flaky tests in half and merges about 30% faster30%Faster time to merge50%Fewer flaky tests4 minAverage test runCodeCraftersRorkGreen-GotShockoeLightsprintKahunasStandoutAugustLexroomKonvoJunoRead case studiesHow Juno tests every pull request on iOS and Android before it merges10xFaster shipping+58%Pull requests merged2 daysCEO time back weeklyArchitectSalesPatriot
See all case studies

[02] One EAS workflow, three jobs

One EAS workflow,
three jobs

EAS builds the simulator app. A second job uploads it to TesterArmy and a third runs your saved test group.

.eas/workflows/testerarmy-mobile-tests.yml
name:
TesterArmy Mobile Tests
on:
pull_request:
branches:
[main]
jobs:
build_ios:
type:
build
environment:
preview
params:
platform:
ios
profile:
testerarmy-ios-simulator
upload_ios_app:
needs:
[build_ios]
steps:
- uses:
eas/download_build
- run:
ta upload-app --app-path $APP_PATH
--project $PROJECT_ID
--output .testerarmy/upload.json
run_ios_tests:
needs:
[upload_ios_app]
steps:
- run:
ta ci --group $GROUP_ID --project $PROJECT_ID
--platform ios --app-id $APP_ID
--output .testerarmy/ci-result.json
build_android:
type:
build
environment:
preview
params:
platform:
android
profile:
testerarmy-android-apk
upload_android_app:
needs:
[build_android]
steps:
- uses:
eas/download_build
- run:
ta upload-app --app-path $APP_PATH
--project $PROJECT_ID
--output .testerarmy/upload.json
run_android_tests:
needs:
[upload_android_app]
steps:
- run:
ta ci --group $GROUP_ID --project $PROJECT_ID
--platform android --app-id $APP_ID
--output .testerarmy/ci-result.json

EAS workflow file

Build, upload and test jobs in one testerarmy-mobile-tests.yml

testerarmy-mobile-tests.yml
build_ios:
type:
build
environment:
preview
params:
platform:
ios
profile:
testerarmy-ios-simulator

EAS build

The build job produces an iOS Simulator app from the profile you add to eas.json.

tester.army
Uploading iOS Simulator app
Uploaded
· iOS Simulator app
.testerarmy/upload.json written
· app id for run_ios_tests

Upload the build

The upload job downloads the EAS artifact and hands it to TesterArmy with one command.

tester.army
Running group: Mobile smoke (4 tests)
Waiting for the run
· iOS Simulator
4 tests passed
· 2m 38s · ci-result.json written
❯
cat .testerarmy/ci-result.json

Run and wait

The run job starts the saved group, waits for it and writes ci-result.json for the next step.

Expo EAS
GitHub Actions

Expo and GitHub Actions

The same two commands run from EAS Workflows or from a GitHub Actions job.

Test the next EAS build with agents

Add the workflow file and your saved tests run on the next build.

Start testing for freeBook a walkthrough

[03] A result for every EAS build +

A result for every EAS build

Each run lands in Results with its platform, environment and duration, and the same verdict is written to ci-result.json for the workflow that started it.

iOS result

The iOS Simulator build from EAS runs your saved tests and reports one verdict per test.

Checkout with saved card
Passed
iOS
Staging

Android result

The Android APK build runs the same tests on a cloud emulator, with its own row in Results.

Checkout with saved card
Failed
Android
Staging

JSON for your pipeline

ta ci writes ci-result.json and exits with code 1 on any failure, so the pipeline stops.

tester.army
❯
ta ci --output .testerarmy/ci-result.json
Writing .testerarmy/ci-result.json
4 tests passed
· 2m 38s · iOS
exit 0
· the next job reads ci-result.json
❯
cat .testerarmy/ci-result.json

Results in Slack

Connect Slack in Integrations and scheduled or webhook-triggered group runs post a summary to your channel.

TesterArmy
APP
9:41 AM
1 test failed in Mobile smoke
Checkout with saved card
Step: Pay with the saved card (3 of 4)
Actual: the payment sheet stayed open after Pay
Open run

Results in the dashboard

Every EAS run appears in Results with its platform, environment, duration and the pull request that triggered it.

Sign in and reach the dashboard
Passed
iOS
Checkout with saved card
Failed
Android
Reset a password by email
Passed
iOS

[04] Proof

Mobile teams that stopped
testing by hand

In sixteen years of building mobile apps, TesterArmy is the first tool that actually does what I always expected AI-powered testing to do. You're onto something.
Edwin Huertas

Edwin Huertas

CEO, Shockoe

FAQ

Frequently asked questions

How do I run E2E tests on EAS builds?

Add the TesterArmy workflow recipe to EAS. The build job produces an iOS Simulator app or Android APK, ta upload-app uploads it, and ta ci runs your saved test group on cloud simulators. The CLI waits for the result and writes ci-result.json for the workflow.

Do I need to eject or add config plugins?

No. TesterArmy tests the compiled binary EAS produces. There is nothing to install in your app, no testing config plugin and no native code changes. Your managed workflow stays managed.

Can it test EAS Update (over-the-air) releases?

Yes. Use a release build configured for the update channel you want to test. You can pass a configuration deep link with --deeplink so TesterArmy opens the right channel and backend after launching the app, before the test begins.

Does it test Android builds too?

Yes. Add an Android APK profile to eas.json and the corresponding build, upload and test jobs to the workflow. Android tests run on cloud emulators and have their own results. Upload an APK, not an Android App Bundle.

Which EAS build profiles should I test?

Use a profile that produces a self-contained iOS Simulator .app or an Android .apk. The app must include its JavaScript bundle and run without Metro. Test a preview build on pull requests and the release candidate before submission.

Do I need to add testIDs or a custom dev client?

No. Agents use the rendered app and follow your plain-language test steps. You do not need testIDs, Detox configuration or a custom development client. Upload the release build your pipeline produces.

What is Expo app testing with TesterArmy?

TesterArmy runs plain-language tests against compiled Expo apps on cloud iOS simulators and Android emulators. The EAS workflow builds and uploads the app, runs your saved tests, and returns results with a recording of each run.

How do results get back to my EAS workflow?

ta ci waits for the remote tests, writes the results to the JSON output path you provide, and exits with code 1 if a test fails. Results and recordings also appear in the TesterArmy dashboard. Pass the commit SHA when the EAS and GitHub context provides it to report GitHub checks.

How do I run Expo E2E tests on an iOS simulator without a Mac?

EAS builds a simulator binary in the cloud, and TesterArmy runs it in a cloud iOS simulator. No macOS runner is needed in CI: the workflow uploads the build, agents run your saved flows, and the results and recordings come back to the pull request.

Can TesterArmy test EAS simulator builds and preview builds?

Yes. Any EAS profile that produces an iOS simulator build or an Android APK works: development, preview, and simulator profiles are the usual ones. The setup is described step by step in the Expo EAS guide in the docs.

Is this Expo unit testing or end-to-end testing?

End-to-end. Agents drive the built app the way a user does, screen by screen. Unit tests stay in Jest and cover functions and components; the two are complementary, and most teams run both.

Read next

  • React Native E2E Testing Without Detox or a Device Farm
  • Mobile App Testing Without a Device Farm
  • Why Teams Are Replacing Detox for React Native Testing

[06] Get started

Test your next EAS build

Contact usStart free
XLinkedInDiscord
TesterArmyTesterArmy

AI-powered QA testing for modern teams. Ship faster with confidence.

SOC 2 Type 2 badge
GDPR badge

© 2026 TesterArmy, Inc.

Platform
  • Web testingWeb testing
  • Mobile app testingMobile app testing
  • Pull request testingPull request testing
  • CI/CD testingCI/CD testing
  • Production monitoringProduction monitoring
  • Coding agentsCoding agents
By stack and product
  • AI app testingAI app testing
  • React Native testingReact Native testing
  • Expo app testingExpo app testing
  • WordPress testingWordPress testing
  • Ecommerce testingEcommerce testing
Quick links
  • HomeHome
  • DemoDemo
  • How it worksHow it works
  • FAQFAQ
  • PricingPricing
  • Get a demoGet a demo
  • About usAbout us
  • Contact usContact us
Resources
  • DocumentationDocumentation
  • IntegrationsIntegrations
  • Migrate to TesterArmyMigrate to TesterArmy
  • Compare toolsCompare tools
  • Recruit a friendRecruit a friend
  • Affiliate programAffiliate program
  • BlogBlog
  • CustomersCustomers
  • Open sourceOpen source
  • Brand assetsBrand assets
  • API referenceAPI reference
  • Getting startedGetting started
Legal
  • Privacy policyPrivacy policy
  • Terms of serviceTerms of service

We raised $1.2M in Pre-Seed FundingRead more

TesterArmy
  • Customers
  • Pricing
Sign inGet started
Quick links
  • HomeHome
  • DemoDemo
  • How it worksHow it works
  • FAQFAQ
  • PricingPricing
  • Get a demoGet a demo
  • About usAbout us
  • Contact usContact us