测试¶
我们通过多种方式验证和测试 Marionette,使用单元测试和功能测试的组合。我们测试了三个不同的组件
Marionette **服务器**,使用 xpcshell 单元测试和 Python 编写的功能测试的组合,分布在 Marionette 和 WPT 测试中;
Python **客户端** 使用相同的 Marionette 功能测试集进行测试;
以及支持 Marionette 的 **harness**,或 try 上的
Mn
作业,测试使用单独的模拟风格的单元测试进行验证。
所有这些测试都可以使用 mach 运行。
xpcshell 单元测试¶
Marionette 有一组位于 _remote/marionette/test/xpcshell 的 xpcshell 单元测试。可以通过以下方式运行这些测试
% ./mach test remote/marionette/test/unit
由于测试是并行运行的,并且 xpcshell 本身非常健谈,因此有时按顺序运行测试会很有用
% ./mach test --sequential remote/marionette/test/xpcshell/test_error.js
这些单元测试作为 Treeherder 上的 X
作业的一部分运行。
Marionette 功能测试¶
我们还有一组使用 Marionette Python 客户端的 功能测试。这些测试会启动一个 Firefox 进程并测试 Marionette 协议的输入和输出,并且会在 Treeherder 上显示为 Mn
。以下命令将在本地运行所有测试
% ./mach marionette-test
但是您也可以运行单个测试
% ./mach marionette-test testing/marionette/harness/marionette_harness/tests/unit/test_navigation.py
如果您想使用其他二进制文件(如 Firefox Nightly)运行测试
% ./mach marionette-test --binary /path/to/nightly/firefox TEST
在处理 Marionette 时,通常需要显示来自 Gecko 的标准输出,这可以通过使用 --gecko-log
选项来实现。有关使用方法,请参阅 调试,但要点是您可以将所有 Gecko 输出重定向到标准输出
% ./mach marionette-test --gecko-log - TEST
我们的功能集成测试会零星地弹出 Firefox 窗口,一个有用的技巧是抑制窗口可以使用 Firefox 的无头模式
% ./mach marionette-test -z TEST
-z
是 --headless
标志的别名,等效于设置 MOZ_HEADLESS
输出变量。除了 MOZ_HEADLESS
之外,还有 MOZ_HEADLESS_WIDTH
和 MOZ_HEADLESS_HEIGHT
用于控制无操作虚拟显示的尺寸。这类似于使用您可能从 X 窗口系统中知道的 Xvfb(1),但额外的好处是它也可以在 macOS 和 Windows 上工作。
Android¶
先决条件
您已 构建了 Fennec。
您可以运行 Android 模拟器,这意味着您拥有所需的 AVD。
在 Fennec 上运行测试时,您可以让 Marionette 运行程序负责启动 Fennec 和模拟器,如下所示。
% ./mach marionette-test --emulator --app fennec
--avd-home /path/to/.mozbuild/android-device/avd
--emulator-binary /path/to/.mozbuild/android-sdk/emulator/emulator
--avd=mozemulator-x86
对于 Fennec 测试,如果适当的 emulator
命令位于您的 PATH
中,您可以省略 --emulator-binary
参数。有关其他选项,请参阅 ./mach marionette-test -h
。
或者,您可以自己启动模拟器,并让 Marionette 运行程序为您启动 Fennec
% ./mach marionette-test --emulator --app='fennec' --address=127.0.0.1:2828
要连接到模拟器或设备上已运行的 Fennec,您需要使用 -marionette
命令行参数启动它,或者为该进程设置环境变量 MOZ_MARIONETTE=1
。
确保端口 2828 已转发
% adb forward tcp:2828 tcp:2828
如果 Fennec 已启动
% ./mach marionette-test --app='fennec' --address=127.0.0.1:2828
如果 Fennec 尚未在模拟器/设备上启动,请添加 --emulator
选项。Marionette 测试运行程序将负责转发端口并使用正确的偏好设置启动 Fennec。(您可能需要运行 adb forward --remove-all
以允许运行程序启动。)
% ./mach marionette-test --emulator --app='fennec' --address=127.0.0.1:2828 --startup-timeout=300
如果您需要对 Marionette 连接进行故障排除,最基本的检查是使用 -marionette
或环境变量 MOZ_MARIONETTE=1
启动 Fennec,确保端口 2828 已转发,然后查看当您手动连接时是否从 Marionette 收到任何响应
% telnet 127.0.0.1:2828
您应该看到类似 {"applicationType":"gecko","marionetteProtocol":3}
的输出
WPT 功能测试¶
Marionette 也通过 geckodriver 与 WPT(Treeherder 上的 Wd
)进行间接测试。要运行它们
% ./mach wpt testing/web-platform/tests/webdriver
WPT 测试符合 WebDriver 标准,并使用 geckodriver。它们与 Gecko 中的 Marionette 远程协议一起构成了 Mozilla 的 WebDriver 实现。
此命令支持 --webdriver-arg='-vv'
参数,该参数启用更详细的日志记录,以及 --jsdebugger
参数,用于打开浏览器工具箱。
一个特别有用的技巧是将其与 Firefox 的无头模式结合使用
% ./mach wpt --webdriver-arg='-vv' --headless testing/web-platform/tests/webdriver
Harness 测试¶
Marionette harness Python 包有一组模拟风格的单元测试,这些测试使用 pytest 框架。以下命令将运行所有测试
% ./mach python-test testing/marionette
要运行特定测试,请指定模块的完整路径
% ./mach python-test testing/marionette/harness/marionette_harness/tests/harness_unit/test_serve.py
一键借用机¶
此外,为了调试 CI 中难以重现的测试故障,来自 Taskcluster 的一键借用机可能特别有用。
树外测试¶
以上所有示例都显示了树内运行的测试,使用中心的本地检出和 Firefox 的本地构建。也可以无需本地构建并使用从 Taskcluster 下载的测试存档来运行 Marionette 测试
如果您想从下载的测试存档运行测试,则需要下载附加到 Treeherder 构建作业 B
的 target.common.tests.tar.gz
工件。解压缩存档并在虚拟环境中执行以下命令以设置 Python Marionette 客户端和 harness
% pip install -r config/marionette_requirements.txt
然后可以在marionette/tests/testing/marionette/harness/marionette_harness/tests下找到测试,并可以使用命令marionette
执行。它支持上面为mach
描述的相同选项。