Наша команда начала использовать транспортир для всего сквозного тестирования 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 в различных режимах, которые у вас могут быть. Спасибо!