实现与测试86

在 2008 年 7 月于奥斯陆举行的 Ecma TC39 会议上,委员会同意在发布 ES3.1 之前,先获得两种互相兼容的实现。提出「两种互相兼容的实现」需求的主要原因,是确保 TC39 不会去对那些尚未被证明「技术上可行且与现有 Web 内容兼容」的内容进行标准化。Mozilla 承诺提供其中一种实现。由于微软的市场地位及其历来低频的浏览器更新,TC39 内部有一种强烈的情绪,认为微软应该公开浏览器宿主内的语言原型实现,以此作为 ES3.1 验证过程的一部分,展示它对 ES3.1 所应承担的责任。当时 TC39 计划在 2009 年 6 月的 Ecma GA 大会上,做好发布 ES3.1 的准备。这需要在 2009 年 3 月的 TC39 会议上,根据在 2 月到 3 月期限内所进行的互通性测试的结果,来决定出是否继续。当时还没有针对 ECMA-262 的官方一致性测试(conformance test)套件,自然也没有针对 ES3.1 新特性的测试用例,各种语言实现都具备自己的专用测试(ad hoc test)套件。另外除微软外的所有语言实现,也会使用 Mozilla 的 JavaScript 测试套件。微软对 Mozilla 测试套件所使用的 Mozilla 公共许可证有所顾虑,因此不会使用或贡献它。微软的首选测试套件应该使用 MIT 或 BSD 风格许可证,经由 Ecma 来提供。

在 2008 年 10 月,Pratap Lakshman 开始同时开发以 IE 为宿主的 ES3.1 实现,以及为其配套的测试套件。

已被实现出的测试用例将被贡献回社区。而整个测试套件的目标则是实现最大的代码覆盖率,这里的「代码」指的是规范中的伪代码。每个测试用例都以它在最新规范草案中的章节和算法步骤编号来命名,并放置在单独的 .js 源文件中。图 36 说明了测试文件所使用的命名约定。

sectionNumber-algorithmStepNumber-testNumber-s.js
sectionNumber规范中的章节号
algorithmStepNumber某个算法步骤,其需求可由该测试用例验证
testNumber可选,应于该算法步骤具备多个测试用例时添加
-s可选,应于测试用例面向严格模式时添加

图 36. 用于 esconform 测试用例文件的命名约定。每个文件包含一个测试,并以其在规范中所测试的伪代码步骤作为文件名。

Lakshman 实现了 900 多个测试用例,以及一个用于运行和报告各用例的简单测试工具。图 37 是其中一个测试用例的示例。

  1. // Test Subclause 10.4.2 Alorithm 3 Step 1 Strict mode}
  2. var testName =
  3. "Eval code in strict mode-cannot instantiate variable in calling context";
  4. function testcase() {
  5. eval("'use strict ';var __10_4_2_3_1_s = 1");
  6. try{
  7. __10_4_2_3_1_s;
  8. } catch(e) {
  9. if (e instanceof ReferenceError)
  10. return true;
  11. }
  12. }

图 37. 一个 ES5conform 测试。这个测试用例位于微软为 TC39 提供的初始 zip 文件中的 10.4.2-3-1-s.js 中 [Microsoft 2009a]。

在 2009 年 1 月的 TC39 会议 [Horwat 2009] 上,Pratap Lakshman 演示了 ES3.1 的原型。它将实验版 JSCRIPT.dll 集成到了刚发布的微软 IE 8 Release Candidate 1 版本中 。这次演示的内容包含了新语言特性与一致性测试套件。人们对这项工作大加赞赏,Waldemar Horwat 在会议记录中提到:「开发者们欣喜若狂」。

微软向 Ecma 贡献了这些测试,并在其开源项目门户 codeplex.com 上以「ES5conform」[2009] 的名义发布了它们。大致在同一时间,谷歌宣布 [Hansen 2009] 将发布他们在开发 Chrome 的 V8 JavaScript 引擎过程中创建的开源 ES3 测试套件。这个测试套件被命名为「Sputnik」,包含了 5000 多个测试。

2010 年,ES5conform 和 Sputnik 成为了名为「Test262」的通用测试套件的核心,这一套件由 Ecma TC39 管理。像这样由 Ecma 技术委员会来维护和分发软件包,是一种根本性的改变。为了实现这一目标,必须要解决许多政策与许可证问题。Test262 开发过程中,最早的 ES5 阶段由 David Fugate 领导,到 ES6 阶段这一职责交给了 Brian Terlson。在 ES6 阶段后,Test262 由 Leo Balter 组织。现在,Test262 已经成为了 TC39 开发过程中不可或缺的一部分,每个 ECMAScript 新特性必须在测试后才能纳入 ECMAScript 标准。截至 2018 年 8 月 21 日,Test262 包含了 61877 个测试。Test262 的成功使得 TC39 相信,现在的规范已经不再需要配套的可执行文件了。