编写新的 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.clickcomplicated.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