测试¶
远程协议在不同的文件夹下有单元测试和功能测试
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_WIDTH
和 MOZ_HEADLESS_HEIGHT
来控制虚拟显示的尺寸。
用于编写异步测试的 add_task()
函数被替换为提供一些额外的测试设置和拆卸,这对于编写针对远程代理和目标的测试很有用。
CDP 也有特定的浏览器 chrome 测试。
在运行此类任务之前,将启动 nsIRemoteAgent
监听器,并连接一个CDP 客户端。您将使用此 CDP 客户端与代理交互,就像任何其他 CDP 客户端一样。
此外,目标发现也将被启用,这意味着客户端将收到 targetCreated、targetDestroyed 和 targetInfoChanged 事件。
您在测试中提供的任务函数将使用三个参数 client
、CDP
和 tab
调用
client
是与nsIRemoteAgent
监听器的连接,它提供了一个客户端 CDP APICDP
是 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