我希望能够让我在Mocha中的所有描述语句并行启动。有人可以帮我弄明白怎么做吗?
答案 0 :(得分:12)
Mocha不支持你想要开箱即用的东西。它按顺序运行测试。在处理未处理的异常时,这有一个很大的优势:Mocha可以确保它在当前正在运行的测试中发生。所以它归因于当前测试的例外。当然可以支持并行测试,但它会使Mocha复杂化。
我倾向于同意David's comment。我不会这样做。在摩卡通常运作的层面上,并行性似乎并不是我特别需要的。我之前使用测试并行性的地方是在运行端到端套件的水平。例如,在Windows 8.1中针对Firefox运行套件,同时针对Linux中的Chrome运行相同的套件。
答案 1 :(得分:10)
您无法直接使用mocha执行此操作,因为它会创建it()回调列表并按顺序调用它们。 如果您愿意将您的描述移动到单独的.js文件中,mocha-parallel-tests可以执行此操作。为了说服自己,将其安装在某处并使用short -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设备来评估它。在这里,我创建了一堆承诺,需要一段时间来解决,然后再次遍历测试,在.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
进行调用。)
Meta 我不同意测试主要应该是同步的断言。在编译指示之前和之后更容易,但是一个测试使所有剩余测试无效是很少见的。所有令人沮丧的异步测试确实阻止了对网络任务的广泛测试。
答案 2 :(得分:1)
如果您正在使用业力来开始测试,则可以使用karma-parallel在多个浏览器实例之间拆分测试。它在不同的浏览器实例中并行运行规范,非常简单,易于安装:
npm i karma-parallel
然后将'parallel'添加到karma.conf.js
中的框架列表中module.exports = function(config) {
config.set({
frameworks: ['parallel', 'mocha']
});
};
披露:我是作者