☰
如何用EAS让e2e在CI中跑iOS模拟测试?完整配置教程
2026/10/8 22:41:12 网站建设 项目流程

如何用EAS让e2e在CI中跑iOS模拟测试?完整配置教程

【免费下载链接】e2eNext generation e2e testing framework for web and mobile apps.项目地址: https://gitcode.com/GitHub_Trending/e2e6/e2e

e2e 是一款面向 Web 和移动端应用的新一代 AI 驱动的端到端(e2e)测试框架。而 EAS Simulators 是 Expo 提供的云托管 iOS 模拟器服务——把它接进 e2e 后,你的 CI 流水线就不需要 Mac、Xcode 或 Android SDK,直接租到云端真模拟级别的 iOS 模拟器来跑 e2e 测试。本教程带你从零完成配置:安装设备提供器、写 e2e 配置、声明 EAS 构建配置、在 CI 中注入令牌,几分钟就能跑通第一次云端 iOS 模拟测试。

为什么要在 CI 里用 EAS 跑 iOS 模拟测试?

在传统方案里,CI 跑 iOS 模拟测试意味着:申请 macOS Runner、装 Xcode、下载模拟器运行时、自己xcrun simctl boot启动设备、再想办法把构建产物装进去——每一步都可能卡住,维护成本极高。

使用 EAS Simulators 后,这套流程被压缩成一句话:每个 worker 自动租一台云端 iOS 模拟器,用完即释放。具体来说(见 docs/integrations/eas.mdx):

  • 运行开始时,EAS 自动启动会话;运行结束时自动关停,无需手动清理;
  • 模拟器由 e2e 的 agent-device 守护进程驱动,测试代码、配置、CI 脚本完全不变;
  • 会话约 3 分钟从请求到就绪(排队、开机、安装应用全程并行),就绪后才开始计时;
  • 支持视频录制,失败后可在产物目录查看video/video.mp4。

💡 官方强调的核心卖点:跑 e2e 的机器上不需要 Mac、Xcode,也不需要 Android SDK。

第 1 步:安装 @e2e-dev/eas 设备提供器

在你的测试项目根目录(e2e.config.ts所在处)执行:

npm install --save-dev @e2e-dev/eas

该包通过fetch直接调用 Expo 的 API,不需要额外安装任何 SDK。设备提供器的核心实现可以在 packages/eas/src/provider.ts 中查看,认证逻辑在 packages/eas/src/credentials.ts。

⚠️ EAS Simulators 目前是限量开放(limited access)服务,先在本地确认你的账号已开通:

npx eas-cli@latest simulator:availability

第 2 步:配置 e2e.config.ts

在 e2e 配置中,把 iOS target 的device指向easSimulators():

// e2e.config.ts import type { E2EConfig } from 'e2e'; import { mobile } from '@e2e-dev/mobile'; import { easSimulators } from '@e2e-dev/eas'; export default { targets: [ { name: 'ios', engine: mobile({ platform: 'ios', device: easSimulators({ buildId: process.env.EAS_BUILD_ID }), videoTouches: false, // 重要:关闭触摸指示器,避免录制卡顿 }), app: { bundleId: 'com.example.app' }, }, ], workers: 2, } satisfies E2EConfig;

三个关键细节:

  1. buildId:指向一个 EAS Build 构建产物(构建时需声明"ios": { "simulator": true }),EAS 会先把应用装进每台模拟器再就绪;
  2. app.bundleId保留、app.appPath留空:让 EAS 负责安装,app.open()靠 bundleId 启动应用;
  3. videoTouches: false:agent-device 的触摸指示器在 EAS 的 iOS 模拟器上收尾需要数分钟,关掉后停止录制只需约 2 秒。

项目自带的eas.json就演示了 simulator 构建配置,可参考 apps/mobile-benchmark/eas.json:

{ "build": { "benchmark": { "ios": { "simulator": true } } } }

会话归属哪个 Expo 项目?提供器会自动读取与e2e.config.ts同目录的app.json(或app.config.*)中extra.eas.projectId(由eas init写入)。如果配置不在同一目录,或想显式指定,直接传projectId参数即可(是项目 id,不是 slug)。

第 3 步:CI 中的认证——EXPO_TOKEN

认证方式与 eas-cli 完全一致,CI 场景推荐用访问令牌:

优先级方式说明
高EXPO_TOKEN环境变量账号/机器人访问令牌,CI 中必须用它,配置为 secret
低eas-cli 本地登录态读取~/.expo/state.json,适合本地开发机

⚠️ 安全提醒:在 CI Runner 或共享机器上务必设置EXPO_TOKEN。否则 Runner 上残留的他人登录态会以那个账号的身份启动按量计费的会话——账单就记到别人头上了。

第 4 步:在 CI 里跑起来

一个最简的 CI 任务长这样(GitHub Actions 风格):

jobs: ios: runs-on: ubuntu-latest # 注意:不需要 macOS timeout-minutes: 60 steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 24 - run: npm ci - run: npx eas build --profile benchmark --platform ios --non-interactive env: EXPO_TOKEN: ${{ secrets.EXPO_TOKEN }} - run: npx e2e run --target ios --reporter list,junit env: EXPO_TOKEN: ${{ secrets.EXPO_TOKEN }} EAS_BUILD_ID: ${{ steps.build.outputs.build_id }} - uses: actions/upload-artifact@v4 if: ${{ !cancelled() }} with: name: e2e-ios path: .e2e

要点:

  • Runner 用普通 Linux 机器即可,因为模拟器在云端;
  • --reporter list,junit让 CI 拿到junit.xml,report.json与.e2e/results/里的轨迹页、截图说明"为什么失败";
  • 模型类判断(agent.assert等)需要模型密钥,建议只对可信分支的构建暴露,详见 docs/ci.mdx。

会话时长:一次运行必须"装得下"

EAS 会话有生命周期上限,配置时心里要有数(完整选项表见 docs/integrations/eas.mdx):

选项默认值含义
maxDurationMinutes账号上限(普通 40 分钟 / 高优先级 115 分钟)会话就绪后最多运行时长
maxIdleTimeMinutes10 分钟无指令多久后 EAS 自动停会话
deviceEAS 自选指定 iOS 机型(如'iPhone 17 Pro')或 Android 硬件配置(如'pixel_9')
workers—每个 target 起workers个并行会话

实操建议:

  • 套件总时长要控制在单个会话的maxDurationMinutes内;超长了就加workers或拆成多个 CI job;
  • 让workers × EAS target 数不超过账号的并发会话数,超出的会话会排队,且排队超过空闲阈值会直接判失败;
  • 运行日志会打印每个会话的 expo.dev 页面,需要时可打开观察模拟器实况。

常见问题速查

  • 报EXPO_TOKEN is not set and eas-cli is not logged in:CI 中没配 secret,本地则先跑eas login;
  • INVALID_CONFIG:buildId和applicationArchiveUrl只能二选一;maxIdleTimeMinutes必须小于maxDurationMinutes;
  • 配置加载失败提示升级 @e2e-dev/mobile:旧版 mobile 包不向设备提供器传递projectRoot,升级或显式传projectId;
  • 应用装不上:确认 EAS Build 用了"simulator": true的 iOS 构建,或改用app.appPath+device.installApp()本地上传方案。

延伸阅读

  • EAS 集成完整文档:docs/integrations/eas.mdx
  • 移动端 CI 全平台指南(GitHub Actions / EAS Workflows / Bitrise / Codemagic):docs/mobile-ci.mdx
  • 设备提供器源码:packages/eas/src/provider.ts
  • 移动端基准测试配置示例:apps/mobile-benchmark/e2e.config.ts

跟着以上四步,你就可以完全脱离 Mac 环境,让 e2e 在任意 CI 平台上租用 EAS 的云端 iOS 模拟器跑移动端 e2e 测试了 🚀

【免费下载链接】e2eNext generation e2e testing framework for web and mobile apps.项目地址: https://gitcode.com/GitHub_Trending/e2e6/e2e

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询