测试清单

许多测试套件都将其测试元数据定义在称为**测试清单**的文件中。

测试清单分为两种类型:ManifestParser 清单Reftest 清单

命名约定

构建系统不强制执行测试清单文件的命名。但是,使用以下约定。

mochitest.toml

用于普通类型的 mochitests。

chrome.toml

用于chrome类型的 mochitests。

browser.toml

用于浏览器 chrome类型的 mochitests。

a11y.toml

用于a11y类型的 mochitests。

xpcshell.toml

用于xpcshell测试。

ManifestParser 清单

ManifestParser 清单本质上是符合一组基本假设的 toml 文件。

有关 manifestparser 清单的参考文档描述了测试清单的基本格式。

总而言之,清单是具有描述测试文件的节名称的 toml 文件

["test_foo.js"]
["test_bar.js"]

节下的键可以保存有关每个测试的元数据

["test_foo.js"]
skip-if = ["os == 'win'"]
["test_foo.js"]
skip-if = ["os == 'linux' && debug"]
["test_baz.js"]
fail-if = [
  "os == 'mac'",
  "os == 'android'",
]

有一个特殊的**DEFAULT**节,其键/元数据应用于所有节/测试

[DEFAULT]
property = value

["test_foo.js"]

在以上示例中,**test_foo.js**继承了**DEFAULT**节中的元数据**property = value**。

识别出的元数据

测试清单可以定义一些常见的键/元数据来影响行为。这些键如下所示

head

将在测试文件之前执行的文件列表。(在 xpcshell 测试中使用。)

tail

将在测试文件之后执行的文件列表。(在 xpcshell 测试中使用。)

support-files

运行测试所需的附加文件列表。这通常在**DEFAULT**节中定义。

与其他文件列表不同,support-files支持通配符机制,以最少的输入即可提取许多文件。如果此值中的条目包含*字符,则会激活此通配符机制。*将匹配目录中的所有文件。**将进入子目录。例如,data/*将匹配data/foo,但不匹配data/subdir/bar,其中data/**将匹配data/foodata/subdir/bar

/开头的支持文件将放置在根目录中,而不是由清单位置确定的位置。对于 mochitests,这允许将文件放置在服务器根目录中。源文件是从基本名称中选择的(例如,foo用于/path/foo)。不能使用通配符选择以/开头的文件。

某些支持文件由多个目录中的测试使用。在这种情况下,依赖于另一个目录中的支持文件的测试必须在其自己的**support-files**条目中使用所需支持文件的路径来记录该依赖关系。这些使用路径以!/开头的语法来指示从 srcdir 根目录开始的共享支持文件的路径的开头。例如,如果位于dom/base/test/mochitest.toml处的清单具有支持文件dom/base/test/server-script.sjs,并且dom/workers/test中的 mochitest 依赖于该支持文件,则位于dom/workers/test/mochitest.toml处的测试清单必须在其**support-files**条目中包含!/dom/base/test/server-script.sjs

generated-files

作为构建的一部分生成的文件列表,这些文件在源代码树中不存在。

构建系统假设每个清单文件、测试文件以及**head**、**tail**和**support-files**中列出的文件都是静态的,并由源代码树提供(而不是作为构建的一部分自动生成)。此变量告诉构建系统不要做出此假设。

一旦构建配置中考虑了所有生成的文件,此变量可能会在某个时候消失。

如果未在此键中列出生成的文件,则清理构建可能会失败。

dupe-manifest

记录此清单是否复制了另一个清单。

常见的情况是两个清单文件将通过["include:file"]特殊节包含一个共享的清单文件。构建系统强制执行每个测试文件仅由一个清单提供的规则。存在此键将绕过该检查。

此键的值将被忽略。

skip-if

如果指定的条件为真,则跳过此测试。请参阅清单过滤器语言

可以在多行上指定条件,其中每行都隐式地由逻辑 OR (||)连接。这使得更容易向不同的故障添加注释。例如

["test_foo.js"]
skip-if = [
    "os == 'mac' && fission",  # bug 123 - fails on fission
    "os == 'windows' && debug",  # bug 456 - hits an assertion
]
fail-if

如果指定的条件为真,则预期测试失败。请参阅清单过滤器语言

可以在多行上指定条件(请参阅skip-if)。

run-sequentially

如果存在,则不应与其他测试并行运行测试。

一些测试工具支持在单独的进程和/或线程上并行执行测试(行为因测试工具而异)。如果存在此键,则测试工具不应尝试与任何其他测试并行运行此测试。

按照惯例,此键的值是一个字符串,描述了为什么无法并行运行测试。

scheme

更改测试运行的方案和域。(仅在 mochitest 套件中使用)

有两个可能的值

清单过滤器语言

某些清单键接受特殊的过滤器语法作为其值。这些值本质上是在测试执行时计算的布尔表达式。

表达式可以引用一组定义良好的变量,例如osdebug。这些变量是从mozinfo.json文件中填充的。有关可用变量的完整列表,请参阅mozinfo 文档

请参阅源代码,了解表达式语法的完整文档,直到此处记录它为止。

文件安装

清单引用的文件会自动安装到对象目录中,安装路径在mozbuild.frontend.emitter.TreeMetadataEmitter._process_test_manifest()中定义。

解析为父目录的相对路径(例如support-files = ../foo.txt)具有特殊行为。

对于support-files,文件将安装到该清单的默认目标位置。仅使用文件的基名称来构造最终路径:目录无关紧要。以/开头的文件是一个例外,这些文件相对于目标的根目录安装;相反,使用基名称来选择文件。

对于所有其他条目类型,文件安装将被跳过。

Reftest 清单

请参阅MDN