Отключение мокко описывается параллельно

Я хочу, чтобы все мои описания в Mocha начинались параллельно. Может кто-нибудь помочь мне выяснить, как это сделать?

Ответы

Ответ 1

Вы не можете сделать это напрямую с помощью mocha, потому что он создает список его() обратных вызовов и вызывает их по порядку. mocha-parallel-tests могут сделать это, если вы захотите переместить свои описания в отдельные.js файлы. Чтобы убедить себя, установите его где-нибудь и вызовите его с помощью короткого --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

Вы увидите, что он выполнил три (очень простых) набора тестов за время, затрачиваемое на запуск самого длинного.

Если ваши тесты не зависят от побочных эффектов предыдущих тестов, вы можете сделать их асинхронными. Простой способ сделать это - инициировать материал, который занимает некоторое время перед описанием и использовать обычный аппарат мокко для его оценки. Здесь я создаю кучу обещаний, которые требуют времени, чтобы решить, а затем снова повторить тесты, исследуя их результаты в функции.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);
  });
}

Ответ 2

Mocha не поддерживает то, что вы пытаетесь сделать из коробки. Он запускает тесты последовательно. Это имеет большое преимущество при работе с необработанным исключением: Mocha может быть уверен, что это произошло в тесте, которое оно в настоящее время работает. Поэтому он приписывает исключение текущему тесту. Конечно, возможно поддерживать параллельное тестирование, но это очень усложнит Mocha.

И я склонен согласиться с комментарием Дэвида. Я бы не делал это. На уровне, на котором обычно работает Моча, параллелизм мне не кажется особенно желательным. Где я использовал тестовый параллелизм, прежде чем он находится на уровне запущенных сквозных наборов. Например, запустите пакет против Firefox в Windows 8.1, одновременно используя тот же пакет против Chrome в Linux.

Ответ 3

Если вы используете карму для начала своих тестов, вы можете использовать параллельную карму, чтобы разделить ваши тесты на несколько экземпляров браузера. Он запускает спецификации в разных экземплярах браузера параллельно и очень прост и прост в установке:

npm i karma-parallel

а затем добавьте "parallel" в список фреймворков в файле karma.conf.js

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

карма-параллельный

Раскрытие информации: Я автор