Переменные окружения и параметризация

Protractor — это инструмент для end-to-end тестирования Angular и не только. Одним из ключевых аспектов гибкой и поддерживаемой автоматизации является использование переменных окружения и параметризация тестов. Эти механизмы позволяют запускать одни и те же тесты в разных средах, с различными конфигурациями и данными, без необходимости менять код тестов.


1. Переменные окружения

Переменные окружения — это значения, которые задаются на уровне операционной системы или процесса Node.js и доступны во время выполнения теста. Они позволяют конфигурировать тесты динамически.

Основные способы использования:
  1. Через Node.js process.env
exports.config = {
    seleniumAddress: 'http://localhost:4444/wd/hub',
    specs: ['spec.js'],
    baseUrl: process.env.TEST_BASE_URL || 'http://localhost:4200'
};

В этом примере process.env.TEST_BASE_URL позволяет указать адрес тестируемого приложения извне. Если переменная окружения не установлена, используется значение по умолчанию.

  1. Через командную строку с параметром –params
TEST_BASE_URL=http://staging.example.com protractor conf.js

В тестах доступ к этим переменным можно получить через объект browser.params:

browser.get(browser.params.baseUrl || 'http://localhost:4200');

2. Использование параметров Protractor

Protractor имеет встроенный механизм параметров в конфигурационном файле conf.js:

exports.config = {
    params: {
        login: {
            username: 'user1',
            password: 'secret'
        },
        env: 'staging'
    },
    specs: ['spec.js']
};

В тестах параметры доступны через browser.params:

it('должен авторизоваться', async () => {
    await element(by.id('username')).sendKeys(browser.params.login.username);
    await element(by.id('password')).sendKeys(browser.params.login.password);
    await element(by.id('loginBtn')).click();
});

Преимущества использования browser.params:

  • Централизованная настройка тестов.
  • Возможность переопределения через командную строку:
protractor conf.js --params.login.username=admin --params.env=production

3. Переменные окружения и конфигурации для разных сред

Для тестирования на разных окружениях удобно создавать отдельные конфигурационные файлы или использовать условную логику:

let env = process.env.TEST_ENV || 'dev';

let config = {
    dev: {
        baseUrl: 'http://localhost:4200',
        login: { username: 'dev', password: 'dev123' }
    },
    staging: {
        baseUrl: 'http://staging.example.com',
        login: { username: 'staging', password: 'stage123' }
    },
    prod: {
        baseUrl: 'https://example.com',
        login: { username: 'admin', password: 'admin123' }
    }
};

exports.config = {
    baseUrl: config[env].baseUrl,
    params: {
        login: config[env].login
    },
    specs: ['spec.js']
};

Запуск тестов в нужной среде:

TEST_ENV=staging protractor conf.js

Такой подход полностью отделяет тестовые данные и конфигурации от логики тестов, повышает гибкость и облегчает поддержку.


4. Параметризация тестов

Параметризация позволяет запускать один тест с разными данными. Protractor не имеет встроенного механизма data-driven тестирования, но его легко реализовать с использованием массивов и forEach:

const users = [
    { username: 'user1', password: 'pass1' },
    { username: 'user2', password: 'pass2' },
    { username: 'user3', password: 'pass3' }
];

users.forEach(user => {
    it(`должен авторизоваться пользователем ${user.username}`, async () => {
        await browser.get(browser.params.baseUrl);
        await element(by.id('username')).sendKeys(user.username);
        await element(by.id('password')).sendKeys(user.password);
        await element(by.id('loginBtn')).click();
        expect(await element(by.id('welcome')).getText()).toContain(user.username);
    });
});

Параметризация в сочетании с переменными окружения позволяет легко тестировать разные сценарии на разных средах.


5. Использование внешних файлов данных

Для больших проектов удобно хранить тестовые данные в JSON или JS-файлах и загружать их динамически:

const testData = require(`./data/${process.env.TEST_ENV || 'dev'}.json`);

it('тест с внешними данными', async () => {
    await browser.get(testData.baseUrl);
    await element(by.id('username')).sendKeys(testData.login.username);
    await element(by.id('password')).sendKeys(testData.login.password);
    await element(by.id('loginBtn')).click();
    expect(await element(by.id('welcome')).getText()).toContain(testData.login.username);
});

Такой подход обеспечивает максимальную масштабируемость и отделение данных от логики тестов.


6. Совмещение всех методов

В реальных проектах часто используют комбинацию:

  • Переменные окружения для определения среды (TEST_ENV).
  • browser.params для передачи конфигураций и учетных данных.
  • Внешние файлы JSON для хранения тестовых данных.
  • Массивы для параметризации конкретных сценариев.

Это позволяет поддерживать гибкую, расширяемую и легко модифицируемую систему тестирования.


Использование переменных окружения и параметризации является фундаментом для написания профессиональных Protractor-тестов. Такой подход снижает количество дублирующего кода, упрощает поддержку тестов и делает процесс тестирования максимально адаптируемым к различным средам и сценариям.