ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Detox 深度链接 Mock 测试指南:用 device.launchApp 与 device.openURL 模拟 “Open With URL“

Detox 深度链接 Mock 测试指南:用 device.launchApp 与 device.openURL 模拟 “Open With URL“ 测试移动开发质量保障开发工具【免费下载链接】DetoxGray box end-to-end testing and automation framework for mobile apps项目地址https://gitcode.com/gh_mirrors/de/Detox点击查看免费下载导读深度链接Deep Links / URL Scheme是移动应用中常见的跳转入口App 可能通过myapp://page?id123这样的 URL 被拉起并据此渲染对应页面。在 Detox 灰盒端到端测试中你可以通过device.launchApp与device.openURL两个 API 精确模拟从 URL 打开应用与在已运行的应用上打开 URL两种真实场景从而完整验证 App 的 URL 处理机制无需人工点击。读完本文你将掌握这两个 API 的完整参数语义、iOS / Android 双平台行为差异以及它们在 Detox 官方 e2e 测试中的实战用法。本文对应仓库文档mocking-open-with-url.mdDetox 20.x 版本文档。为什么需要 Mock 从 URL 打开 App真实世界中用户从浏览器、邮件或第三方 App 点击一个链接时系统会将该 URL 交给注册了对应 Scheme 的应用触发onOpenURL/application(_:open:options:)/ Intent 等处理逻辑。这类链路依赖系统级跳转手工测试繁琐且不稳定自动化测试里更是难以复现。Detox 提供的做法是在启动参数或运行时注入 URL 载荷payload让被测 App 认为自己是被一个 URL 打开的从而走完真实的深链处理代码路径。仓库中对应能力的实现集中在 RuntimeDevice.jslaunchApp支持传入url、userNotification、userActivity三类载荷之一通过detoxURLOverride等启动参数注入openURL则把 URL 直接投递给当前运行的 App。Mock App 启动时带 URLdevice.launchAppAPI 签名与参数说明await device.launchApp({ newInstance: true, url, sourceApp: bundleId }); // sourceApp 为可选参数且仅 iOS 支持参数类型必填说明newInstanceboolean可选是否以全新实例启动先终止再启动urlstring是用于打开 App 的 URL如scheme://some.urlsourceAppstring否仅 iOS模拟从哪个 App 发起打开例如com.apple.mobilesafari对应系统回调中的来源 Bundle ID完整示例describe(launch app from URL, () { it(should handle URL successfully, async () { await device.launchApp({ newInstance: true, url: scheme://some.url, sourceApp: com.apple.mobilesafari }); await expect(element(by.text(a label))).toBeVisible(); }); });这段代码会先强制终止 App 并以全新实例启动同时把scheme://some.url注入为打开来源随后断言 App 对深链做出的 UI 反馈例如显示了某个文本标签。底层实现URL 如何注入启动参数查看 RuntimeDevice.js 的 launchApp 实现 可以看到关键逻辑const payloadParams [url, userNotification, userActivity]; const hasPayload this._assertHasSingleParam(payloadParams, params); // ... if (params.url) { baseLaunchArgs[detoxURLOverride] params.url; if (params.sourceApp) { baseLaunchArgs[detoxSourceAppOverride] params.sourceApp; } }从源码可以确认两个重要事实URL 通过启动参数传递url会被写入名为detoxURLOverride的启动参数sourceApp写入detoxSourceAppOverride。App 侧如 React Native 的 Linking 模块读取该参数后即可模拟真实的 URL 打开事件。三类载荷互斥url、userNotification、userActivity属于同一组 payload 参数_assertHasSingleParam会强制校验一次只能传其中一个否则抛出错误Call to launchApp(...) must contain only one of ...见 RuntimeDevice.js。newInstance 的语义与后台场景newInstance的默认值并非恒为true而是取决于 App 是否已在运行见 RuntimeDevice.jsconst newInstance params.newInstance ! undefined ? params.newInstance : this._processes[bundleId] null;因此newInstance: true强制terminateApp后冷启动模拟用户点链接拉起 AppnewInstance: false不终止进程。若 App 处于后台则直接恢复前台并投递 URL模拟App 在后台时被深链拉起。Detox 官方 e2e 测试 15.urls.test.js 就覆盖了后台场景it(device.launchApp() with a URL should trigger url handling when app is in background, async () { await device.launchApp({newInstance: true, launchArgs}); await urlDriver.navToUrlScreen(); await urlDriver.assertNoUrl(url); await device.sendToHome(); await device.launchApp({newInstance: false, url}); await urlDriver.assertUrl(url); });Mock 已启动 App 上打开 URLdevice.openURL当 App已经在前台运行时直接调用device.openURL即可模拟此刻从外部打开了一个 URL该 API 仅 iOS 支持文档标注 iOS-onlyawait device.openURL({ url: scheme://some.url, sourceApp: com.apple.mobilesafari });参数语义与launchApp中的一致url必填sourceApp可选iOS。参数校验与调用链在 RuntimeDevice.js 的 openURL 实现 中Detox 会先做参数合法性检查async openURL(params) { if (typeof params ! object || !params.url) { throw new DetoxRuntimeError(openURL must be called with JSON params, and a value for url key must be provided. example: await device.openURL({url: url, sourceApp[optional]: sourceAppBundleID}); } await this.deviceDriver.deliverPayload(params); }随后调用链为基类驱动 DeviceDriverBase.deliverPayload →client.deliverPayload(params)通过 Detox 客户端将 URL 载荷投递给 App。Android 平台的等价行为尽管openURL在文档中标注为 iOS-onlyAndroid 驱动同样实现了把 URL 投递给正在运行的应用的能力见 AndroidDriver.deliverPayloadasync deliverPayload(params) { if (params.delayPayload) { return; } const { url, detoxUserNotificationDataURL } params; if (url) { await this._startActivityWithUrl(url); } else if (detoxUserNotificationDataURL) { // ...通知场景 } }从源码结构看Android 上运行中打开 URL是通过_startActivityWithUrl启动对应 Activity 完成的官方 e2e 测试 15.urls.test.js 中device.openURL的前台用例同样在 Android 上运行it(device.openURL() should trigger open url handling in app when app is in foreground, async () { await device.launchApp({newInstance: true, launchArgs}); await urlDriver.navToUrlScreen(); await urlDriver.assertNoUrl(url); await device.openURL({url}); await urlDriver.assertUrl(url); });完整测试骨架三场景一网打尽结合 15.urls.test.js 的官方用例一个完整的深链 Mock 测试应覆盖三种场景describe(Open URLs, () { afterAll(async () { // 清理以不带 URL 的全新实例恢复干净状态 await device.launchApp({ newInstance: true, url: undefined, launchArgs: undefined }); }); it(冷启动 URL模拟用户点链接拉起 App, async () { await device.launchApp({ newInstance: true, url, launchArgs }); // 断言 URL 处理结果 }); it(前台运行 openURL模拟运行中被深链唤醒, async () { await device.launchApp({ newInstance: true, launchArgs }); await device.openURL({ url }); // 断言 URL 处理结果 }); it(后台运行 launchApp({newInstance:false, url})模拟后台被深链拉起, async () { await device.launchApp({ newInstance: true, launchArgs }); await device.sendToHome(); await device.launchApp({ newInstance: false, url }); // 断言 URL 处理结果 }); });最佳实践与注意事项测试结束务必清理状态深链测试会污染 App 的启动参数建议在afterAll中调用device.launchApp({ newInstance: true, url: undefined, launchArgs: undefined })恢复干净环境参照 15.urls.test.js。正确选择 newInstance冷启动场景用newInstance: true会先终止进程若需验证后台恢复 深链则用newInstance: false并先sendToHome()。不要混用多种载荷url、userNotification、userActivity是互斥的同时传入会触发 Detox 运行时错误。sourceApp 仅 iOS 生效Android 上该参数会被忽略跨平台测试建议仅在 iOS 用例中传sourceApp。App 需自行注册 SchemeDetox 只负责投递 URLApp 能否正确处理取决于其是否注册了对应 URL Scheme 并实现了深链处理逻辑请在应用层保证这一点后再编写断言。URL 参数与 launchArgs 可共存如官方用例所示url可与launchArgs同时传入便于在深链场景下额外注入自定义启动参数。相关仓库路径速查官方文档mocking-open-with-url.md运行时实现RuntimeDevice.jslaunchApp/openURL/ payload 互斥校验iOS 驱动SimulatorDriver.jsAndroid 驱动AndroidDriver.js_startActivityWithUrl官方 e2e 用例15.urls.test.js冷启动 / 前台 / 后台三种深链场景赞分享测试移动开发质量保障开发工具【免费下载链接】DetoxGray box end-to-end testing and automation framework for mobile apps项目地址https://gitcode.com/gh_mirrors/de/Detox点击查看免费下载相关推荐Detox 深链接测试完整指南Mocking Open With URLDeep Links实战Detox 深链接测试完整指南Mocking Open With URLDeep Links实战 导读 深链接Deep Link处理是移动端应用中常见测试移动开发质量保障开发工具Detox 深链接Deep LinkMock 指南用 launchApp 与 openURL 测试 App 的 URL 打开机制Detox 深链接Deep LinkMock 指南用 launchApp 与 openURL 测试 App 的 URL 打开机制 导读 在移动端端到端测试测试移动开发质量保障开发工具Detox 用户活动User ActivityMock 完整指南深度链接、Spotlight 与 Siri 场景的 iOS 端到端测试Detox 用户活动User ActivityMock 完整指南深度链接、Spotlight 与 Siri 场景的 iOS 端到端测试 本指南基于 Det测试移动开发质量保障开发工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表