测试

我们通过多种方式验证和测试 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_WIDTHMOZ_HEADLESS_HEIGHT 用于控制无操作虚拟显示的尺寸。这类似于使用您可能从 X 窗口系统中知道的 Xvfb(1),但额外的好处是它也可以在 macOS 和 Windows 上工作。

Android

先决条件

在 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 构建作业 Btarget.common.tests.tar.gz 工件。解压缩存档并在虚拟环境中执行以下命令以设置 Python Marionette 客户端和 harness

% pip install -r config/marionette_requirements.txt

然后可以在marionette/tests/testing/marionette/harness/marionette_harness/tests下找到测试,并可以使用命令marionette执行。它支持上面为mach描述的相同选项。