运行自动化的 JavaScript 测试

SpiderMonkey 使用两个独立的测试套件。

Test262 测试套件 是 ECMA-262(JavaScript 语言规范)的实现一致性测试套件。所有 JavaScript 引擎都使用 Test262 来确保它们正确地实现了 JavaScript。Test262 使用 mach jstests 运行。

除了 Test262 之外,SpiderMonkey 还拥有大量内部测试。这些测试使用 mach jit-test 运行。

这两套测试都可以在 JS shell 的普通构建版本中运行。

本地运行 Test262

jstests shell 框架位于 js/src/tests/jstests.py 中。可以使用以下命令调用它:

./mach jstests

请注意,mach 通常会找到 JS shell 本身;可以使用 –shell 参数手动指定位置。所有其他标志都将传递给框架。

Test262 包含大量测试。在处理特定功能时,指定测试子集通常很有用

./mach jstests TEST_PATH_SUBSTRING [TEST_PATH_SUBSTRING_2 ...]

这将运行路径包含任何 TEST_PATH_SUBSTRING 的所有测试。要排除测试,可以使用 --exclude=EXCLUDED 选项。其他有用的选项包括

  • -s (--show-cmd):显示用于运行每个测试的确切命令行。

  • -o (--show-output):打印每个测试的输出。

  • --args SHELL_ARGS:传递给 JS shell 的额外参数。

  • --rrrr 记录和回放调试器下运行测试。

有关选项的完整列表,请使用

./mach jstests -- -h

Test262 测试也可以在浏览器中运行,使用

./mach jstestbrowser

要运行特定测试,可以使用 --filter=PATTERN 选项,其中 PATTERN 是一个 RegExp 模式,该模式针对 file:///{PATH_TO_OBJ_DIR}/dist/test-stage/jsreftest/tests/jsreftest.html?test={RELATIVE_PATH_TO_TEST_FROM_js/src/tests} 进行测试。

出于历史原因,jstests 还包含一个 SpiderMonkey 特定的附加语言特性测试套件,位于 js/src/tests/non262 中。

本地运行 jit-tests

jit-test shell 框架位于 js/src/jit-test/jit_test.py 中。可以使用以下命令调用它:

./mach jit-test

mach jit-test 的基本用法类似于 mach jstests。可以指定测试的子集

./mach jit-test TEST_PATH_SUBSTRING [TEST_PATH_SUBSTRING_2 ...]

--jitflags 选项允许您使用不同的标志测试 JS 可执行文件。这些标志用于控制运行哪些功能,例如启用哪些 JIT 以及它们启动的速度。有效选项是名为 bundle 的,如 'all'、'interp'、'none' 等。在 -h / --help 输出中查看完整列表。

另一个特定于 jit-tests 的有用选项是 -R <filename>(或 --retest <filename>)。第一次运行时,它会运行整个测试套件并将失败测试的列表写入给定的文件名。下次运行时,它将只运行给定文件名中的测试,然后在完成时将写入失败测试的列表。因此,您可以继续在修复错误时重新测试,并且只运行上次失败的测试,从而加快速度。

其他有用的选项包括

  • -s (--show-cmd):显示用于运行每个测试的确切命令行。

  • -o (--show-output):打印每个测试的输出。

  • --args SHELL_ARGS:传递给 JS shell 的额外参数。

  • --debug-rrrr 记录和回放调试器下运行测试。

  • --cgc 使用频繁的压缩 GC 运行测试(相当于 SM(cgc))。

添加新的 jit-tests

为 jit-tests 创建新测试很容易。只需在 js/src/jit-test/tests 下的适当目录中添加一个新的 JS 文件。(默认情况下,测试应该放在 test/basic 中。)测试框架会自动找到测试并运行它。如果 JS shell 的退出代码为零(即 JS 没有崩溃并且没有 JS 错误),则认为测试通过。使用 assertEq 函数验证测试中的值。

测试有一些高级选项。有关详细信息,请参阅自述文件(位于 js/src/jit-tests 中)。

在 Treeherder 上运行 jstests

在 Treeherder 上,在浏览器中运行的 jstests 显示为 R(J)(在 mach try fuzzy 中搜索 jsreftest)。SpiderMonkey shell 作业显示为 SM(...);其中大多数包括 jstests 和 jit-tests 的 JS shell 运行。