如何将自定义数据传递给我的 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 的工作时间。