Fenix 同步集成测试(Sync Integration Tests)实战指南:验证 Firefox for Android 与桌面端的数据同步 移动开发【免费下载链接】fenix⚠️ Fenix (Firefox for Android) moved to a new repository. It is now developed and maintained as part of: https://github.com/mozilla-mobile/firefox-android项目地址https://gitcode.com/gh_mirrors/fe/fenix点击查看免费下载导读本文基于 FenixFirefox for Android仓库的 syncIntegrationTests.md 文档系统讲解如何搭建一套横跨桌面 Firefox 与 Android 模拟器的端到端同步测试体系。这套测试通过 TPSTest Pilot SyncMozilla 官方同步测试工具在桌面端写入历史、书签等数据再用 Gradle Instrumentation 测试在 Fenix App 内验证同步结果同时反向覆盖「设备 → 桌面」两条链路。读完本文你将掌握 syncintegration 目录的完整结构、运行前置条件与命令、桌面端 TPS 脚本与 Android 端 Kotlin 测试的对接原理以及报告与日志的调试方法。一、测试目标与当前覆盖范围文档开宗明义地指出这套测试的核心目的是验证 Fenix 与桌面版 Firefox 之间的同步是否正常工作设计上覆盖四类同步引擎——History历史、Bookmarks书签、Tabs标签页与 Logins登录信息。同步引擎文档声称覆盖仓库源码实际状态History✅ 已定义已实现test_history.jscheckHistoryFromDesktopTestBookmarks✅ 已定义已实现test_bookmark.jscheckBookmarkFromDesktopTestTabs列入意图未实现Logins列入意图测试方法已编写但默认禁用值得注意的细节文档写于早期阶段仓库源码 test_integration.py 中checkLoginsFromDesktopTest、checkBookmarkFromDeviceTest、checkHistoryFromDeviceTest等测试方法已存在但被注释在...代码块内仅保留test_sync_account_settings、test_sync_history_from_desktop两个激活用例。这印证了文档所说的「At this moment only tests for History and Bookmarks are defined」同时表明 Logins 与反向链路已处于「可启用但默认关闭」的半成品状态。测试方向采用双向验证设计桌面 → Fenix先在桌面端创建数据并同步再在 App 端验证数据出现Fenix → 桌面先在 App 端创建数据并同步再到桌面端验证默认关闭。二、运行前置条件根据文档要求运行前需要准备Python 2 与 pipenv文档要求 Python 2 环境。不过仓库 Pipfile 已声明python_version 3.10说明该套件在后续演进中已迁移到 Python 3.10 时代的环境管理方案进入 syncintegration 目录app/src/androidTest/java/org/mozilla/fenix/syncintegration/Android 模拟器文档指定 Pixel 3 API 28仓库 launchSimScript.sh 负责模拟器的启停控制Firefox 桌面版二进制与 TPS 扩展未显式指定时pytest fixture 会自动下载最新 nightly 构建见下节。三、安装与启动命令文档给出的核心命令只有三条但其背后是一整套 pytest 自动化链路# 1. 安装 Python 依赖Pipfile 中定义 pipenv install # 2. 运行全部同步集成测试 pipenv run pytest实际执行流程可结合 conftest.py 的 fixture 链理解准备 Firefox 二进制读取环境变量MOZREGRESSION_BINARY或--firefox参数缺省时通过FactoryScraper(daily, ...)自动下载最新 nightly 版并安装到临时目录再用mozversion.get_version记录版本号注入 pytest metadata准备 TPS 扩展读取--tps参数缺省时从firefox-ci-tc.services.mozilla.com拉取gecko.v2.mozilla-central.latest.firefox.addons.tps任务产出的public/tps.xpi扩展包构造 FxA stage 账户通过pytest-fxa生成测试账户并把邮箱/密码写入两个文件——一方面通过FXA_EMAIL、FXA_PASSWORD环境变量传给桌面端同步进程另一方面写入仓库resources/email.txt与resources/password.txt供 Android 端 Kotlin 测试读取见 SyncIntegrationTest.kt 中typeEmail()与typePassword()的getResource(email.txt)调用构造 TPS 专用 Firefox Profile注入大量services.sync.*调试开关例如services.sync.log.logger Trace、services.sync.firstSync notReady、services.sync.testing.tps True并通过identity.fxaccounts.autoconfig.uri指向 stage 环境的 FxA 服务地址逐条运行用例默认激活的用例见下节。此外可用的 pytest 命令行选项conftest.pypipenv run pytest --firefox /path/to/firefox # 指定桌面 Firefox 二进制跳过自动下载 pipenv run pytest --tps /path/to/tps.xpi # 指定 TPS 扩展跳过自动下载四、stage 账户两端共用的同步身份文档强调「When a test is launched a stage account is created. That will be used both in Desktop and Fenix to be sure that what is saved in one place is shown in the other.」这正是整套测试的关键设计——用同一个 stage FxA 账户串起桌面与 Android 两个端桌面端tps_configfixture 用该账户的 email/password 作为 TPS 测试配置FXA_EMAIL/FXA_PASSWORD环境变量 tps.configJSONAndroid 端email.txt/password.txt文件被 Kotlin 测试加载在 App 内完成登录。账户的复用保证了「在一个端保存的数据在另一个端必须可见」这一断言具有真正的业务意义而不是测试桩之间的自说自话。五、桌面 → Fenix 方向以 History 为例的完整流程文档给出了「History Desktop → Fenix」的流程骨架Desktop 启动用户已登录并创建一条历史记录Pixel 3 API 28 模拟器启动Fenix 运行并登录同一账户进入历史列表验证该记录存在。仓库把上述流程拆成了两步自动化第 1 步桌面端用 TPS 脚本创建数据test_history.js 首先用EnableEngines([history])声明启用 History 引擎然后定义一个期望状态var historyCreated [ { uri: http://www.example.com/, visits: [ { type: 1, date: 0 }, { type: 2, date: -1 } ] } ]; Phase(phase1, [ [Sync], [History.add, historyCreated], [Sync] ]);执行语义为先触发一次同步再向本地添加两条访问记录type 1 表示首次访问、type 2 表示重载访问date 0 与 -1 表示相对当前时间的偏移最后再次同步以推送变更。tps.py 的run()方法会用FirefoxRunner携带-marionette参数启动带 TPS Profile 的 Firefox 执行该脚本并在完成后断言日志中出现test phase phase1: PASS若捕获到CROSSWEAVE ERROR:则直接抛异常。第 2 步Android 端跑 Instrumentation 验证SyncIntegrationTest.kt 的checkHistoryFromDesktopTest()依次执行signInFxSync()进入设置 → 打开 Turn on Sync → 切到邮箱登录 → 输入email.txt/password.txt中的 stage 账户凭证并回车tapReturnToPreviousApp()等待账户同步完成依次出现 Save、Settings、Account、email 等控件后pressBack()返回主界面打开三点菜单 → 历史记录historyAfterSyncIsShown()用 UIAutomator 断言http://www.example.com/这条桌面端添加的记录出现在历史列表中。书签方向的checkBookmarkFromDesktopTest()流程一致最终用bookmarkAfterSyncIsShown()断言「Example Domain」书签项存在且处于可用状态。两条用例与 test_integration.py 中激活的两个 pytest 测试一一对应def test_sync_account_settings(tps, gradlewbuild): gradlewbuild.test(checkAccountSettings) def test_sync_history_from_desktop(tps, gradlewbuild): tps.run(test_history.js) gradlewbuild.test(checkHistoryFromDesktopTest)六、gradlewbuild如何拉起 Android 测试桌面端数据就绪后轮到 Android 侧。GradlewBuild类gradlewbuild.py负责编排模拟器与 Gradle 构建重启模拟器adbrun.py 先通过adb devices找出所有模拟器并逐个emu kill关闭再执行launchSimScript.sh启动干净的新模拟器回退到仓库根目录执行./gradlew app:connectedDebugAndroidTest \ -Pandroid.testInstrumentationRunnerArguments.classorg.mozilla.fenix.syncintegration.SyncIntegrationTest#checkHistoryFromDesktopTest即用android.testInstrumentationRunnerArguments.class参数把测试运行器锁定到指定的单个测试方法从而复用同一个 Instrumentation APK、按需运行任意一个用例 3. 记录stdout/stderr输出到gradlewbuild.log对应 pytest 的gradlewbuild_logfixture供失败时回溯。需要注意GradlewBuild.test()内部通过os.chdir(../../../../../../../..)的相对路径回到仓库根目录再执行./gradlew这意味着测试运行目录与仓库目录层级必须与该结构一致否则路径会失效。七、ResultsCI 策略、通知与报告文档明确说明该测试的运维方式不纳入常规 Taskcluster CI由于需要真实桌面浏览器、模拟器与 stage 账户等复杂环境这些测试不适合在 Taskcluster 的常规拉取请求管道中运行仓库 automation/taskcluster/androidTest/ 下的 flank 配置只覆盖常规 UI 测试不包含同步集成套件计划由 Jenkins 周期性执行频率 TBD待定结果通知跑完后通过 Slack 推送结果文档记录当时配置到#firefox-ios-alerts频道HTML 报告每一步都会生成包含全部信息的 HTML 文件方便失败时排查。仓库中确实能看到这套机制的执行痕迹——根目录的 Jenkinsfile 即为 Jenkins 流水线定义与文档描述的「Jenkins 周期性运行」吻合。HTML 报告的产出机制则由 pytest.ini 的addopts --verbose --htmlresults/index.html与pytest-html插件实现。八、调试利器日志注入到 HTML 报告conftest.py的pytest_runtest_makereporthookwrapper 为每次用例执行后注入多类日志是失败排查的核心手段Sync 引擎日志遍历 TPS Profile 下weave/logs/目录把每个同步日志文件以文本形式附加到 HTML 报告并写入 report sectionsFirefox 日志桌面浏览器进程输出TPS 日志TPS 扩展执行记录GradlewBuild 日志Gradle/ADB 侧输出。这意味着一次失败的排查不需要到处翻文件——打开results/index.html即可在对应用例下看到 Firefox、TPS、Gradle 与同步引擎四类日志的完整轨迹配合 stage 账户信息即可快速定位「数据没同步」到底出在桌面端写入、网络同步还是 Android 端校验哪一环。九、当前局限与后续方向Tabs 引擎仅出现在设计意图中仓库尚无对应 TPS 脚本与 Kotlin 测试Logins 引擎checkLoginsFromDesktopTest()已编写含登录后校验 Sync logins 开关从 Off 变 On、保存的登录项出现等步骤但对应 pytest 用例被注释禁用属于「已开发、未启用」状态反向链路checkBookmarkFromDeviceTest()/checkHistoryFromDeviceTest()同样已被编写但默认关闭账户设置校验checkAccountSettings()目前只能验证书签/历史复选框、退出登录按钮与设备名显示逐个勾选并验证状态的断言因控件状态无法读取而留了 TODO参见代码注释对应 issue #6544。附syncintegration 目录速览以下文件构成本套测试的可运行全集均在 app/src/androidTest/java/org/mozilla/fenix/syncintegration/ 下文件职责Pipfile/Pipfile.lockPython 依赖锁定pytest、mozdownload、mozprofile、mozrunner、fxapom、pytest-fxa、pytest-html 等conftest.pypytest fixturesFirefox 二进制、TPS 扩展、stage 账户、TPS Profile、日志、HTML 报告注入test_integration.pypytest 用例编排TPS 步骤 gradlewbuild 步骤串联tps.py以 FirefoxRunner -marionette运行 TPS 脚本并断言 PASSgradlewbuild.py重启模拟器 运行app:connectedDebugAndroidTest单方法测试adbrun.py关闭旧模拟器、启动新模拟器launchSimScript.sh模拟器启动脚本SyncIntegrationTest.ktAndroid 端 UIAutomator/Espresso 测试与登录工具函数test_history.js/test_bookmark.js/test_logins.js桌面端写入数据的 TPS 脚本test_history_desktop.js/test_bookmark_desktop.js桌面端验证数据的 TPS 脚本pytest.iniverbose 输出 results/index.html报告配置__init__.pyPython 包标识赞分享移动开发【免费下载链接】fenix⚠️ Fenix (Firefox for Android) moved to a new repository. It is now developed and maintained as part of: https://github.com/mozilla-mobile/firefox-android项目地址https://gitcode.com/gh_mirrors/fe/fenix点击查看免费下载相关推荐终极指南Firefox for Android 数据同步功能详解终极指南Firefox for Android 数据同步功能详解 Firefox for Android 数据同步功能是提升浏览体验的强大工具它能让你的书签移动开发marketingskills 集成 Claude Code 安装指南两条路径装好营销技能库装完即上手marketingskills 集成 Claude Code 安装指南两条路径装好营销技能库装完即上手 如果你已经习惯用 Claude Code 写代码又AI 技能人工智能Wazuh DBSync 冒烟测试实战指南用 dbsync_test_tool 端到端验证数据库同步引擎Wazuh DBSync 冒烟测试实战指南用 dbsync_test_tool 端到端验证数据库同步引擎 本文档以 Wazuh 仓库中的 DBSync Smo网络安全IDS日志分析应用安全漏洞扫描上一篇Ktlint社区贡献完全指南如何参与开源Kotlin代码格式化工具开发 下一篇Oh My Zsh安全配置指南保护你的命令行环境终极教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考