编写新的 DAMP 性能测试¶
请参阅 DAMP 性能测试,以了解我们性能测试的总体描述。在这里,我们将介绍如何编写新的测试并将其注册到 DAMP 中以运行。
注意
如果可能,请重用现有测试! 如果您正在测试的工具已存在 custom
页面,请尝试修改现有的 custom
测试,而不是添加新的独立测试。新的独立测试会在新的选项卡中单独运行,这会使 DAMP 比仅修改现有测试慢。使 custom
测试页面复杂化也有助于涵盖更多场景并捕获更多回归。出于这些原因,修改现有测试应该是扩展 DAMP 覆盖范围的首选方法。 custom
测试使用复杂的文档,这些文档应该以各种方式给特定工具带来压力。它们都命名为 custom.${tool}
(例如 custom.inspector
)。这些测试的测试页面可以在 pages/custom 中找到。如果您的测试用例需要专用的文档或无法与当前 custom
测试中的其他测试一起运行,请按照以下说明添加新的独立测试。
此页面包含编写 DAMP 测试的通用文档。另请参阅
测试位置¶
测试位于 testing/talos/talos/tests/devtools/addon/content/tests。您会找到 DAMP 中已测试的面板(调试器、检查器等)的子文件夹,以及其他不特定于给定面板的测试的子文件夹(服务器、工具箱)。
测试隔离在专用文件中。一些测试示例
基本测试¶
测试的基本框架是
const {
testSetup,
testTeardown,
SIMPLE_URL,
} = require("devtools/docs/head");
module.exports = async function() {
await testSetup(SIMPLE_URL);
// Run some measures here
await testTeardown();
};
始终通过调用
testSetup(url)
来开始测试,其中url
是要使用的文档的 URL始终以
testTeardown()
结束测试
测试文档¶
DevTools 性能很大程度上取决于打开 DevTools 的文档。有两个“历史”文档可用于任何面板的测试
“简单”,一个空白网页。这有助于突出显示面板的加载时间,
“复杂”,德国报纸网站 bild.be 的副本。这使我们能够检查在检查复杂的大型网站时工具的性能。
这些文档的 URL 由 tests/head.js 公开。简单页面可以在 testing/talos/talos/tests/devtools/addon/content/pages/simple.html 中找到。复杂页面通过 tooltool 在您第一次运行 DAMP 测试时自动下载。
您还可以创建 testing/talos/talos/tests/devtools/addon/content/pages 下的新测试文档。例如,请参阅 custom
子文件夹中的页面。如果您在 pages/custom/mypanel/index.html
中创建了一个文档,则测试中该文档的 URL 应为 PAGES_BASE_URL + "custom/mypanel/index.html"
。常量 PAGES_BASE_URL
由 head.js 公开。
请注意,修改任何现有测试文档很可能会影响现有测试的基线。
最后,您还可以使用数据 URL 创建非常简单的测试文档。测试文档不必包含任何特定的标记或脚本才能成为有效的 DAMP 测试文档,因此像 testSetup("data:text/html,my test document");
这样简单的东西就是有效的。
测试助手¶
助手方法已提取到共享模块中
tests/head.js 用于最常见的助手方法
tests/{subfolder}/{subfolder}-helpers.js 用于特定于文件夹的助手方法(示例)
要测量现有助手未涵盖的内容,您应该使用 head.js 公开的 runTest
。
module.exports = async function() {
await testSetup(SIMPLE_URL);
// Calling `runTest` will immediately start recording your action duration.
// You can execute any necessary setup action you don't want to record before calling it.
const test = runTest(`mypanel.mytest.mymeasure`);
await doSomeThings(); // <== Do an action you want to record here
// Once your action is completed, call `runTest` returned object's `done` method.
// It will automatically record the action duration and appear in PerfHerder as a new subtest.
// It also creates markers in the profiler so that you can better inspect this action in
// profiler.firefox.com.
test.done();
await testTeardown();
};
如果您的度量不仅仅是异步调用花费的时间(例如计算平均值、计数等),则有一个称为 logTestResult
的较低级别助手,它将直接记录一个值。请参阅 此示例。
测试运行器¶
如果您需要深入了解 DAMP 运行器的内部机制,大多数逻辑都在 testing/talos/talos/tests/devtools/addon/content/damp.js 中。
如何命名您的测试并注册它?¶
如果创建了新的测试文件,则需要在测试套件中注册它。要注册新测试,请将其添加到 damp-tests.js 中。此文件充当 DAMP 测试套件的清单。
如果您正在编写针对 Simple 和 Complicated 文档执行的测试,则您的测试名称将如下所示: (simple|complicated).${tool-name}.${test-name}
。因此,对于我们的示例,它将是 simple.inspector.click
和 complicated.inspector.click
。对于不使用 Simple 或 Complicated 文档的独立测试,如果测试特定于该工具,则测试名称只需要以工具名称开头对于示例,它将是 inspector.click
。
通常,测试名称应尝试匹配测试文件的路径。正如您在 damp-tests.js 中看到的,此命名约定并非始终如一地遵循。对于简单/复杂/自定义测试以及 webconsole 测试,我们存在差异。这主要出于历史原因。
您会看到测试被分成不同的子套件:damp-inspector、damp-other 和 damp-webconsole。拆分这些测试的目的是在 CI 中并行运行 DAMP 测试,因此我们的目标是在测试数量和运行时间方面保持平衡。将您的测试添加到最合理的套件中。如果需要,我们将来可以添加更多套件并在将来重新排列测试。
如何运行您的新测试?¶
您可以使用以下命令运行任何性能测试
./mach talos-test --suite damp --subtest ${your-test-name}
默认情况下,它将运行测试 25 次。为了只运行一次,请执行以下操作:
./mach talos-test --suite damp --subtest ${your-test-name} --cycles 1 --tppagecycles 1
--cycles
控制 Firefox 重启的次数 --tppagecycles
定义每次 Firefox 启动后我们重复测试的次数
此外,您可以在运行测试时记录配置文件。为此,请执行以下操作:
./mach talos-test --suite damp --subtest ${your-test-name} --cycles 1 --tppagecycles 1 --gecko-profile --gecko-profile-entries 100000000
--gecko-profile
启用分析器 --gecko-profile-entries
定义分析器缓冲区大小,在记录性能测试时需要将其设置得很大
执行完成后,配置文件位于您需要解压缩的 zip 文件中,如下所示:
unzip testing/mozharness/build/blobber_upload_dir/profile_damp.zip
然后,您必须打开 https://profiler.firefox.com/ 并手动加载位于此处的配置文件: profile_damp/page_0_pagecycle_1/cycle_0.profile