【问题标题】:How can I pass custom data to my mocha tests?如何将自定义数据传递给我的 mocha 测试?
【发布时间】:2015-05-30 21:22:50
【问题描述】:

我们正在使用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 套件。

【问题讨论】:

    标签: javascript node.js gulp mocha.js saucelabs


    【解决方案1】:

    您可以使用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 的使用时间。

    【讨论】:

    • 你知道为什么我会收到 command not recognized: mocha 错误吗?我可以从命令行运行 mocha 就好了,但是当它试图从这个子进程运行时它找不到命令。
    • 这意味着你没有全局mocha。更新了答案,现在它在node_modules 文件夹中搜索
    • 啊,但我确实有全局 mocha,而且我也已经尝试指定本地路径。它说没有这样的文件,即使当我手动导航到那里时它也在那里。我什至试过path.join(__dirname, 'node_modules', '.bin', 'mocha')。它肯定在那里,但由于某种原因子进程找不到它。我肯定也有 global mocha,我可以手动运行它。
    • 我可以运行“帮助”之类的命令,但它找不到 mocha,即使指定了完全限定的路径。谷歌没有帮助。很奇怪。
    • 我尝试将process.env.PATH 添加到我们提供给子进程的env。没有帮助。我也尝试过var env = _.extend({}, process.env, { SAUCE_TARGET: target });,我什至手动启动/bin/sh(似乎是要启动的)并从那里运行mocha,它起作用了:/
    【解决方案2】:

    您可以尝试在管道之间设置它,特别是使用 flush 功能:

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

    【讨论】:

    • 这似乎有同样的问题。所有测试都针对“Internet Explorer”(目标列表中的最后一项)运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-18
    • 2013-07-25
    • 1970-01-01
    • 2021-11-08
    • 2012-08-17
    • 1970-01-01
    • 2021-04-23
    相关资源
    最近更新 更多