跳转到正文

test262 覆盖率

test262是由 TC39 维护的官方一致性测试套件,也是比较 JavaScript 引擎的标准方式。

Phasis在所有类别中都以 100 % 的成绩通过了完整测试套件 — 涵盖语言语义、标准库、Intl、annexB旧版 Web 功能、staging孵化中测试目录,以及测试框架自测。没有绕过功能标志、没有宿主缺口屏蔽项,也没有按分片排除测试。

测试套件版本已固定:test262 git 子模块锁定了 Phasis 所依据的版本;只有更新子模块后,新增的上游测试才会纳入统计。COMPAT.md中的完整测试快照由 compat-matrix.yml 工作流重新生成,该工作流由人工启动,而非每次推送时运行;COMPAT.md记录了快照的生成时间和所依据的提交。

作为对照,test262.fyi会针对每个生产级 JS 引擎跟踪同一测试套件:

引擎 符合度
V8(Chrome / Node) 99.8 %
SpiderMonkey(Firefox) 99.6 %
JavaScriptCore(Safari) 99.4 %
QuickJS ~97 %
Hermes(React Native) ~95 %
Phasis 100 %

这些引擎各自仍有少量差距(新近落地的提案、仍在开发中的罕见边缘情况)。Phasis凭借专注一致性的单一用途实现填补了这一差距。

在本地运行

运行器需要 test262 子模块和仓库的测试类,而这两者都不包含在 Composer 软件包中,因此请从克隆仓库运行:

命令行
git clone https://github.com/inline0/phasis
cd phasis
git submodule update --init test262
composer install
./bin/test262 --jobs 4

在较新的 Mac 上完整运行大约需要 20 分钟;CI 矩阵会并行分片,几分钟内即可完成。

调试时只运行一个类别:

命令行
./bin/test262 --category built-ins/Array
./bin/test262 --category language/expressions/yield --failures

完整标志列表请参阅the CLI reference。

这为何重要

JavaScript的语义很微妙 — NaN !== NaN、-0 === 0、[1] + 1 === "11"、属性枚举的精确顺序、Promise 微任务的时序。运行 JS 用户代码的库必须每次都正确处理这些细节。test262是判断“正确”的标准;在 100 % 下通过,意味着一个在 V8 上运行的 JS 程序,也会在 Phasis 上生成字节完全相同的输出(仅浏览器 API 除外)。