Ответ 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);
});
}