Как запустить тесты Protractor e2e с различными переменными среды (Angular 6) - PullRequest
0 голосов
/ 26 сентября 2018

В тесте e2e я хочу, чтобы переменная окружения была такой же, как в приложении Angular.Похоже, сборщик тестовых проектов e2e "builder": "@angular-devkit/build-angular:protractor" не не поддерживает замену файлов (в отличие от компоновщика для веб-приложения):

"fileReplacements": [{
  "replace": "apps/web/src/environments/environment.ts",
  "with": "apps/web/src/environments/environment.prod.ts"
}]

Поэтому с помощью команды Angular CLI ng e2e я могу переключать конфигурации (или проекты в angular.json) и в конфигурации проекта я могу указать различные файлы конфигурации Protractor protractor.conf.js.Мой вопрос: как я могу получить в e2e test любую переменную, которая будет отличаться в файлах конфигурации или любом другом файле, аналогично environment.ts файлам в приложении?

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Итак, я использовал protractor.conf.js для переменных среды.Основное преимущество - нет необходимости использовать какую-либо стороннюю библиотеку.
1. Создайте файл конфигурации Protractor для каждой среды.В params укажите ваши переменные:

'protractor.conf.js'
...
  params: {
    postDeploy: false,
    credentials: {
      username: 'Test',
      password: 'Password'
    },
...

Второй конфигурационный файл Protractor может использовать первый по умолчанию и содержать только переопределения (чтобы избежать дублирования в конфигах):

'protractor-dev.conf.js'

const defaultConfig = require('./protractor.conf');
let devConfig = {
  params: {
    postDeploy: true,
    credentials: {
      username: 'DevTest',
      password: 'DevPassword'
    }
  }
};
exports.config = Object.assign(defaultConfig.config, devConfig);
Используйте configurations in angular.json для проекта e2e:
...
    "myproject-e2e": {
      "root": "",
      "sourceRoot": "",
      "projectType": "application",
      "architect": {
        "e2e": {
          "builder": "@angular-devkit/build-angular:protractor",
          "options": {
            "protractorConfig": "apps/myproject-e2e/protractor.conf.js",
            "devServerTarget": "myproject:serve"
          },
          <b>"configurations":</b> {
            <b>"dev"</b>: {
              "protractorConfig": "apps/myproject-e2e/<b>protractor-dev.conf.js</b>",
              "devServerTarget": "",
              "baseUrl": "https://mywebsite.com"
            },
Переключение конфигураций в командной строке с использованием -c или --configuration параметра
ng e2e myproject-e2e -c dev

Вы также можете перезаписать некоторые параметры в командной строке:

ng e2e myproject-e2e -c dev --baseUrl=https://mywebsite1.com

4,И, наконец, в самих тестах e2e вы можете использовать любой параметр из конфигурации:

browser.params.postDeploy
browser.params.credentials.username
0 голосов
/ 26 сентября 2018

В моем ответе есть несколько частей, поэтому я постараюсь сделать их краткими, насколько смогу.

Для переменных среды я использую пакет с именем node-env-run.Вы можете найти это здесь .Это действительно легко установить и позволяет вам изменять переменные окружения на лету для локального разработчика.Вы просто устанавливаете файл .env в каталоге, из которого выполняете команды, со списком пар ключ / значение.Затем вы запускаете свой скрипт следующим образом:

nodenv --exec "ng e2e"

Nodenv подберет переменные в этом файле и создаст переменные среды для текущего тестового прогона.Все они отбрасываются в конце сеанса.Это прекрасно работает для местного разработчика.Оттуда я просто устанавливаю переменные окружения в своем инструменте сборки, используя те же имена переменных env, что и мой файл .env.Затем я ссылаюсь на них в моем params объекте в конфигурации транспортира.Хорошим примером может служить что-то вроде учетных данных базы данных, которые могут отличаться в зависимости от среды, в которой вы выполняете тесты.

params: {
    sql: {
        host: process.env.DB_HOST,
        dbname: process.env.DB_NAME,
        user: process.env.SQL_SERVER_USER,
        password: process.env.SQL_SERVER_PASSWORD
    }
}

Во второй части вашего вопроса, как реализовать различные конфигурационные файлы, я просто использую Object.assign(defaultConf, environmentConf), чтобы выполнить это.Свойства в environmentConf заменят те же свойства в defaultConf.

Я обычно устанавливаю конфигурацию по умолчанию, которая содержит все свойства, которые будут общими для всех конфигов.В конфигах среды я размещаю только свойства, уникальные для каждой среды.Примером будет baseUrl.Вот пример того, что я имею в виду.

Конфигурация по умолчанию

module.exports = {
    allScriptsTimeout: 11000, // Timeout of each script
    specs: [
      '../specs/**/*.ts'
    ],
    capabilities: {
      browserName: 'chrome',
      acceptInsecureCerts : true,
      chromeOptions: {
        args: [
          '--start-maximized'
        ],
        prefs: {
          download: {
            prompt_for_download: false,
            default_directory: path.resolve(__dirname, '../downloads/')
          }
        }
      }
    },
    framework: 'jasmine', 
    jasmineNodeOpts: {
      showColors: true,
      defaultTimeoutInterval: 30000,
      print: function() {}
    },
    SELENIUM_PROMISE_MANAGER: false,
    onPrepare: function() {
        // ...
    },
    params: { // params object... },
    suites: { // suites listed here... }
}

Local Dev Config

module.exports = {
    baseUrl: 'http://localhost:8082',
    directConnect: true
}

QA Environment Config

module.exports = {
    baseUrl: 'https://my-app:7443',
    seleniumAddress: 'http://hub:4444/wd/hub',
    jasmineNodeOpts: {
        showColors: true,
        defaultTimeoutInterval: 60000,
        print: function() {}
    }
}

Как вы можете видеть, я использую directConnect для локального разработчика, но концентратор селена, как только приложение было развернуто в заданной среде.То, как я обращаюсь с этим с помощью транспортира, я передаю в командной строке флаг --params.env=localhost.Затем в конфигурации транспортира я получаю значение этого аргумента и выбираю, как выглядит конфигурация, основываясь на этом.Учитывая приведенные выше примеры, это будет выглядеть примерно так.

Из командной строки я бы запустил нечто подобное этому nodenv --exec "ng e2e -- --params.env=localhost" или nodenv --exec "protractor conf.js --params.env=release".И вот как будет выглядеть файл conf.js:

const env = process.argv.filter(arg => {
  return arg.includes('--params.env');
})[0];

let isLocal = false;
let isRelease = false;

if (env) {
  isLocal = env.includes('localhost');  
  isRelease = env.includes('release');
}

const defaultConf = require('./default.conf');
const localConf = require('./local.conf');
const qaEnvConf = require('./qa.conf');
const releaseConf = require('./release.conf');

let protractorConf = {};

// run tests against localhost
if (isLocal) {
  protractorConf = Object.assign(defaultConf, localConf);
}

if (isRelease) {
  protractorConf = Object.assign(defaultConf, releaseConf);
}

if(!isLocal && !isRelease) {
    protractorConf = Object.assign(defaultConf, qaEnvConf);
}

exports.config = protractorConf;

Я уверен, что могут быть более эффективные способы сделать это, но, делая это таким образом, я могу использовать разные конфиги без необходимости установки другого 3-гопартийная зависимость.Кроме того, если вы хотите использовать конфигурацию выпуска, но выполнять тесты в промежуточной или рабочей среде, это просто.Просто введите baseUrl из командной строки, и он перезапишет все, что есть в конфигурации.nodenv --exec "ng e2e -- --baseUrl=https://my-url/ --params.env=release"

...