如何用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;三个关键细节:
buildId:指向一个 EAS Build 构建产物(构建时需声明"ios": { "simulator": true }),EAS 会先把应用装进每台模拟器再就绪;app.bundleId保留、app.appPath留空:让 EAS 负责安装,app.open()靠 bundleId 启动应用;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 分钟) | 会话就绪后最多运行时长 |
maxIdleTimeMinutes | 10 分钟 | 无指令多久后 EAS 自动停会话 |
device | EAS 自选 | 指定 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),仅供参考