如何用EAS让e2e在CI中跑iOS模拟测试完整配置教程【免费下载链接】e2eNext generation e2e testing framework for web and mobile apps.项目地址: https://gitcode.com/GitHub_Trending/e2e6/e2ee2e 是一款面向 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-clilatest 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;三个关键细节buildId指向一个 EAS Build 构建产物构建时需声明ios: { simulator: true }EAS 会先把应用装进每台模拟器再就绪app.bundleId保留、app.appPath留空让 EAS 负责安装app.open()靠 bundleId 启动应用videoTouches: falseagent-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/checkoutv4 - uses: actions/setup-nodev4 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-artifactv4 if: ${{ !cancelled() }} with: name: e2e-ios path: .e2e要点Runner 用普通 Linux 机器即可因为模拟器在云端--reporter list,junit让 CI 拿到junit.xmlreport.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_9workers—每个 target 起workers个并行会话实操建议套件总时长要控制在单个会话的maxDurationMinutes内超长了就加workers或拆成多个 CI job让workers × EAS target 数不超过账号的并发会话数超出的会话会排队且排队超过空闲阈值会直接判失败运行日志会打印每个会话的 expo.dev 页面需要时可打开观察模拟器实况。常见问题速查报EXPO_TOKEN is not set and eas-cli is not logged inCI 中没配 secret本地则先跑eas loginINVALID_CONFIGbuildId和applicationArchiveUrl只能二选一maxIdleTimeMinutes必须小于maxDurationMinutes配置加载失败提示升级 e2e-dev/mobile旧版 mobile 包不向设备提供器传递projectRoot升级或显式传projectId应用装不上确认 EAS Build 用了simulator: true的 iOS 构建或改用app.appPathdevice.installApp()本地上传方案。延伸阅读EAS 集成完整文档docs/integrations/eas.mdx移动端 CI 全平台指南GitHub Actions / EAS Workflows / Bitrise / Codemagicdocs/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),仅供参考