 實戰(zhàn)指南)
測試測試智能體人工智能瀏覽器控制CLI【免費下載鏈接】e2eNext generation e2e testing framework for web and mobile apps.項目地址https://gitcode.com/GitHub_Trending/e2e6/e2e點擊查看免費下載e2e-dev/eas是 e2e 測試框架的 EAS Simulators 集成包通過easSimulators()設(shè)備提供方讓mobile引擎把移動目標(biāo)跑在 Expo 托管的 iOS 模擬器和 Android 模擬器上運行機上無需 Mac、Xcode 或 Android SDK。本文以 packages/eas/CHANGELOG.md 記錄的 0.1.0–0.3.0 四個版本演進為主線結(jié)合 provider 源碼 與 集成文檔講清該包的鑒權(quán)、項目解析、配置參數(shù)、會話生命周期與清理機制讀完后可獨立完成 CI 中的云模擬器 E2E 接入。版本演進總覽CHANGELOG 記錄了e2e-dev/eas的全部四個版本每個版本對應(yīng)一次有明確主題的能力演進版本主題關(guān)鍵變化0.1.0首次發(fā)布easSimulators()上線每 worker 槽位一個托管模擬器buildId/applicationArchiveUrl安裝應(yīng)用未知選項以INVALID_CONFIG拒絕并提示最接近的選項名如buildID→buildId0.1.1發(fā)布元數(shù)據(jù)e2e包帶上倉庫 README各包補充可被搜索到的關(guān)鍵詞見 package.json 的 keywords0.2.0鑒權(quán)與項目解析增強支持讀取eas login保存的會話projectId缺省時從 app config 自動解析0.2.1瘦身e2e安裝依賴從 117 個包降到 29 個、體積約 31MBe2e mcp換用拆分后的 MCP SDK構(gòu)建產(chǎn)物不再附帶指向未發(fā)布的src/的 sourcemap0.3.0運行時門檻與 TypeScript 加載器所有e2e-dev包要求 Node.js^22.22.3 \|\| 24.8.0e2e改用基于 oxc 的自研加載器替代 tsx版本 0.3.0 還明確了 peer 依賴與引擎門檻e2e-dev/mobile 0.8.0 1、e2e 0.15.0 1package.json 的engines.node即^22.22.3 || 24.8.0。0.3.0Node.js 版本門檻與自研 TypeScript 加載器0.3.0 是 Minor 變更但帶破壞性影響e2e及每個e2e-dev包需要 Node.js 22 系的 22.22.3或 24 系的 24.8.0Node.js 22.12–22.22.2、23、24.0–24.7 不再受支持CLI 在這些版本上會拒絕啟動并指明應(yīng)升級到的版本。原因是這些版本在 CommonJS 文件通過新加載器的module.registerHooks引入 TypeScript 時會失敗上游在 22.22.3 與 24.8.0 修復(fù)。同一版本中e2e用基于 oxc 的自研加載器替換 tsx 編譯 TypeScript替換的直接動因是 tsx 攜帶的 esbuild 有 postinstall 腳本導(dǎo)致 pnpm 11 上每次pnpm install都報ERR_PNPM_IGNORED_BUILDS換成自研加載器后安裝e2e的任何包都不再執(zhí)行 install 腳本。對使用者可見的行為包括配置與測試的加載能力保持兼容ESM/./x.js解析到x.ts、./x.jsx到x.tsx、目錄 index 導(dǎo)入、tsconfigpaths與baseUrl、工作區(qū)內(nèi)導(dǎo)出.ts源碼的包、.tsx/.jsx中的 JSX、enum、namespace、experimentalDecorators、帶 source map 的堆棧無with { type: json }的 JSON 導(dǎo)入依然可用文件名含%、#或空格的測試文件現(xiàn)在能帶著源碼位置被收集而不是報 URI malformed每個文件讀取其最近鄰的tsconfig.json而不是工作目錄里的那份變化點.cts文件中的import語句不再被編譯為require需寫import x require()未開啟experimentalDecorators的標(biāo)準(zhǔn)裝飾器、auto-accessors、.cts中的 ES moduleimport與值export會被拒絕并在錯誤中給出行號CLI 拒絕 Bunbun --bun與 Deno 運行時在emitDecoratorMetadata下、被裝飾成員類型以非import type方式導(dǎo)入且保留在產(chǎn)物中的類型會導(dǎo)致加載失敗錯誤信息會點名該導(dǎo)入被 CommonJS 文件require的.ts文件按 ES module 運行用module.exports寫的需改.cts后綴JavaScript 文件里的導(dǎo)入按 Node.js 規(guī)則解析不享受 TypeScript 擴展名規(guī)則與 tsconfigpaths已安裝包內(nèi)部的 TypeScript 編譯不使用項目的tsconfig.json。對使用e2e-dev/eas的實際影響運行e2e run的機器本地或 CI runner必須落在受支持的 Node.js 版本區(qū)間內(nèi)。安裝與基本用法npm install --save-dev e2e-dev/ease2e.config.ts 配置示例同時給出pnpm add -D e2e-dev/eas與bun add -d e2e-dev/eas兩種等價安裝方式import type { E2EConfig } from e2e; import { mobile } from e2e-dev/mobile; import { easSimulators } from e2e-dev/eas; export default { targets: [ { engine: mobile({ platform: ios, device: easSimulators({ buildId: process.env.EAS_BUILD_ID }), videoTouches: false, // EAS iOS 模擬器錄屏?xí)r必須關(guān)閉觸摸指示 }), app: { bundleId: com.example.app }, }, ], workers: 2, } satisfies E2EConfig;注意 EAS Simulators 處于有限開放limited access階段可用npx eas-clilatest simulator:availability檢查自己的賬號權(quán)限。該包用fetch直接調(diào)用 Expo API沒有需要額外安裝的 SDK其唯一依賴面是 peer 依賴的e2e-dev/mobile引擎?zhèn)扰ce2e配置校驗側(cè)。鑒權(quán)EXPO_TOKEN 與 eas-cli 登錄0.2.0PR 記錄見 CHANGELOG引入了與 eas-cli 完全一致的鑒權(quán)順序?qū)崿F(xiàn)位于 credentials.tsEXPO_TOKEN運行環(huán)境中的 Expo access token以Authorization: Bearer頭發(fā)送。CI 上應(yīng)作為 secret 設(shè)置當(dāng)機器上同時存在 eas-cli 個人登錄時設(shè)置EXPO_TOKEN可讓會話以機器人賬號而非個人賬號啟動。eas-cli 登錄會話EXPO_TOKEN未設(shè)置時讀取eas login寫入的~/.expo/state.jsonWindows 為USERPROFILE下取auth.sessionSecret并以expo-session頭發(fā)送——與 eas-cli 的行為一致。因此已登錄 eas-cli 的機器無需任何 token。兩者皆無時租約在任何 EAS 請求發(fā)出前失敗錯誤信息為EXPO_TOKEN is not set and eas-cli is not logged in。從源碼可確認的幾個實現(xiàn)細節(jié)EXPO_TOKEN與 eas-cli 登錄同時存在時EXPO_TOKEN優(yōu)先只讀取生產(chǎn)登錄會話 API 固定為api.expo.deveas-cli 的 staging 與 local 登錄EXPO_STAGING、EXPO_LOCAL不會被讀取每次easSimulators()實例會為每個憑據(jù)維護一個 GraphQL 客戶端會話以創(chuàng)建它的賬號關(guān)閉即使運行期間登錄發(fā)生變化provider.ts 中l(wèi)easeClients按會話 id 記錄了創(chuàng)建時的客戶端讀取的 home 取運行環(huán)境中的HOMEWindows 為USERPROFILE解析不到時回退到os.homedir()state.json存在但不是合法 JSON 時錯誤會提示重新eas login或設(shè)置EXPO_TOKEN且錯誤信息刻意不包含文件內(nèi)容避免把 secret 引進日志。CI 建議在 runner 或共享機器上顯式設(shè)置EXPO_TOKEN。否則 runner home 里殘留的他人登錄會以該賬號啟動計費會話。projectId 解析顯式傳入或從 app config 自動讀取0.2.0 的另一項變化是projectId變?yōu)榭蛇x。會話必須歸屬某個 Expo 項目easSimulators()缺省projectId時project.ts 從e2e.config.ts所在項目根目錄的 app config 中讀取extra.eas.projectId即eas init寫入的 id規(guī)則與 Expo 自身解析一致靜態(tài)配置app.config.json優(yōu)先于app.json見源碼中STATIC_CONFIGS的順序按 JSON 讀取若文件頂層有expo鍵則從expo下取否則取整個文件動態(tài)配置按 Expo 的順序app.config.ts、.mts、.cts、.mjs、.cjs、.js任一命中即優(yōu)先于靜態(tài)配置用項目自己的expo config --json --type public在運行環(huán)境中求值因為配置里可以計算 id。與 eas-cli 一致不加載.env文件源碼中顯式設(shè)置EXPO_NO_DOTENV1配置讀取的變量必須在e2e run啟動時的環(huán)境里此路徑要求項目安裝了expoCLI 從projectRoot及父目錄的node_modules中定位不走NODE_PATH或全局目錄。解析時機與緩存每個 run 只讀一次在第一個會話啟動之前同一 run 內(nèi)按runId projectRoot緩存兩個 target 共享一次讀取讀取失敗不緩存下次重試。找不到 app config、或配置未關(guān)聯(lián)項目時租約在任何會話啟動前失敗錯誤指明具體文件名并提示pass projectId to easSimulators(), or run eas init to link the app to an EAS project。兩個前提限制值得注意該能力依賴會向設(shè)備提供方傳遞projectRoot的e2e-dev/mobile更老的版本會在租約失敗信息中要求升級或顯式傳projectIdprovider.ts 中的projectIdFor當(dāng)e2e.config.ts不在應(yīng)用目錄、或 app config 未關(guān)聯(lián)項目時直接以projectId傳入傳項目 id不是 slug。配置參數(shù)全解easSimulators(options)接受的全部選項定義在 provider.ts 的EasSimulatorsOptions與 集成文檔的選項表 對應(yīng)選項默認值含義projectId來自 app config會話歸屬的 Expo 項目 id。缺省時從extra.eas.projectId解析見上文buildId無指定一次 EAS Buildsimulator 構(gòu)建eas.json中ios: { simulator: true }或 APKEAS 在每個模擬器就緒前安裝并啟動它搭配 target 的app.bundleId不要設(shè)置app.appPathapplicationArchiveUrl無應(yīng)用歸檔 URLEAS 下載并安裝效果等價于 build與buildId互斥deviceEAS 自選iOS 設(shè)備名或 UDID如iPhone 17 Pro或 Android AVD 硬件 profile如pixel_9maxIdleTimeMinutes10無 agent-device 命令多久后 EAS 停止會話是運行意外終止后釋放會話的兜底。EAS 要求它低于maxDurationMinutes因此當(dāng)傳入的時長更短時默認值自動降為maxDurationMinutes - 1maxDurationMinutes賬號上限會話就緒后最多運行分鐘數(shù)EAS 上限為 40 分鐘高優(yōu)先級計劃為 115 分鐘agentDeviceVersion引擎版本EAS 啟動會話 daemon 的 agent-device 版本默認取e2e-dev/mobile釘住的版本保證遠端 daemon 按引擎客戶端的預(yù)期應(yīng)答不傳時 EAS 啟動最新版tags[]附加到每個會話的標(biāo)簽與運行自身標(biāo)簽并存EAS 以小寫存儲配置期校驗在easSimulators()調(diào)用時立即執(zhí)行未知選項報INVALID_CONFIG若拼寫接近某個已知選項如buildIDvsbuildId錯誤會點名最接近的那個否則列出全部合法選項。這一行為自 0.1.0 起取代了靜默丟棄拼錯的選項的舊行為buildId與applicationArchiveUrl同時傳入INVALID_CONFIG二選一maxIdleTimeMinutes maxDurationMinutes兩者都傳入時INVALID_CONFIG錯誤說明 EAS requires 前者低于后者maxIdleTimeMinutes計算結(jié)果小于 1按無空閑上限處理undefined因為 EAS 不接受零值——會話會一直運行到其時長上限buildId/applicationArchiveUrl與 target 的app.appPath沖突acquire階段報錯 EAS installs the app frombuildIdorapplicationArchiveUrl; leave the targetsapp.appPathout。會話生命周期與源碼常量一個 worker 槽位對應(yīng)一個會話。會話狀態(tài)機在 client.ts 中被建模為四個 phasequeued等待賬號并發(fā)容量、starting啟動/安裝中、readydaemon 可達攜帶daemonUrl與daemonToken、endedSTOPPED/ERRORED或 job 進入終止態(tài)。ready()輪詢邏輯由一組 provider.ts 中的源碼常量 精確刻畫常量值語義POLL_INTERVAL_MS5000狀態(tài)輪詢間隔源碼注釋說明一個模擬器從排隊、啟動到安裝 build 大約需要 3 分鐘QUEUE_NOTICE_MS120000排隊滿 2 分鐘記一條日志still queued at EAS after two minutes; tests start once every worker has a simulator每個會話都會有短暫排隊STARTUP_TIMEOUT_MS900000離開隊列后 15 分鐘仍未就緒視為卡死與 eas-cli 的放棄點一致租約失敗且會話被停止POLL_FAILURES_TOLERATED3允許連續(xù) 3 次狀態(tài)輪詢失敗api.expo.dev的短暫抖動超過才放棄其他生命周期行為均可在 provider.ts 中對應(yīng)到代碼會話以e2e target n of total命名并自動加標(biāo)簽e2e、e2e-run:run id、e2e-target:target因此可用eas simulator:list --tag e2e-run:run id找回某次運行的全部會話創(chuàng)建會話使用獨立的 60 秒超時不受請求取消信號約束——取消若發(fā)生在創(chuàng)建之后會話已經(jīng)存在且計費必須顯式停止否則成為無人知曉的計費會話某會話仍在排隊、而同運行的另一會話已就緒并達到其maxIdleTimeMinutes空閑上限時排隊會話的租約直接失敗EAS 正要停掉那個空閑會話錯誤提示lower workers or raise maxIdleTimeMinutes會話創(chuàng)建后到ready之間的任何失敗錯誤、取消、卡死都會調(diào)用stop回滾stop還會在 job 仍排隊時取消該 jobclient.ts 的CANCEL_JOBmutation——否則 EAS 稍后仍會啟動它并占用賬號并發(fā)額度EAS 從會話啟動即計費而引擎只持有acquire成功返回的租約因此上述回滾是避免計費泄漏的關(guān)鍵路徑運行結(jié)束時的release用創(chuàng)建該會話時的憑據(jù)客戶端停止它并清理 run 級緩存projectIds、idleDeadlines停止一個 EAS 已不認識的會話按成功處理NOT_FOUND_ERROR被吞掉。并發(fā)規(guī)模上每個 target 啟動至多workers個會話--workers可覆蓋測試文件更少時更少全部就緒后測試才開始3 分鐘的準(zhǔn)備期在運行計時開始之前、且各槽位并行。一次運行必須裝進單個會話的壽命就緒后 40/115 分鐘更長的套件應(yīng)拆分到更多 worker 或更多 CI job。應(yīng)用安裝方式與日志觀測三種應(yīng)用安裝方式集成文檔 Install the app 一節(jié)// 方式一EAS 從 buildId 安裝構(gòu)建不離開 EAS { engine: mobile({ platform: ios, device: easSimulators({ buildId }) }), app: { bundleId: com.example.app } } // 方式二applicationArchiveUrl 同理EAS 下載歸檔并安裝 // 方式三本地構(gòu)建fixture 調(diào)用 device.installApp() 通過 daemon 上傳 { engine: mobile({ platform: ios, device: easSimulators() }), app: { bundleId: com.example.app, appPath: build/App.app } }運行中的日志形態(tài)集成文檔 給出的樣例? leasing 2 ios device(s) from eas-simulators ? eas-simulators (1 of 2): simulator session 01a0…, https://expo.dev/accounts/acme/projects/shop/simulator-sessions/01a0… ? eas-simulators: leased 01a0…每個會話創(chuàng)建時記錄其 expo.dev 頁面若瀏覽器預(yù)覽無需 token 即可打開也會以watch at url記錄需要 token 的預(yù)覽不記錄——token 出現(xiàn)在 CI 日志里等于把模擬器控制權(quán)交給任何能讀日志的人。錄屏注意事項錄屏通過模擬器上的 agent-device 進行與本地一致產(chǎn)物存為 attempt 工件目錄下的video/video.mp4。但必須像上面的示例那樣設(shè)置 mobile 引擎的videoTouches: falseagent-device 在錄制停止時才把觸摸指示畫進錄像而該操作在 EAS iOS 模擬器上耗時數(shù)分鐘導(dǎo)致每個錄屏 attempt 都在cleanupTimeout中停錄、最終拿不到文件關(guān)閉指示后停止錄屏約 2 秒。這是 README 與 0.1.0 以來的持續(xù)建議示例配置中已體現(xiàn)。單元測試如何驗證這套行為包的測試 eas.test.ts 用vi.stubGlobal(fetch, ...)偽造了https://api.expo.dev/graphql的 GraphQL 端點按查詢文本區(qū)分create/state/stop/cancel四類操作并記錄每次調(diào)用的Authorization/expo-session頭與變量覆蓋創(chuàng)建入?yún)⒑琣ppId、platform、deviceIdentifier按平臺鍵寫入輪詢到ready的全過程與排隊提示釋放與啟動失敗/取消后停止的回滾路徑EXPO_TOKEN與 eas-cli 登錄兩條憑據(jù)路徑斷言請求頭分別是 Bearer 與expo-session從 app config 解析projectId的各分支含通過expo config求值動態(tài)配置連續(xù) 502 抖動下最多容忍 3 次失敗輪詢stateOutages機制target 攜帶app.appPath時的沖突報錯。結(jié)合 stub 的node:timers/promises輪詢即時返回整條創(chuàng)建 → 輪詢 → 就緒 → 停止?fàn)顟B(tài)機在單測中可確定性地重放。小結(jié)e2e-dev/eas從 0.1.0 的能跑托管模擬器演進到 0.3.0 的生產(chǎn)就緒0.2.0 補齊了與 eas-cli 對齊的免 token 鑒權(quán)和projectId自動解析0.2.1 完成依賴與發(fā)布產(chǎn)物瘦身0.3.0 隨整個框架確立了 Node.js 22.22.3/24.8.0 的運行時門檻與 oxc 自研 TypeScript 加載器。對使用者而言接入成本極低——一個device: easSimulators(...)的配置、一個EXPO_TOKEN或本地eas login、以及按賬號上限規(guī)劃好單會話 40 分鐘高優(yōu)先級 115 分鐘的套件時長包內(nèi)部以明確的INVALID_CONFIG校驗、失敗即回滾的會話清理、排隊/卡死判定和標(biāo)簽化命名把云模擬器的計費與并發(fā)風(fēng)險收斂在可控范圍內(nèi)。更多細節(jié)可延伸閱讀 EAS Simulators 集成文檔、mobile 引擎文檔 與 EAS Workflows CI 文檔。贊分享測試測試智能體人工智能瀏覽器控制CLI【免費下載鏈接】e2eNext generation e2e testing framework for web and mobile apps.項目地址https://gitcode.com/GitHub_Trending/e2e6/e2e點擊查看免費下載相關(guān)推薦e2e 集成 EAS Simulators用 e2e-dev/eas 在 Expo 托管模擬器上運行移動端 E2E 測試e2e 集成 EAS Simulators用 e2e dev/eas 在 Expo 托管模擬器上運行移動端 E2E 測試 本文基于當(dāng)前倉庫的 package測試測試智能體人工智能瀏覽器控制CLIPinchTab E2E 測試套件完全指南從 ./dev e2e 到 Go Runner 的架構(gòu)與實戰(zhàn)PinchTab E2E 測試套件完全指南從 ./dev e2e 到 Go Runner 的架構(gòu)與實戰(zhàn) PinchTab 的端到端測試套件位于 tests/eexpo-eas-client 演進與實現(xiàn)解析EAS 穩(wěn)定客戶端標(biāo)識符的跨平臺設(shè)計與 SDK 對齊之路expo eas client 演進與實現(xiàn)解析EAS 穩(wěn)定客戶端標(biāo)識符的跨平臺設(shè)計與 SDK 對齊之路 本文以 Expo 倉庫中 packages/expo移動開發(fā)前端跨平臺原生移動上一篇Qwen-Edit-2509-Multiple-anglesAI圖像編輯領(lǐng)域的鏡頭控制革新下一篇MassTransit代碼分析使用Analyzers提升代碼質(zhì)量創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考