测试

远程协议在不同的文件夹下有单元测试和功能测试

  • CDP: remote/cdp/

  • Marionette: remote/marionette/

  • 共享模块: remote/shared/

  • WebDriver BiDi: remote/webdriver-bidi/

您可能希望像这样在本地运行某个特定子文件夹下的所有测试

% ./mach test remote

单元测试

由于测试是并行运行的,并且xpcshell 本身非常冗长,因此有时按顺序运行测试会很有用

% ./mach xpcshell-test --sequential remote/cdp/test/unit/test_DomainCache.js

单元测试将作为 Treeherder 上的 X(表示 xpcshell)作业的一部分显示。

浏览器 Chrome Mochitests

我们还有一组位于多个组件下的功能性浏览器 chrome mochitests,例如 remote/shared/messagehandler/test/browser

% ./mach mochitest remote/shared/messagehandler/test/browser/browser_*

功能测试将在 Treeherder 上的 remote 作业的 M(表示 mochitest)类别下显示。

由于功能测试会零星地弹出新的 Firefox 应用程序窗口,因此一个有用的提示是在无头模式下运行它们

% ./mach mochitest --headless remote/shared/messagehandler/test/browser

--headless 标志等效于设置 MOZ_HEADLESS 环境变量。您还可以使用 MOZ_HEADLESS_WIDTHMOZ_HEADLESS_HEIGHT 来控制虚拟显示的尺寸。

用于编写异步测试的 add_task() 函数被替换为提供一些额外的测试设置和拆卸,这对于编写针对远程代理和目标的测试很有用。

CDP 也有特定的浏览器 chrome 测试。

在运行此类任务之前,将启动 nsIRemoteAgent 监听器,并连接一个CDP 客户端。您将使用此 CDP 客户端与代理交互,就像任何其他 CDP 客户端一样。

此外,目标发现也将被启用,这意味着客户端将收到 targetCreated、targetDestroyed 和 targetInfoChanged 事件。

您在测试中提供的任务函数将使用三个参数 clientCDPtab 调用

  • client 是与 nsIRemoteAgent 监听器的连接,它提供了一个客户端 CDP API

  • CDP 是 CDP 客户端类

  • tab 是为每个新测试打开的新标签页,并在测试运行后自动删除

这是将它们放在一起后的样子

add_task(async function testName({client, CDP, tab}) {
  // test tab is implicitly created for us
  info("Current URL: " + tab.linkedBrowser.currentURI.spec);

  // manually connect to a specific target
  const { mainProcessTarget } = RemoteAgent.cdp.targetList;
  const target = mainProcessTarget.wsDebuggerURL;
  const client = await CDP({ target });

  // retrieve the Browser domain, and call getVersion() on it
  const { Browser } = client;
  const version = await Browser.getVersion();

  await client.close();

  // tab is implicitly removed
});

您可以使用 createTab 选项控制 add_task(taskFunction, options) 的标签创建行为

add_task(async function testName({client}) {
  // tab is not implicitly created
}, { createTab: false });

如果您想使用此隐式设置编写异步测试,则可以使用 add_plain_task(),它的工作方式与原始 add_task() 完全相同。

Puppeteer 测试

除了我们自己的 Firefox 特定测试之外,我们还针对我们的实现运行上游的Puppeteer 测试套件,以跟踪进度,从而在 Firefox 中实现完整的Puppeteer 支持。测试是用行为驱动测试框架Mocha编写的。

Puppeteer 测试位于 remote/test/puppeteer/ 下,并且可以像这样在本地运行

% ./mach puppeteer-test

您也可以像这样针对 Chrome 运行它们

% ./mach puppeteer-test --product=chrome

默认情况下,Puppeteer 将配置为使用 WebDriver BiDi 协议。您还可以使用 --cdp 选项强制 Puppeteer 使用 CDP 协议

% ./mach puppeteer-test --cdp

默认情况下,mach 命令会自动安装 Puppeteer,但这仅在第一次需要时或当新的 Puppeteer 版本已导入项目时才需要。要跳过安装步骤,请使用 --no-install 选项。

要仅从整个测试套件中运行一些特定测试,首先必须更新相应的测试文件。要选择文件中的特定测试或测试组,请通过添加 .only 后缀(如 it.only()describe.only())来定义排他性测试

还可以像在 CI 中的工作方式一样,分批运行测试

% ./mach puppeteer-test --this-chunk=1 --total-chunks=2

可以在Mocha自己的文档中找到更多自定义选项。

测试期望元数据通过日志解析和 remote/test/puppeteer/json-mocha-reporter.js 下的自定义 Mocha 报告器收集在 remote/test/puppeteer-expected.json 中。

查看上游的Puppeteer 测试套件文档,了解有关如何跳过测试、仅运行一个测试或测试子套件的说明。

在 Try 上测试

要在 try 上安排所有远程协议测试,您可以使用 remote-protocol try 预设

% ./mach try --preset remote-protocol

但您也可以通过自己选择相关的作业来安排测试

% ./mach try fuzzy