开场摩卡并行描述
Kicking off mocha describes in parallel
我希望能够并行启动我在 Mocha 中的所有描述语句。有人可以帮我弄清楚该怎么做吗?
Mocha 不支持您尝试开箱即用的功能。它 运行s 按顺序进行测试。这在处理未处理的异常时有一个很大的优势:Mocha 可以确定它发生在当前正在 运行ning 的测试中。所以它将异常归因于当前测试。支持并行测试当然是可能的,但它会使 Mocha 变得相当复杂。
我倾向于同意。我不会这样做。在 Mocha 通常运行的级别上,并行性在我看来并不是特别可取。我之前使用测试并行性的地方是 运行ning 端到端套件级别。例如,运行 在 Windows 8.1 中针对 Firefox 的套件,同时 运行 在 Linux 中针对 Chrome 设置相同的套件。
您不能直接使用 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 工具对其进行评估。在这里,我创建了一堆需要一段时间才能解决的承诺,然后再次遍历测试,在 .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 我不同意测试应该主要是同步的断言。编译指示之前和之后更容易,但很少有一次测试会使所有其余测试无效。所有令人沮丧的异步测试都会阻碍对网络任务的广泛测试。
如果您使用 karma 开始测试,您可以使用 karma-parallel 将测试拆分到多个浏览器实例中。它在不同的浏览器实例中并行运行规范,并且非常简单且易于安装:
npm i karma-parallel
然后将 'parallel' 添加到 karma.conf.js
中的框架列表
module.exports = function(config) {
config.set({
frameworks: ['parallel', 'mocha']
});
};
披露:我是作者
只是为了更新这个问题,Mocha 版本 8+ 现在 natively supports parallel runs。您可以使用 --parallel
标志来 运行 并行测试。
Parallel tests should work out-of-the box for many use cases. However, you must be aware of some important implications of the behavior
1 个注意事项,例如 some reporters don't currently support this execution (mocha-junit-reporter)
我希望能够并行启动我在 Mocha 中的所有描述语句。有人可以帮我弄清楚该怎么做吗?
Mocha 不支持您尝试开箱即用的功能。它 运行s 按顺序进行测试。这在处理未处理的异常时有一个很大的优势:Mocha 可以确定它发生在当前正在 运行ning 的测试中。所以它将异常归因于当前测试。支持并行测试当然是可能的,但它会使 Mocha 变得相当复杂。
我倾向于同意
您不能直接使用 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 工具对其进行评估。在这里,我创建了一堆需要一段时间才能解决的承诺,然后再次遍历测试,在 .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 我不同意测试应该主要是同步的断言。编译指示之前和之后更容易,但很少有一次测试会使所有其余测试无效。所有令人沮丧的异步测试都会阻碍对网络任务的广泛测试。
如果您使用 karma 开始测试,您可以使用 karma-parallel 将测试拆分到多个浏览器实例中。它在不同的浏览器实例中并行运行规范,并且非常简单且易于安装:
npm i karma-parallel
然后将 'parallel' 添加到 karma.conf.js
中的框架列表module.exports = function(config) {
config.set({
frameworks: ['parallel', 'mocha']
});
};
披露:我是作者
只是为了更新这个问题,Mocha 版本 8+ 现在 natively supports parallel runs。您可以使用 --parallel
标志来 运行 并行测试。
Parallel tests should work out-of-the box for many use cases. However, you must be aware of some important implications of the behavior
1 个注意事项,例如 some reporters don't currently support this execution (mocha-junit-reporter)