并行运行规范

5.0.0 及更高版本支持在 Node.js 中并行执行。在同时满足所有以下条件的情况下,可以并行运行 Jasmine 规范

要使用并行模式

  1. 阅读以下限制和错误列表,并确保没有任何一项适用于你。特别是,请确保自己不必禁用随机化、指定随机种子或指定自定义顺序才能可靠地运行套件。
  2. jasmine 依赖项设置为 5.0.0 或更高版本。
  3. --parallel=<n> 参数添加到 jasmine 命令中,例如 jasmine --parallel=4 在四个并行进程中运行规范。

理想的工作线程数量取决于规范的性质以及可用 CPU 核心的数量和类型。CPU 绑定套件通常在工作线程数量略小于核心数量时运行得最快。I/O 绑定套件可能会受益于较少的工作线程。

限制

以下限制仅适用于并行模式,不适用于正常的顺序执行模式。

新增全局设置/关闭 API

Jasmine 5.0 提供了一个全新 API,用于恰好一次的全局设置和关闭。其目的是支持需要进行超进程设置的并行执行方案,无论使用多少个工作进程,只执行一次。它还可以在默认的顺序执行模式下使用。

如需使用全局设置/关闭 API,请将 globalSetup 和/或 globalTeardown 函数添加到您的 Jasmine 配置中,例如:

module.exports = {
  spec_dir: "spec",
  // ...
  globalSetup() {
    // ... your setup code here
  }
  globalTeardown() {
    // ... your teardown code here
  }
}

如果全局设置/关闭函数声明为 async 或以其他方式返回 Promise,Jasmine 将等到返回的 Promise 解决后才继续。不支持回调式异步。

不确定要使用哪个设置/关闭工具?

需要注意的差异

更新报告器以使其在并行模式中工作

并行模式对报告器施加了许多限制。由于一些最流行的第三方报告器需要进行一些更改才能在并行模式中工作,因此除非报告器声明兼容,否则 Jasmine 假定该报告器与并行模式不兼容。报告器可以通过显示值为 {parallel: true}reporterCapabilities 属性来声明它与并行模式兼容。

事件顺序

需要注意的最大限制是事件在从工作器进程接收时按原样传递。这意味着无关的规范和套件的事件可以交织在一起。假定 specDone 事件与最近接收的 specStarted 事件属于同个规范,或者假定 suiteStartedsuiteDone 事件之间的所有事件都与该套件的孩子相关,这样的报告器在并行模式下不起作用。Jasmine 仅对并行模式中的事件排序做出以下保证:

在 Jasmine 4.6 及更高版本中,套件和规范报告事件都有一个 parentSuiteId 属性,它允许报告者识别规范或套件的父套件,而无需依赖于事件顺序。

并发事件分发

在顺序模式下,Jasmine 会在继续之前等待异步报告程序函数完成。而在并行模式下则不会等待。异步报告程序应该做好处理并发事件的准备或在内部对其进行排队。

API 的区别

此外,报告程序使用的许多 API 都不可用或受到限制

请注意,上述内容仅适用于并行模式。在默认顺序模式下,Jasmine 5 与现有报告程序完全兼容。

以编程方式使用

您可以使用 ParallelRunner 类以编程方式并行运行规范。

const ParallelRunner = require('jasmine/parallel');
const runner = new ParallelRunner({numWorkers: 3});
runner.loadConfigFile('spec/support/jasmine.json');
runner.execute();

ParallelRunner 支持与 Jasmine 类相同的许多方法。有关详细信息,请参阅 API 参考文档