2015-05-30 9 views
2

Мы используем 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 в мой тестовый пакет, чтобы я мог запускать несколько тестовых наборов параллельно с разными целевыми значениями?

Я могу заставить его работать, если я запускаю все тесты синхронно, но это занимает гораздо больше времени, чем я хочу. Единственное, что препятствует параллелизму, - это тот факт, что я не могу передать инкапсулированные значения в мой пакет мокко.

ответ

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

Здесь используется Обещания, потому что gulp может принять их в качестве результата задачи и будет ждать, пока испытания не будут завершены во всех браузерах.

Также вы можете добавить здесь синтаксический сахар, например denodeify, чтобы сделать работу с exec немного короче.

+0

Знаете ли вы, почему я получаю ошибку 'command not detected: mocha' с этим? Я могу запустить mocha из командной строки просто отлично, но когда он пытается запустить из этого дочернего процесса, он не может найти команду. – Chev

+0

Это означает, что у вас нет глобального 'mocha'. Обновлен ответ, теперь он ищет в папке 'node_modules' –

+0

А, но у меня есть глобальное мокко, и я также уже пытался указать локальный путь. В нем говорится, что такого файла нет, хотя, когда я перемещаюсь туда вручную, он есть. Я даже попробовал 'path.join (__ dirname, 'node_modules', '.bin', 'mocha')'. Это определенно там, но почему-то детский процесс не находит его. У меня определенно есть глобальное мокко, и я могу запустить его вручную просто отлично. – Chev

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

Это похоже на ту же проблему. Все тесты выполняются против «Internet explorer» (последний элемент в целевом списке). – Chev