Наша команда начала использовать транспортир для всего сквозного тестирования Angular и не-Angular приложений. Это было здорово! Мне особенно нравится, что SauceLabs запускает наши тесты параллельно, и мы получаем потрясающую скорость: 500 тестов за 10 минут, в 2 браузерах. Но какова оптимальная конфигурация?

Мы используем gulp и хотим запустить из него транспортир. Также мы хотим иметь разные «режимы» его запуска:

  • в лабораториях соусов: используя корпоративный туннель или только что созданный локальный туннель,
  • на локальном: в хроме или на симуляторе iOS (с appium)

Часть режимы хорошо сделана с использованием yargs:

var argv = require('yargs')
    .options({
        mode: {
            choices: ['saucelabs-omni-tunnel', 'saucelabs-local-tunnel', 'local-chrome', 'local-ios'],
            describe: 'runs the tests in specified mode: sauce labs (2 choices of tunnel) or local (2 choices of browsers)',
            default: 'saucelabs-omni-tunnel'
        },
        focused: {
            type: 'boolean',
            describe: 'runs each test unsharded for debugging',
            default: false
        }
    })
    .argv;

Также мы хотим запустить тесты в нескольких браузерах в лаборатории соусов и в одном локальном. Мы достигаем этого с помощью фильтрации списка браузеров с помощью lodash:

//filter for local browser
if (_.startsWith(argv.mode, 'local')) {
    capabilities = _.filter(capabilities, function (cap) {
        if (argv.mode === 'local-chrome') {
            return cap.browserName === 'chrome';
        } else {
            return cap.browserName === 'Safari' && cap.platformName === 'iOS';
        }
    });

    if (argv.mode === 'local-ios') {
        config.seleniumAddress = 'http://localhost:4723/wd/hub';
    }
}

Также мы динамически генерируем список критических или некритических спецификаций на основе существующего имени набора в конфигурационном файле транспортира (если он содержит ::critical):

//base-config.js
suites: {
    full: '../specs/**/*.spec.js',

    'homepage::critical': '../specs/homepage/*.spec.js',
    'server-errors': '../specs/US205-server-errors/*.spec.js',
...

логика фильтрации

var criticalSuite = _.filter(config.suites, function (suitePath, suiteName) {
    return _.filter(['::critical'], function (criticalSuiteFlag) {
        return _.contains(suiteName, criticalSuiteFlag);
    }).length;
});

var nonCriticalSuite = _.filter(config.suites, function (suitePath, suiteName) {
    return !_.contains(criticalSuite, suitePath) && suiteName !== 'full';
});

Используя эти фрагменты, вы можете получить представление о том, как настроить Protractor для бесперебойной работы с gulp в различных режимах, которые у вас могут быть. Спасибо!