如何将自定义数据传递给我的 mocha 测试?
How can I pass custom data to my mocha tests?
我们正在使用 sauce labs 进行 cross-platform/cross-browser 测试。
你可以在这个要点中找到我的测试套件(以节省这个问题的空间):https://gist.github.com/chevex/397a5a18a1a386897b41
问题是我能弄清楚如何将自定义数据传递给测试套件的唯一方法是 via an environment variable。因此,当我的 gulp 任务尝试针对多个目标并行 运行 测试套件时,由于循环完成迭代和 process.env.SAUCE_TARGET
设置为第一个套件甚至 运行s 之前的最终值。
var gulp = require('gulp');
var gulpMocha = require('gulp-mocha');
var mergeStream = require('merge-stream');
gulp.task('sauce-tests', function () {
var targets = ['chrome', 'firefox', 'internet explorer'];
var streams = targets.map(function (target) {
process.env.SAUCE_TARGET = target;
return gulp.src('./test/sauce-tests.js', {read:false})
.pipe(gulpMocha({ reporter: 'spec' });
});
return mergeStream.apply(null, streams);
});
forEach
提供的闭包没有帮助,因为它在每次迭代时都设置了一个本质上全局的值 (process.env.SAUCE_TARGET
)。
是否有更好的方法将 SAUCE_TARGET
传递到我的测试套件,以便我可以 运行 多个测试套件并行使用不同的目标值?
如果我 运行 同步所有测试,我可以让它工作,但这比我想要的要长得多。唯一阻止并行性的是我无法将封装值传递给我的 mocha 套件。
您可以尝试将其设置在管道之间,特别是使用冲洗功能:
var through = require('through2');
var setTarget = function (target) {
return through.obj(
function (chunk, enc, cb) { cb(null, chunk) },
function (cb) { // flush function
process.env.SAUCE_TARGET = target;
cb();
}
);
}
var streams = targets.map(function (target) {
return gulp.src('./test/sauce-tests.js', {read:false})
.pipe(setTarget(target))
.pipe(gulpMocha({ reporter: 'spec', globals: [target] });
});
您可以 运行 使用 child_process
模块在多个浏览器中并行测试。
var exec = require('child_process').exec;
function runMochaTests(browser) {
return new Promise(function(resolve, reject) {
var env = {SAUCE_TARGET: browser};
exec('./node_modules/.bin/mocha --reporter spec', {env: env}, function(err) {
if(err !== null) {
return reject(err);
}
return resolve();
});
});
}
它创建带有测试的子进程。当前浏览器将作为 process.env.SAUCE_TARGET
.
提供
然后你可以在gulp任务中使用这个函数来运行在不同的浏览器中进行测试。
gulp.task('tests', function() {
return Promise.all(['chrome', 'firefox', 'internet explorer'].map(function(browser) {
return runMochaTests(browsers);
}));
});
这里使用了 Promises,因为 gulp
可以接受它们作为任务结果,并且会等到测试在所有浏览器中完成。
您还可以在此处添加一些语法糖,例如 denodeify 以缩短 exec
的工作时间。
我们正在使用 sauce labs 进行 cross-platform/cross-browser 测试。
你可以在这个要点中找到我的测试套件(以节省这个问题的空间):https://gist.github.com/chevex/397a5a18a1a386897b41
问题是我能弄清楚如何将自定义数据传递给测试套件的唯一方法是 via an environment variable。因此,当我的 gulp 任务尝试针对多个目标并行 运行 测试套件时,由于循环完成迭代和 process.env.SAUCE_TARGET
设置为第一个套件甚至 运行s 之前的最终值。
var gulp = require('gulp');
var gulpMocha = require('gulp-mocha');
var mergeStream = require('merge-stream');
gulp.task('sauce-tests', function () {
var targets = ['chrome', 'firefox', 'internet explorer'];
var streams = targets.map(function (target) {
process.env.SAUCE_TARGET = target;
return gulp.src('./test/sauce-tests.js', {read:false})
.pipe(gulpMocha({ reporter: 'spec' });
});
return mergeStream.apply(null, streams);
});
forEach
提供的闭包没有帮助,因为它在每次迭代时都设置了一个本质上全局的值 (process.env.SAUCE_TARGET
)。
是否有更好的方法将 SAUCE_TARGET
传递到我的测试套件,以便我可以 运行 多个测试套件并行使用不同的目标值?
如果我 运行 同步所有测试,我可以让它工作,但这比我想要的要长得多。唯一阻止并行性的是我无法将封装值传递给我的 mocha 套件。
您可以尝试将其设置在管道之间,特别是使用冲洗功能:
var through = require('through2');
var setTarget = function (target) {
return through.obj(
function (chunk, enc, cb) { cb(null, chunk) },
function (cb) { // flush function
process.env.SAUCE_TARGET = target;
cb();
}
);
}
var streams = targets.map(function (target) {
return gulp.src('./test/sauce-tests.js', {read:false})
.pipe(setTarget(target))
.pipe(gulpMocha({ reporter: 'spec', globals: [target] });
});
您可以 运行 使用 child_process
模块在多个浏览器中并行测试。
var exec = require('child_process').exec;
function runMochaTests(browser) {
return new Promise(function(resolve, reject) {
var env = {SAUCE_TARGET: browser};
exec('./node_modules/.bin/mocha --reporter spec', {env: env}, function(err) {
if(err !== null) {
return reject(err);
}
return resolve();
});
});
}
它创建带有测试的子进程。当前浏览器将作为 process.env.SAUCE_TARGET
.
然后你可以在gulp任务中使用这个函数来运行在不同的浏览器中进行测试。
gulp.task('tests', function() {
return Promise.all(['chrome', 'firefox', 'internet explorer'].map(function(browser) {
return runMochaTests(browsers);
}));
});
这里使用了 Promises,因为 gulp
可以接受它们作为任务结果,并且会等到测试在所有浏览器中完成。
您还可以在此处添加一些语法糖,例如 denodeify 以缩短 exec
的工作时间。