【问题标题】:Kicking off mocha describes in parallel启动摩卡描述并行
【发布时间】:2015-12-22 15:27:18
【问题描述】:

我希望能够同时启动我在 Mocha 中的所有描述语句。有人可以帮我弄清楚该怎么做吗?

【问题讨论】:

  • 您为什么要这样做?由于before/beforeEach/after/afterEach 可以按任何顺序运行,并且由于所有测试都在同一个进程中运行,所以竞争条件会比比皆是,因此您的单身人士将拥有相同的 require 缓存,同样环境变量等。无论如何,NodeJS 都是单线程的,所以我怀疑你是否真的会从中受益,除非你正在等待延迟操作(如 HTTP 调用)完成。
  • 我有大约 50 种不同的描述语句来测试 Rest API,并且所有测试都是相互独立的。我试图看看是否可以一次或分批开始执行我的所有测试。我只是希望能够减少运行测试所花费的时间。
  • 还有其他测试运行器(如 Jasmine)可以支持它,但我根本不会这样做。我会充满信心并在任何一天对我的测试进行稍长的测试,这可能不是真正独立的,会导致误报,或更严重的误报。
  • 有道理。感谢您的建议。

标签: node.js mocha.js


【解决方案1】:

您不能直接使用 mocha 执行此操作,因为它会创建一个 it() 回调列表并按顺序调用它们。 如果您愿意将您的描述移动到单独的 .js 文件中,mocha-parallel-tests 可以这样做。为了说服自己,请将其安装在某个地方并使用简短的 --slow 调用它,以便每次都报告:

laptop:/tmp/delme$ npm install mocha-parallel-tests
laptop:/tmp/delme$ cd node_modules/mocha-parallel-tests
laptop:/tmp/delme/node_modules/mocha-parallel-tests$ ./bin/mocha-parallel-tests test/parallel/tests --timeout 10000 --slow 100

您会看到它在最长的时间内运行了三个(非常简单的)测试套件。

如果您的测试不依赖于早期测试的副作用,您可以将它们全部设为异步。 一个简单的方法是在描述之前启动需要一段时间的东西,并使用常规的 mocha 设备来评估它。在这里,我创建了一堆需要一段时间才能解决的 Promise,然后再次迭代测试,在 .then() 函数中检查它们的结果:

var expect = require("chai").expect;

var SlowTests = [
  { name: "a" , time: 250 },
  { name: "b" , time: 500 },
  { name: "c" , time: 750 },
  { name: "d" , time:1000 },
  { name: "e" , time:1250 },
  { name: "f" , time:1500 }
];

SlowTests.forEach(function (test) {
  test.promise = takeAWhile(test.time);
});

describe("SlowTests", function () {
  // mocha defaults to 2s timeout. change to 5s with: this.timeout(5000);
  SlowTests.forEach(function (test) {
    it("should pass '" + test.name + "' in around "+ test.time +" mseconds.",
       function (done) {
         test.promise.then(function (res) {
           expect(res).to.be.equal(test.time);
           done();
         }).catch(function (err) {
           done(err);
         });
       });
  });
});

function takeAWhile (time) {
  return new Promise(function (resolve, reject) {
    setTimeout(function () {
      resolve(time);
    }, time);
  });
}
(将其保存为foo.js 并使用mocha foo.js 调用。)

我不同意测试应该主要是同步的断言。之前和之后的编译指示更容易,但很少有一个测试使所有剩余的测试无效。所有令人沮丧的异步测试都会阻止对网络任务进行广泛的测试。

【讨论】:

  • 你说“我不同意测试应该主要是同步的断言。”好吧,这很好,但是没有人这么说。 我和其他人所说的是测试应该是顺序的,但“顺序”并不意味着“同步”。您展示的示例代码并不是让 Mocha 并行运行测试的示例。
  • 异步运行测试允许引擎并行处理许多慢速任务,例如文件或网络访问。如果您的测试本身是计算密集型的,那么它不能替代并行流程,但在我见过的大多数情况下,异步测试大大减少了测试时间——如果您在提交之前进行测试,那就很轻松了。
  • 你没有解决我在之前评论中所说的任何内容。
【解决方案2】:

Mocha 不支持开箱即用的操作。它按顺序运行测试。这在处理未处理的异常时有一个很大的优势:Mocha 可以确定它发生在当前正在运行的测试中。因此,它将异常归因于当前测试。支持并行测试当然是可能的,但它会使 Mocha 变得相当复杂。

我倾向于同意David's comment。我不会这样做。在 Mocha 通常运行的级别上,并行性在我看来并不是特别可取的。我之前使用测试并行性的地方是运行端到端套件。例如,在 Windows 8.1 中针对 Firefox 运行一个套件,同时在 Linux 中针对 Chrome 运行相同的套件。

【讨论】:

  • @Louis 你对用 mocha 处理大量测试有什么建议吗?例如,我们有 1900 个测试,并且由于 Ember-cli 的测试生成,除了 eslint 等之外,我们还在不断攀升。
  • @MohamedElMahallawy 我最大的 Mocha 套件有大约 350 个测试。所以你说的不是我必须用 Mocha 解决的问题。当我运行我的 Selenium 测试时,我遇到了数千个单独的测试,这些测试是使用基于 Python 的behave 运行的。当我手动运行测试时,我会积极地将测试的数量缩小到仅直接相关的测试。我使用Buildbot(也是基于 Python 的)自动启动贯穿整个套件的构建。
【解决方案3】:

如果您使用 karma 开始测试,您可以使用 karma-parallel 将测试拆分到多个浏览器实例中。它在不同的浏览器实例中并行运行规范,并且非常简单且易于安装:

npm i karma-parallel

然后将“并行”添加到 karma.conf.js 中的框架列表中

module.exports = function(config) {
  config.set({
    frameworks: ['parallel', 'mocha']
  });
};

karma-parallel

披露:我是作者

【讨论】:

    【解决方案4】:

    只是为了更新这个问题,Mocha 版本 8+ 现在natively supports parallel runs。您可以使用 --parallel 标志并行运行测试。

    并行测试应该适用于许多用例。但是,您必须了解该行为的一些重要含义

    需要注意的一点,some reporters 目前不支持此执行(例如mocha-junit-reporter

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-27
      • 2018-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多