繁体   English   中英

如何使用不同的环境变量运行Protractor e2e测试(Angular 6)

[英]How to run Protractor e2e tests with different environment variables (Angular 6)

在e2e测试中,我希望环境变量与Angular app中的环境变量类似。 貌似E2E测试项目建设者"builder": "@angular-devkit/build-angular:protractor" 支持文件替换(不像建造者为Web应用程序):

"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测试中获得配置文件或任何其他文件中不同的变量,类似于应用程序中的environment.ts文件?

所以我最后使用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);
  1. angular.json使用configurations为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"
          },
          "configurations": {
            "dev": {
              "protractorConfig": "apps/myproject-e2e/protractor-dev.conf.js",
              "devServerTarget": "",
              "baseUrl": "https://mywebsite.com"
            },
  1. 使用-c--configuration参数在命令行中切换配置
ng e2e myproject-e2e -c dev

您还可以在命令行中覆盖一些参数:

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

4.最后在e2e测试中,你可以使用config中的任何参数:

browser.params.postDeploy
browser.params.credentials.username

我的答案有几个部分,所以我会尽量保持简短。

对于环境变量,我使用名为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... }
}

本地开发配置

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

QA环境配置

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

正如您所看到的那样,一旦将应用程序部署到给定环境,我就会将directConnect用于本地开发人员,而是使用selenium hub。 我使用量角器处理这个问题的方法是传入一个命令行标志--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;

我确信可能有更好的方法来实现这一点,但这样做可以让我使用不同的配置,而无需安装另一个第三方依赖。 此外,如果您想使用发布配置但是对staging或prod环境运行测试,这很简单。 只需从命令行传入baseUrl ,它就会覆盖配置中的任何内容。 nodenv --exec "ng e2e -- --baseUrl=https://my-url/ --params.env=release"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM