Каков наилучший способ управления различными конфигурациями в транспортире? - PullRequest
0 голосов
/ 30 января 2019

У нас есть проект E2E, написанный на Angular CLI 6 и Protractor.В настоящее время мы управляем нашими конфигурациями в angular.json:

 "configurations": {
            "local_chrome": {
              "protractorConfig": "./protractor.local.conf.js"
            },
            "remote_dev_chrome": {
              "protractorConfig": "./protractor.remote.dev.chrome.conf.js"
            },
            "remote_qsa_chrome": {
              "protractorConfig": "./protractor.remote.qsa.chrome.conf.js"
            },

В package.json мы определяем скрипты:

"e2e:local": "ng e2e --configuration=local_chrome --webdriver-update=false",
"e2e:dev:chrome": "ng e2e --configuration=remote_dev_chrome --webdriver-update=false",
"e2e:qsa:chrome": "ng e2e --configuration=remote_qsa_chrome --webdriver-update=false",

И поэтому мы запускаем наши тесты из командной строки:

npm run e2e:qsa:chrome -- --base-url=https://aut.com --suite=szenarioTests

Мы хотим протестировать 4 браузера и 5 сред.Это означает, что нам нужно 5 * 4 = 20 файлов конфигурации.И эти файлы на 90% идентичны.Это немного чудовищно и не поддается обслуживанию.

Кто-нибудь знает, как мы можем минимизировать количество файлов конфигурации и дублирования?Есть ли рекомендации по настройке E2E в Angular CLI?А может, транспортир с Angular CLI не подходит для больших проектов?

Ответы [ 3 ]

0 голосов
/ 31 января 2019

Я сделал что-то похожее на пример Бена, за исключением того, что вместо расширения я использовал Object.assign() для создания своих конфигов.

Создайте конфигурацию по умолчанию, в которой есть все, что будет разделено между конфигурациями.Тогда в каждый из других конфигов включайте только то, что будет отличаться между конфигурациями.Любые повторяющиеся поля будут перезаписаны вторым аргументом в Object.assign()

Например, когда я запускаю тесты в локальной среде разработчика, моя локальная конфигурация выглядит так:

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

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

// build.conf.js
module.exports = {
  baseUrl: 'https://app:7443',
  seleniumAddress: 'http://hub:4444/wd/hub',
  jasmineNodeOpts: {
    showColors: true,
    defaultTimeoutInterval: 30000,
    print: function() {}
  }
}

Моя конфигурация по умолчанию (общая) не включает directConnect или seleniumAddressтак как они не могут быть вместе в одном конфиге.Эти значения поступают из других файлов конфигурации.Используя приведенные выше примеры в качестве ссылки, ваша базовая конфигурация будет выглядеть примерно так:

const defaultConf = require('/path/to/dafault.conf');
const localConf = require('/path/to/local.conf');
const remoteDevChrome = require('/path/to/remote_dev_chrome.conf');
const remoteQsaChrome = require('/path/to/remote_qsa_chrome.conf');

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

let protractorConf = {};

switch (configuration.split('=')[1]) {
    case 'local_chrome':
        protractorConf = Object.assign(defaultConf, localConf);
    case 'remote_dev_chrome':
        protractorConf = Object.assign(defaultConf, remoteDevChrome);
    case 'remote_gsa_chrome':
        // ... and so on ...
    default:
       // whatever default config you use
}

exports.config = protractorConf;

При этом вам больше не нужно иметь несколько скриптов в package.json.Вы можете просто использовать один скрипт, и конфигурация будет основана на том, что вы передали для --configuration

0 голосов
/ 09 февраля 2019

Мы решили не использовать угловой cli для испытаний E2E.В результате мы можем настроить наши тесты из командной строки, и у нас нет дубликатов в файле конфигурации (простота сопровождения).В нашем решении мы устанавливаем множество параметров для командной строки (браузер, среда, уровень ведения журнала, удаленный или локальный).Наша реализация похожа на одно решение.У нас есть один базовый файл конфигурации и один скрипт, который читает аргументы командной строки и устанавливает соответствующую конфигурацию.
Для этого мы используем

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

, а затем мы используем простой if, чтобы установить конфигурацию.Для каждого параметра у нас также есть значения по умолчанию.

0 голосов
/ 30 января 2019

Я не уверен, как минимизировать общее количество файлов.Тем не менее, у вас может быть 1 файл conf_shared, который расширяет все остальные ваши confs, что облегчит поддержку в случае изменений.

Пример conf.js

import {ConfigShared} from "./conf_shared";
let specs = ["YourSpecsHere"];
let capabilities = {browserName:'chrome',...};

class ConfigLocal extends ConfigShared{
  specs = specs;
  capabilities = capabilities;
}
export const config = new ConfigLocal().exampleFunction(); //can call functions in conf_shared

Пример conf_shared

import {Config} from 'protractor';

export class ConfigShared implements Config{
  specs: ['']; //will get overriden by conf.js
  framework: 'jasmine2';
  //rest of shared config goes here

  //you can also make function that you will call from conf.js
  exampleFunction(){
    //do stuff here
  }
}

Все, что вы поделились между confфайлы могут быть помещены в файл conf_shared, который поможет с ремонтопригодностью.Если это материал, который используется только определенными тестами, вы можете поместить его в функции (сделать так, чтобы функции изменили conf), а затем вызвать функции из conf.js

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...