如何将自定义数据传递给我的mocha测试?

时间:2015-05-30 21:22:51

标签: javascript node.js gulp mocha saucelabs

我们正在使用sauce labs进行跨平台/跨浏览器测试。

你可以在这个要点中找到我的测试套件(为了节省这个问题的空间):https://gist.github.com/chevex/397a5a18a1a386897b41

问题在于我能够弄清楚如何将自定义数据传递到测试套件的唯一方法是via an environment variable。因此,当我的gulp任务尝试并行地针对多个目标运行测试套件时,它们都会针对相同的目标运行,因为循环完成迭代并且process.env.SAUCE_TARGET被设置为第一个之前的最终值套房甚至可以运行。

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套件。

2 个答案:

答案 0 :(得分:2)

您可以使用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

答案 1 :(得分:0)

您可以尝试在管道之间进行设置,特别是使用刷新功能:

  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] });
  });