В моем ответе есть несколько частей, поэтому я постараюсь сделать их краткими, насколько смогу.
Для переменных среды я использую пакет с именем 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"